{"id":53885,"date":"2016-03-16T07:00:48","date_gmt":"2016-03-16T05:00:48","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=53885"},"modified":"2016-12-27T13:47:07","modified_gmt":"2016-12-27T11:47:07","slug":"why-springboot","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html","title":{"rendered":"Why SpringBoot?"},"content":{"rendered":"<p>lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which focuses on only one area, Spring framework provides a wide verity of features addressing the modern business needs via its portfolio projects.<\/p>\n<p>Spring framework provides flexibility to configure the beans in multiple ways such as <b>XML<\/b>,<b> Annotations <\/b>and <b>JavaConfig<\/b>. With the number of features increased the complexity also gets increased and configuring Spring applications becomes tedious and error-prone.<\/p>\n<p>Spring team created SpringBoot to address the complexity of configuration. But before diving into SpringBoot, we will take a quick look at Spring framework and see what kind of problems SpringBoot is trying to address.<\/p>\n<p><b>In this article we will cover: <\/b><\/p>\n<ul>\n<li>Overview of Spring framework<\/li>\n<li>A web application using Spring MVC and JPA(Hibernate)<\/li>\n<li>A quick taste of SpringBoot<\/li>\n<\/ul>\n<h2>Overview of Spring framework<\/h2>\n<p>If you are a Java developer then there is a high chance that you might have heard about Spring framework and probably have used it in your projects. Spring framework was created primarily as a Dependency Injection container but it is much more than that.<\/p>\n<p><b>Spring is very popular because of several reasons: <\/b><\/p>\n<ul>\n<li>Spring\u2019s dependency injection approach encourages writing testable code<\/li>\n<li>Easy to use but powerful database transaction management capabilities<\/li>\n<li>Spring simplifies integration with other Java frameworks like JPA\/Hibernate ORM, Struts\/JSF etc web frameworks<\/li>\n<li>State of the art Web MVC framework for building web applications<\/li>\n<\/ul>\n<p>Along with Spring framework there are many other Spring sister projects which helps to build applications addressing modern business needs:<\/p>\n<ul>\n<li>Spring Data: Simplifies data access from relational and NoSQL data stores.<\/li>\n<li>Spring Batch: Provides powerful batch processing framework.<\/li>\n<li>Spring Security: Robust security framework to secure applications.<\/li>\n<li>Spring Social: Supports integration with social networking sites like Facebook, Twitter, LinkedIn, GitHub etc.<\/li>\n<li>Spring Integration: An implementation of Enterprise Integration Patterns to facilitate integration with other enterprise applications using lightweight messaging and declarative adapters.<\/li>\n<\/ul>\n<p>There are many other interesting projects addressing various other modern application development needs. For more information take a look at <a href=\"http:\/\/spring.io\/projects\">http:\/\/spring.io\/projects<\/a>.<\/p>\n<p>In the initial days, Spring framework provides XML based approach for configuring beans. Later Spring introduced XML based DSLs, Annotations and JavaConfig based approaches for configuring beans.<\/p>\n<p>Let us take a quick look at how each of those configuration styles looks like.<\/p>\n<p><b>XML based configuration <\/b><\/p>\n<pre class=\" brush:xml\">&lt;bean id=\"userService\" class=\"com.sivalabs.myapp.service.UserService\"&gt;\r\n    &lt;property name=\"userDao\" ref=\"userDao\"\/&gt;\r\n&lt;\/bean&gt;\r\n\r\n&lt;bean id=\"userDao\" class=\"com.sivalabs.myapp.dao.JdbcUserDao\"&gt;\r\n    &lt;property name=\"dataSource\" ref=\"dataSource\"\/&gt;\r\n&lt;\/bean&gt;\r\n\r\n&lt;bean id=\"dataSource\" class=\"org.apache.commons.dbcp.BasicDataSource\" destroy-method=\"close\"&gt;\r\n    &lt;property name=\"driverClassName\" value=\"com.mysql.jdbc.Driver\"\/&gt;\r\n    &lt;property name=\"url\" value=\"jdbc:mysql:\/\/localhost:3306\/test\"\/&gt;\r\n    &lt;property name=\"username\" value=\"root\"\/&gt;\r\n    &lt;property name=\"password\" value=\"secret\"\/&gt;\r\n&lt;\/bean&gt;<\/pre>\n<p><b>Annotation based configuration <\/b><\/p>\n<pre class=\" brush:java\">@Service\r\npublic class UserService\r\n{\r\n    private UserDao userDao;\r\n\r\n    @Autowired\r\n    public UserService(UserDao dao){\r\n        this.userDao = dao;\r\n    }\r\n    ...\r\n    ...\r\n}<\/pre>\n<pre class=\" brush:java\">@Repository\r\npublic class JdbcUserDao\r\n{\r\n    private DataSource dataSource;\r\n\r\n    @Autowired\r\n    public JdbcUserDao(DataSource dataSource){\r\n        this.dataSource = dataSource;\r\n    }\r\n    ...\r\n    ...\r\n}<\/pre>\n<p><b>JavaConfig based configuration <\/b><\/p>\n<pre class=\" brush:java\">@Configuration\r\npublic class AppConfig\r\n{\r\n    @Bean\r\n    public UserService userService(UserDao dao){\r\n        return new UserService(dao);\r\n    }\r\n\r\n    @Bean\r\n    public UserDao userDao(DataSource dataSource){\r\n        return new JdbcUserDao(dataSource);\r\n    }\r\n\r\n    @Bean\r\n    public DataSource dataSource(){\r\n        BasicDataSource dataSource = new BasicDataSource();\r\n        dataSource.setDriverClassName(\"com.mysql.jdbc.Driver\");\r\n        dataSource.setUrl(\"jdbc:mysql:\/\/localhost:3306\/test\");\r\n        dataSource.setUsername(\"root\");\r\n        dataSource.setPassword(\"secret\");\r\n        return dataSource;\r\n    }\r\n}<\/pre>\n<p>Wow\u2026 Spring provides many approaches for doing the same thing and we can even mix the approaches as well like you can use both JavaConfig and Annotation based configuration styles in the same application.<\/p>\n<blockquote>\n<p>That is a lot of flexibility and it is one way good and one way bad. People new to Spring framework may gets confused<br \/>\nabout which approach to follow. As of now the Spring team is suggesting to follow JavaConfig based approach as it gives more flexibility.<\/p>\n<\/blockquote>\n<p>But there is no one-size fits all kind of solution. One has to choose the approach based on their own application needs.<\/p>\n<p>OK, now that you had a glimpse of how various styles of Spring bean configurations looks like.<\/p>\n<p>Let us take a quick look at the configuration of a typical SpringMVC + JPA\/Hibernate web application configuration looks like.<\/p>\n<h2>A web application using Spring MVC and JPA(Hibernate)<\/h2>\n<p>Before getting to know what is SpringBoot and what kind of features it provides, let us take a look at how a typical Spring web application configuration looks like, what are the pain points and then we will discuss about how SpringBoot addresses those problems.<\/p>\n<p><b>Step 1: Configure Maven Dependencies <\/b><\/p>\n<p>First thing we need to do is configure all the dependencies required in our <b>pom.xml<\/b>.<\/p>\n<pre class=\" brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" \r\n    xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n    xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 \r\n                        http:\/\/maven.apache.org\/maven-v4_0_0.xsd\"&gt;\r\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n    &lt;groupId&gt;com.sivalabs&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;springmvc-jpa-demo&lt;\/artifactId&gt;\r\n    &lt;packaging&gt;war&lt;\/packaging&gt;\r\n    &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\r\n    &lt;name&gt;springmvc-jpa-demo&lt;\/name&gt;\r\n\r\n    &lt;properties&gt;\r\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\r\n        &lt;maven.compiler.source&gt;1.8&lt;\/maven.compiler.source&gt;\r\n        &lt;maven.compiler.target&gt;1.8&lt;\/maven.compiler.target&gt;      \r\n        &lt;failOnMissingWebXml&gt;false&lt;\/failOnMissingWebXml&gt;\r\n    &lt;\/properties&gt;\r\n\r\n    &lt;dependencies&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-webmvc&lt;\/artifactId&gt;\r\n            &lt;version&gt;4.2.4.RELEASE&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.data&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-data-jpa&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.9.2.RELEASE&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;jcl-over-slf4j&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.7.13&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;slf4j-api&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.7.13&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;slf4j-log4j12&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.7.13&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;log4j&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;log4j&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.2.17&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;com.h2database&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;h2&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.4.190&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;commons-dbcp&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;commons-dbcp&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.4&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;mysql&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\r\n            &lt;version&gt;5.1.38&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.hibernate&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;hibernate-entitymanager&lt;\/artifactId&gt;\r\n            &lt;version&gt;4.3.11.Final&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;javax.servlet&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;javax.servlet-api&lt;\/artifactId&gt;\r\n            &lt;version&gt;3.1.0&lt;\/version&gt;\r\n            &lt;scope&gt;provided&lt;\/scope&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.thymeleaf&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;thymeleaf-spring4&lt;\/artifactId&gt;\r\n            &lt;version&gt;2.1.4.RELEASE&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n    &lt;\/dependencies&gt;\r\n&lt;\/project&gt;<\/pre>\n<p>We have configured all our Maven jar dependencies to include Spring MVC, Spring Data JPA, JPA\/Hibernate, Thymeleaf and Log4j.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><b>Step 2: Configure Service\/DAO layer beans using JavaConfig. <\/b><\/p>\n<pre class=\" brush:java\">@Configuration\r\n@EnableTransactionManagement\r\n@EnableJpaRepositories(basePackages=\"com.sivalabs.demo\")\r\n@PropertySource(value = { \"classpath:application.properties\" })\r\npublic class AppConfig \r\n{\r\n    @Autowired\r\n    private Environment env;\r\n\r\n    @Bean\r\n    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer()\r\n    {\r\n        return new PropertySourcesPlaceholderConfigurer();\r\n    }\r\n    \r\n    @Value(\"${init-db:false}\")\r\n    private String initDatabase;\r\n    \r\n    @Bean\r\n    public PlatformTransactionManager transactionManager()\r\n    {\r\n        EntityManagerFactory factory = entityManagerFactory().getObject();\r\n        return new JpaTransactionManager(factory);\r\n    }\r\n\r\n    @Bean\r\n    public LocalContainerEntityManagerFactoryBean entityManagerFactory()\r\n    {\r\n        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();\r\n\r\n        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();\r\n        vendorAdapter.setGenerateDdl(Boolean.TRUE);\r\n        vendorAdapter.setShowSql(Boolean.TRUE);\r\n\r\n        factory.setDataSource(dataSource());\r\n        factory.setJpaVendorAdapter(vendorAdapter);\r\n        factory.setPackagesToScan(\"com.sivalabs.demo\");\r\n\r\n        Properties jpaProperties = new Properties();\r\n        jpaProperties.put(\"hibernate.hbm2ddl.auto\", env.getProperty(\"hibernate.hbm2ddl.auto\"));\r\n        factory.setJpaProperties(jpaProperties);\r\n\r\n        factory.afterPropertiesSet();\r\n        factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());\r\n        return factory;\r\n    }\r\n\r\n    @Bean\r\n    public HibernateExceptionTranslator hibernateExceptionTranslator()\r\n    {\r\n        return new HibernateExceptionTranslator();\r\n    }\r\n    \r\n    @Bean\r\n    public DataSource dataSource()\r\n    {\r\n        BasicDataSource dataSource = new BasicDataSource();\r\n        dataSource.setDriverClassName(env.getProperty(\"jdbc.driverClassName\"));\r\n        dataSource.setUrl(env.getProperty(\"jdbc.url\"));\r\n        dataSource.setUsername(env.getProperty(\"jdbc.username\"));\r\n        dataSource.setPassword(env.getProperty(\"jdbc.password\"));\r\n        return dataSource;\r\n    }\r\n    \r\n    @Bean\r\n    public DataSourceInitializer dataSourceInitializer(DataSource dataSource) \r\n    {\r\n        DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();\r\n        dataSourceInitializer.setDataSource(dataSource);\r\n        ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();\r\n        databasePopulator.addScript(new ClassPathResource(\"data.sql\"));\r\n        dataSourceInitializer.setDatabasePopulator(databasePopulator);\r\n        dataSourceInitializer.setEnabled(Boolean.parseBoolean(initDatabase));\r\n        return dataSourceInitializer;\r\n    }   \r\n}<\/pre>\n<p>In our AppConfig.java configuration class we have done the following:<\/p>\n<ul>\n<li>Marked it as as a Spring Configuration class using <b>@Configuration<\/b> annotation.<\/li>\n<li>Enabled Annotation based transaction management using <b>@EnableTransactionManagement<\/b><\/li>\n<li>Configured <b>@EnableJpaRepositories<\/b> to indicate where to look for Spring Data JPA repositories<\/li>\n<li>Configured PropertyPlaceHolder bean using <b>@PropertySource<\/b> annotation and <b>PropertySourcesPlaceholderConfigurer <\/b>bean definition which loads properties from <b>application.properties<\/b> file.<\/li>\n<li>Defined beans for <b>DataSource<\/b>, JPA <b>EntityManagerFactory<\/b>, <b>JpaTransactionManager<\/b>.<\/li>\n<li>Configured <b>DataSourceInitializer <\/b>bean to initialize the database by executing <b>data.sql<\/b> script on application start up.<\/li>\n<\/ul>\n<p>we need to configure property placeholder values in <b>application.properties<\/b> as follows:<\/p>\n<pre class=\" brush:java\">jdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql:\/\/localhost:3306\/test\r\njdbc.username=root\r\njdbc.password=admin\r\ninit-db=true\r\nhibernate.dialect=org.hibernate.dialect.MySQLDialect\r\nhibernate.show_sql=true\r\nhibernate.hbm2ddl.auto=update<\/pre>\n<p>we can create a simple sql script <b>data.sql<\/b> to populate sample data into <b>USER <\/b>table.<\/p>\n<pre class=\" brush:java\">delete from user;\r\ninsert into user(id, name) values(1,'Siva');\r\ninsert into user(id, name) values(2,'Prasad');\r\ninsert into user(id, name) values(3,'Reddy');<\/pre>\n<p>We can create <b>log4j.properties<\/b> file with basic configuration as follows:<\/p>\n<pre class=\" brush:java\">log4j.rootCategory=INFO, stdout\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%5p %t %c{2}:%L - %m%n\r\n\r\nlog4j.category.org.springframework=INFO\r\nlog4j.category.com.sivalabs=DEBUG<\/pre>\n<p><b>Step 3: Configure Spring MVC web layer beans <\/b><\/p>\n<p>We will have to configure Thymeleaf <b>ViewResolver<\/b>, static <b>ResourceHandlers<\/b>, <b>MessageSource <\/b>for i18n etc.<\/p>\n<pre class=\" brush:java\">@Configuration\r\n@ComponentScan(basePackages = { \"com.sivalabs.demo\"}) \r\n@EnableWebMvc\r\npublic class WebMvcConfig extends WebMvcConfigurerAdapter\r\n{\r\n    @Bean\r\n    public TemplateResolver templateResolver() {\r\n        TemplateResolver templateResolver = new ServletContextTemplateResolver();\r\n        templateResolver.setPrefix(\"\/WEB-INF\/views\/\");\r\n        templateResolver.setSuffix(\".html\");\r\n        templateResolver.setTemplateMode(\"HTML5\");\r\n        templateResolver.setCacheable(false);\r\n        return templateResolver;\r\n    }\r\n\r\n    @Bean\r\n    public SpringTemplateEngine templateEngine() {\r\n        SpringTemplateEngine templateEngine = new SpringTemplateEngine();\r\n        templateEngine.setTemplateResolver(templateResolver());\r\n        return templateEngine;\r\n    }\r\n\r\n    @Bean\r\n    public ThymeleafViewResolver viewResolver() {\r\n        ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();\r\n        thymeleafViewResolver.setTemplateEngine(templateEngine());\r\n        thymeleafViewResolver.setCharacterEncoding(\"UTF-8\");\r\n        return thymeleafViewResolver;\r\n    }\r\n\r\n    @Override\r\n    public void addResourceHandlers(ResourceHandlerRegistry registry)\r\n    {\r\n        registry.addResourceHandler(\"\/resources\/**\").addResourceLocations(\"\/resources\/\");\r\n    }\r\n\r\n    @Override\r\n    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)\r\n    {\r\n        configurer.enable();\r\n    }\r\n\r\n    @Bean(name = \"messageSource\")\r\n    public MessageSource configureMessageSource()\r\n    {\r\n        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();\r\n        messageSource.setBasename(\"classpath:messages\");\r\n        messageSource.setCacheSeconds(5);\r\n        messageSource.setDefaultEncoding(\"UTF-8\");\r\n        return messageSource;\r\n    }\r\n}<\/pre>\n<p>In our <b>WebMvcConfig.java<\/b> configuration class we have done the following:<\/p>\n<ul>\n<li>Marked it as as a Spring Configuration class using <b>@Configuration<\/b> annotation.<\/li>\n<li>Enabled Annotation based Spring MVC configuration using <b>@EnableWebMvc<\/b><\/li>\n<li>Configured Thymeleaf ViewResolver by registering <b>TemplateResolver<\/b>, <b>SpringTemplateEngine<\/b>, <b>ThymeleafViewResolver <\/b>beans.<\/li>\n<li>Registered ResourceHandlers bean to indicate requests for static resources with URI <b>\/resources\/**<\/b> will be served from the location<b> \/resources\/<\/b> directory.<\/li>\n<li>Configured <b>MessageSource <\/b>bean to load i18n messages from ResourceBundle <b>messages-{country-code}.properties<\/b> from classpath.<\/li>\n<\/ul>\n<p>For now we do not have any messages to be configured, so create an empty <b>messages.properties<\/b> file in <b>src\/main\/resources<\/b> folder.<\/p>\n<p><b>Step 4: Register Spring MVC FrontController servlet DispatcherServlet. <\/b><\/p>\n<p>Prior to Servlet 3.x specification we have to register Servlets\/Filters in <b>web.xml<\/b>. Since Servlet 3.x specification we can register Servlets\/Filters programatically using <b>ServletContainerInitializer<\/b>.<\/p>\n<p>Spring MVC provides a convenient class <b>AbstractAnnotationConfigDispatcherServletInitializer <\/b>to register <b>DispatcherServlet<\/b>.<\/p>\n<pre class=\" brush:java\">public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer\r\n{\r\n\r\n    @Override\r\n    protected Class&lt;?&gt;[] getRootConfigClasses()\r\n    {\r\n        return new Class&lt;?&gt;[] { AppConfig.class};\r\n    }\r\n\r\n    @Override\r\n    protected Class&lt;?&gt;[] getServletConfigClasses()\r\n    {\r\n        return new Class&lt;?&gt;[] { WebMvcConfig.class };\r\n    }\r\n\r\n    @Override\r\n    protected String[] getServletMappings()\r\n    {\r\n        return new String[] { \"\/\" };\r\n    }\r\n\r\n    @Override\r\n    protected Filter[] getServletFilters() {\r\n       return new Filter[]{ new OpenEntityManagerInViewFilter() };\r\n    }\r\n}<\/pre>\n<p>In our <b>SpringWebAppInitializer.java <\/b>configuration class we have done the following:<\/p>\n<ul>\n<li>We have configured <b>AppConfig.class<\/b> as <b>RootConfirationClasses <\/b>which will become the parent <b>ApplicationContext <\/b>that contains bean definitions shared by all child (<b>DispatcherServlet<\/b>) contexts.<\/li>\n<li>We have configured <b>WebMvcConfig.class<\/b> as <b>ServletConfigClasses <\/b>which is child <b>ApplicationContext <\/b>that contains WebMvc bean definitions.<\/li>\n<li>We have configured <b>\u201d\/\u201d<\/b> as <b>ServletMapping <\/b>means all the requests will be handled by <b>DispatcherServlet<\/b>.<\/li>\n<li>We have registered <b>OpenEntityManagerInViewFilter <\/b>as a Servlet Filter so that we can lazy load the JPA Entity lazy collections while rendering the view.<\/li>\n<\/ul>\n<p><b>Step 5: Create a JPA Entity and Spring Data JPA Repository <\/b><\/p>\n<p>Create a JPA entity <b>User.java<\/b> and a Spring Data JPA repository for User entity.<\/p>\n<pre class=\" brush:java\">@Entity\r\npublic class User\r\n{\r\n    @Id @GeneratedValue(strategy=GenerationType.AUTO)\r\n    private Integer id;\r\n    private String name;\r\n\r\n    \/\/setters and getters\r\n}<\/pre>\n<pre class=\" brush:java\">public interface UserRepository extends JpaRepository&lt;User, Integer&gt;\r\n{\r\n}<\/pre>\n<p><b>Step 6: Create a SpringMVC Controller <\/b><\/p>\n<p>Create a SpringMVC controller to handle URL<b> \u201c\/\u201d <\/b>and render list of users.<\/p>\n<pre class=\" brush:java\">@Controller\r\npublic class HomeController\r\n{\r\n    @Autowired UserRepository userRepo;\r\n\r\n    @RequestMapping(\"\/\")\r\n    public String home(Model model)\r\n    {\r\n        model.addAttribute(\"users\", userRepo.findAll());\r\n        return \"index\";\r\n    }\r\n}<\/pre>\n<p><b>Step 7: Create a thymeleaf view \/WEB-INF\/views\/index.html to render list of Users. <\/b><\/p>\n<pre class=\" brush:xml\">&lt;!DOCTYPE html&gt;\r\n&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" \r\n      xmlns:th=\"http:\/\/www.thymeleaf.org\"&gt;\r\n&lt;head&gt;\r\n&lt;meta charset=\"utf-8\"\/&gt;\r\n&lt;title&gt;Home&lt;\/title&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n    &lt;table&gt;\r\n        &lt;thead&gt;\r\n            &lt;tr&gt;\r\n                &lt;th&gt;Id&lt;\/th&gt;\r\n                &lt;th&gt;Name&lt;\/th&gt;\r\n            &lt;\/tr&gt;\r\n        &lt;\/thead&gt;\r\n        &lt;tbody&gt;\r\n            &lt;tr th:each=\"user : ${users}\"&gt;\r\n                &lt;td th:text=\"${user.id}\"&gt;Id&lt;\/td&gt;\r\n                &lt;td th:text=\"${user.name}\"&gt;Name&lt;\/td&gt;\r\n            &lt;\/tr&gt;\r\n        &lt;\/tbody&gt;\r\n    &lt;\/table&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>We are all set now to run the application. But before that we need to download and configure the server like <b>Tomcat <\/b>or<b>Jetty  <\/b>or <b>Wildfly <\/b>etc in your IDE.<\/p>\n<p>You can download Tomcat 8 and configure in your favourite IDE,run the application and point your browser to <b>http:\/\/localhost:8080\/springmvcjpa-demo<\/b>. You should see the list of users details in a table. Yay\u2026We did it.<\/p>\n<p><b>But wait..Isn\u2019t it too much work to just show a list of user details pulled from a database table? Let us be honest and fair. All this configuration is not just for this one use-case. This configuration is basis for rest of the application also.<br \/>\n<\/b><br \/>\n<b>But again, this is too much of work to do if you want to quickly get up and running. Another problem with it is, assume you want to develop another SpringMVC application with similar technical stack?<br \/>\n<\/b><br \/>\n<b>Well, you copy-paste the configuration and tweak it. Right? But remember one thing: if you have to do the same thing again and again, you should find an automated way to do it.<\/b><\/p>\n<p>Apart from writing the same configuration again and again, do you see any other problems here?<\/p>\n<p><b>Well, let me list our what are the problems I am seeing here. <\/b><\/p>\n<ul>\n<li>You need to hunt for all the <b>compatible libraries<\/b> for the specific Spring version and configure them.<\/li>\n<li>95% of the times we configure the <b>DataSource<\/b>, <b>EntitymanagerFactory<\/b>, <b>TransactionManager <\/b>etc beans in the same way. Wouldn\u2019t it be great if Spring can do it for me automatically.<\/li>\n<li>Similarly we configure SpringMVC beans like <b>ViewResolver<\/b>, <b>MessageSource <\/b>etc in the same way most of the times.<\/li>\n<\/ul>\n<blockquote>\n<p>If Spring can automatically do it for me that would be awesome!!!.<\/p>\n<\/blockquote>\n<p>Imagine, what if Spring is capable of configuring beans automatically? What if you can customize the automatic configuration using simple customizable properties?<\/p>\n<p>For example, instead of mapping DispatcherServlet url-pattern to \u201c\/\u201d you want to map it to \u201c\/app\/\u201d. Instead of putting thymeleaf views in \u201c\/WEB-INF\/views\u201d folder you may want to place them in \u201c\/WEB-INF\/templates\/\u201d folder.<\/p>\n<p>So basically you want Spring to do things automatically but provide the flexibility to override the default configuration in a simpler way?<\/p>\n<p>Well, you are about to enter into the world of SpringBoot where your dreams come true!!!<\/p>\n<h2>A quick taste of SpringBoot<\/h2>\n<p>Welcome to SpringBoot!. SpringBoot do what exactly you are looking for. It will do things automatically for you but allows you to override the defaults if you want to.<\/p>\n<p>Instead of explaining in theory I prefer to explain by example.<\/p>\n<p>So let us implement the same application that we built earlier but this time using SpringBoot.<\/p>\n<p><b>Step 1: Create a Maven based SpringBoot Project <\/b><\/p>\n<p>Create a Maven project and configure the dependencies as follows:<\/p>\n<pre class=\" brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" \r\n        xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n        xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 \r\n                        http:\/\/maven.apache.org\/maven-v4_0_0.xsd\"&gt;\r\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n    &lt;groupId&gt;com.sivalabs&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;hello-springboot&lt;\/artifactId&gt;\r\n    &lt;packaging&gt;jar&lt;\/packaging&gt;\r\n    &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\r\n    &lt;name&gt;hello-springboot&lt;\/name&gt;\r\n\r\n    &lt;parent&gt;\r\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n        &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\r\n        &lt;version&gt;1.3.2.RELEASE&lt;\/version&gt;\r\n    &lt;\/parent&gt;\r\n\r\n    &lt;properties&gt;\r\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\r\n        &lt;java.version&gt;1.8&lt;\/java.version&gt;\r\n    &lt;\/properties&gt;\r\n\r\n    \r\n    &lt;dependencies&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;spring-boot-devtools&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;mysql&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\r\n        &lt;\/dependency&gt;\r\n    &lt;\/dependencies&gt;\r\n&lt;\/project&gt;<\/pre>\n<p>Wow our <b>pom.xml<\/b> suddenly become so small!!.<\/p>\n<p><b>Step 2: Configure datasource\/JPA properties in application.properties as follows. <\/b><\/p>\n<pre class=\" brush:java\">spring.datasource.driver-class-name=com.mysql.jdbc.Driver\r\nspring.datasource.url=jdbc:mysql:\/\/localhost:3306\/test\r\nspring.datasource.username=root\r\nspring.datasource.password=admin\r\nspring.datasource.initialize=true\r\nspring.jpa.hibernate.ddl-auto=update\r\nspring.jpa.show-sql=true<\/pre>\n<p>you can copy the same <b>data.sql<\/b> file into <b>src\/main\/resources<\/b> folder.<\/p>\n<p><b>Step 3: Create a JPA Entity and Spring Data JPA Repository Interface for the entity. <\/b><\/p>\n<p>Create <b>User.java, UserRepository.java<\/b> and <b>HomeController.java<\/b> same as in <b>springmvc-jpa-demo<\/b> application.<\/p>\n<p><b>Step 4: Create Thymeleaf view to show list of users <\/b><\/p>\n<p>Copy <b>\/WEB-INF\/views\/index.html<\/b> that we created in <b>springmvc-jpa-demo<\/b> application into <b>src\/-main\/resources\/templates<\/b> folder in our new project.<\/p>\n<p><b>Step 5: Create SpringBoot EntryPoint Class. <\/b><\/p>\n<p>Create a Java class <b>Application.java<\/b> with main method as follows:<\/p>\n<pre class=\" brush:java\">@SpringBootApplication\r\npublic class Application\r\n{\r\n    public static void main(String[] args)\r\n    {\r\n        SpringApplication.run(Application.class, args);\r\n    }\r\n}<\/pre>\n<p>Now run <b>Application.java <\/b>as a Java Application and point your browser to <b>http:\/\/localhost:8080\/<\/b>. You should see the list of users in table format. Coool!!!<\/p>\n<p>Ok ok, I hear you are shouting \u201cWhat is going on???\u201d.<\/p>\n<p>Let me explain what just happened.<\/p>\n<p><b>1. Easy dependency Management <\/b><\/p>\n<ul>\n<li>First thing to observe is we are using some dependencies named like <b>spring-boot-starter-*<\/b>.<br \/>\nRemember I said \u201c95% of the times I use same configuration\u201d. So when you add <b>springboot-starter-web <\/b>dependency by default it will pull all the commonly used libraries while developing Spring MVC applications such as <b>spring-webmvc, jackson-json, validation-api <\/b>and <b>tomcat<\/b>.<\/li>\n<li>We have added <b>spring-boot-starter-data-jpa <\/b>dependency. This pulls all the <b>spring-data-jpa<\/b> dependencies and also adds <b>Hibernate <\/b>libraries because majority of the applications use Hibernate as JPA implementation.<\/li>\n<\/ul>\n<p><b>2. Auto Configuration <\/b><\/p>\n<ul>\n<li>Not only the <b>spring-boot-starter-web<\/b> adds all these libraries but also configures the commonly registered beans like <b>DispatcherServlet, ResourceHandlers, MessageSource <\/b>etc beans with sensible defaults.<\/li>\n<li>We also added <b>spring-boot-starter-thymeleaf <\/b>which not only adds the thymeleaf library dependencies but also configures <b>ThymeleafViewResolver<\/b> beans as well automatically.<\/li>\n<li>We haven\u2019t defined any of the <b>DataSource, EntityManagerFactory, TransactionManager <\/b>etc beans but they are automatically gets created. How?If we have any in-memory database drivers like <b>H2 <\/b>or <b>HSQL <\/b>in our classpath then SpringBoot will automatically creates an in-memory <b>DataSource<\/b> and then registers <b>EntityManagerFactory, TransactionManager <\/b>beans automatically with sensible defaults.But we are using MySQL, so we need to explicitly provide MySQL connection details. We have configured those MySQL connection details in <b>application.properties<\/b> file and SpringBoot creates a <b>DataSource<\/b> using these properties.<\/li>\n<\/ul>\n<p><b>3. Embedded Servlet Container Support<\/b><\/p>\n<p>The most important and surprising thing is we have created a simple Java class annotated with some magical annotation<br \/>\n<b>@SpringApplication <\/b>having a main method and by running that main we are able to run the application and access it at<br \/>\n<b>http:\/\/localhost:8080\/<\/b>.<\/p>\n<p><b>Where is the servlet container comes from? <\/b><\/p>\n<p>We have added <b>spring-boot-starter-web<\/b> which pull the <b>spring-boot-starter-tomcat<\/b> automatically and when we run the main() method it started tomcat as an <b>embedded container <\/b>so that we don\u2019t have to deploy our application on any externally installed tomcat server.<\/p>\n<p>By the way have you observe that our packaging type in <b>pom.xml<\/b> is <b>\u2018jar\u2019 not \u2018war\u2019<\/b>. Wonderful!<\/p>\n<p><b>Ok, but what if I want to use Jetty server instead of tomcat? <\/b><\/p>\n<p>Simple, exclude <b>spring-bootstarter-tomcat<\/b> from <b>spring-boot-starter-web<\/b> and include <b>spring-boot-starter-jetty<\/b>.<\/p>\n<p>That\u2019s it. But, this looks all magical!!!<\/p>\n<p>I can imagine what you are thinking. You are thinking like SpringBoot looks cool and it is doing lot of things automatically for me. But still I am not fully understand how it is all really working behind the scenes. Right?<\/p>\n<p>I can understand. Watching magic show is fun normally, but not in Software Development. Don\u2019t worry, we will be looking at each of those things and explain in-detail how things are happening behind the scenes in future articles. But I don\u2019t want to overwhelm you by dumping everything on to your hear right now in this article.<\/p>\n<h2>Summary<\/h2>\n<p>In this article we had a quick overview of various Spring configuration styles and understand the complexity of configuring Spring applications. Also, we had a quick look at SpringBoot by creating a simple web application. In next article we will deep dive into SpringBoot and understand how it works.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/www.sivalabs.in\/2016\/03\/why-springboot.html\">Why SpringBoot?<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/join-us\/jcg\/\">JCG partner<\/a> Siva Reddy at the <a href=\"http:\/\/www.sivalabs.in\/\">My Experiments on Technology<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which focuses on only one area, Spring framework provides a wide verity of features addressing the modern business needs via its portfolio projects. Spring framework provides flexibility to configure the beans in multiple ways &hellip;<\/p>\n","protected":false},"author":15,"featured_media":240,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[30,854],"class_list":["post-53885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-spring","tag-spring-boot"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Why SpringBoot? - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Why SpringBoot? - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-16T05:00:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-12-27T11:47:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Siva Reddy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/sivalabs\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Siva Reddy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html\"},\"author\":{\"name\":\"Siva Reddy\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c4bc16742c140e793e22fe73a1b6f488\"},\"headline\":\"Why SpringBoot?\",\"datePublished\":\"2016-03-16T05:00:48+00:00\",\"dateModified\":\"2016-12-27T11:47:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html\"},\"wordCount\":2185,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"keywords\":[\"Spring\",\"Spring Boot\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html\",\"name\":\"Why SpringBoot? - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"datePublished\":\"2016-03-16T05:00:48+00:00\",\"dateModified\":\"2016-12-27T11:47:07+00:00\",\"description\":\"lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"spring-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/03\\\/why-springboot.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Why SpringBoot?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/c4bc16742c140e793e22fe73a1b6f488\",\"name\":\"Siva Reddy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/57171cbc9a028e211086675fa890ef348d8da6113ee2e16e74aadad2261d21c8?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/57171cbc9a028e211086675fa890ef348d8da6113ee2e16e74aadad2261d21c8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/57171cbc9a028e211086675fa890ef348d8da6113ee2e16e74aadad2261d21c8?s=96&d=mm&r=g\",\"caption\":\"Siva Reddy\"},\"description\":\"Katamreddy Siva Prasad is a Senior Software Engineer working in E-Commerce domain. His areas of interest include Object Oriented Design, SOLID Design principles, RESTful WebServices and OpenSource softwares including Spring, MyBatis and Jenkins.\",\"sameAs\":[\"http:\\\/\\\/sivalabs.blogspot.com\\\/\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/sivalabs\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/siva-reddy\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Why SpringBoot? - Java Code Geeks","description":"lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html","og_locale":"en_US","og_type":"article","og_title":"Why SpringBoot? - Java Code Geeks","og_description":"lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which","og_url":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2016-03-16T05:00:48+00:00","article_modified_time":"2016-12-27T11:47:07+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","type":"image\/jpeg"}],"author":"Siva Reddy","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/sivalabs","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Siva Reddy","Est. reading time":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html"},"author":{"name":"Siva Reddy","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c4bc16742c140e793e22fe73a1b6f488"},"headline":"Why SpringBoot?","datePublished":"2016-03-16T05:00:48+00:00","dateModified":"2016-12-27T11:47:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html"},"wordCount":2185,"commentCount":4,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","keywords":["Spring","Spring Boot"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html","url":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html","name":"Why SpringBoot? - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","datePublished":"2016-03-16T05:00:48+00:00","dateModified":"2016-12-27T11:47:07+00:00","description":"lication using Spring MSpring is a very popular Java based framework for building web and enterprise applications. Unlike many other frameworks which","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","width":150,"height":150,"caption":"spring-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2016\/03\/why-springboot.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Why SpringBoot?"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/c4bc16742c140e793e22fe73a1b6f488","name":"Siva Reddy","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/57171cbc9a028e211086675fa890ef348d8da6113ee2e16e74aadad2261d21c8?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/57171cbc9a028e211086675fa890ef348d8da6113ee2e16e74aadad2261d21c8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/57171cbc9a028e211086675fa890ef348d8da6113ee2e16e74aadad2261d21c8?s=96&d=mm&r=g","caption":"Siva Reddy"},"description":"Katamreddy Siva Prasad is a Senior Software Engineer working in E-Commerce domain. His areas of interest include Object Oriented Design, SOLID Design principles, RESTful WebServices and OpenSource softwares including Spring, MyBatis and Jenkins.","sameAs":["http:\/\/sivalabs.blogspot.com\/","https:\/\/x.com\/http:\/\/twitter.com\/sivalabs"],"url":"https:\/\/www.javacodegeeks.com\/author\/siva-reddy"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/53885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=53885"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/53885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/240"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=53885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=53885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=53885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}