從Servlet技術到Spring和Spring MVC,開發Web應用變得愈來愈簡捷。可是Spring和Spring MVC的衆多配置有時卻讓人望而卻步,相信有過Spring MVC開發經驗的朋友能深入體會到這一痛苦。由於即便是開發一個Hello-World的Web應用,都須要咱們在pom文件中導入各類依賴,編寫web.xml、spring.xml、springmvc.xml配置文件等。特別是須要導入大量的jar包依賴時,咱們須要在網上查找各類jar包資源,各個jar間可能存在着各類依賴關係,這時候又得下載其依賴的jar包,有時候jar包間還存在着嚴格的版本要求,,因此當咱們只是想開發一個Hello-World的超簡單的Web應用時,卻把極大部分的時間在花在了編寫配置文件和導入jar包依賴上,極大地影響了咱們的開發效率。因此爲了簡化Spring繁雜的配置,Spring Boot應運而生。正如Spring Boot的名稱同樣,一鍵啓動,Spring Boot提供了自動配置功能,爲咱們提供了開箱即用的功能,使咱們將重心放在業務邏輯的開發上。那麼Spring Boot又是怎麼簡化Spring MVC的呢?Spring Boot和Spring、Spring MVC間又是怎樣的關係呢?Spring Boot又有什麼新特色呢?接下來,讓咱們走進Spring MVC 到Spring Boot的簡化之路,或許你就能找到這些答案。前端
沒有依賴注入的例子:java
@RestController public class WelcomeController { private WelcomeService service = new WelcomeService(); @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } WelcomeService service = new WelcomeService(); 意味着WelcomeController類與WelcomeService類緊密結合在一塊兒,耦合度高。
使用依賴注入的例子:web
@Component public class WelcomeService { //Bla Bla Bla } @RestController public class WelcomeController { @Autowired private WelcomeService service; @RequestMapping("/welcome") public String welcome() { return service.retrieveWelcomeMessage(); } } 依賴注入使世界看起來更簡單,咱們讓Spring 框架作了辛勤的工做: @Component:咱們告訴Spring框架-嘿,這是一個你須要管理的bean @Autowired:咱們告訴Spring框架-嘿,找到這個特定類型的正確匹配並自動裝入它
1. 重複代碼
Spring框架中止了依賴注入(DI)嗎?沒有,它在依賴注入(DI)的核心概念上開發了許多Spring模塊:spring
2. 與其餘框架良好的集成
Spring框架並不嘗試去解決已經解決了的問題,它所作的一切就是提供與提供出色解決方案的框架的完美集成。sql
基於Spring的應用程序有不少配置。當咱們使用Spring MVC時,咱們須要配置組件掃描,調度器servlet,視圖解析器等:數據庫
視圖解析器配置: <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <mvc:resources mapping="/webjars/**" location="/webjars/"/> 前端調度器的典型配置: <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/todo-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 當咱們使用Hibernate / JPA時,咱們須要配置一個數據源,一個實體管理器工廠,一個事務管理器以及許多其餘事物: <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${db.driver}" /> <property name="jdbcUrl" value="${db.url}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean> <jdbc:initialize-database data-source="dataSource"> <jdbc:script location="classpath:config/schema.sql" /> <jdbc:script location="classpath:config/data.sql" /> </jdbc:initialize-database> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="hsql_pu" /> <property name="dataSource" ref="dataSource" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
Spring Boot解決的問題緩存
1. Spring Boot 自動配置
Spring引入了新的思惟過程:咱們能夠變得更加智能些嗎?當一個spring mvc jar包被添加到應用程序時,咱們是否能夠自動配置一些bean?服務器
2. Spring Boot Starter Projects
假設咱們想開發一個Web應用程序。首先,咱們須要肯定咱們想要使用的框架,使用哪一個版本的框架以及如何將它們鏈接在一塊兒。全部Web應用程序都有相似的需求 下面列出的是咱們在Spring MVC中使用的一些依賴關係。這些包括Spring MVC,Jackson Databind(用於數據綁定),Hibernate-Validator(用於使用Java驗證API的服務器端驗證)和Log4j(用於日誌記錄)。在建立時,咱們必須選擇全部這些框架的兼容版本:mvc
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.2.RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.2.Final</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
Starter是一套方便的依賴描述符,能夠包含在應用程序中。 你能夠得到所需的全部Spring及相關技術的一站式服務,而無需搜索示例代碼並複製依賴描述符的粘貼負載。 例如,若是你想開始使用Spring和JPA來訪問數據庫,只需在你的項目中包含spring-boot-starter-data-jpa依賴項就好。
咱們來看Starter的一個示例 - Spring-Boot-Starter-Webapp
Spring-Boot-Starter-Web依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
如下屏幕截圖顯示了添加到咱們的應用程序中的不一樣依賴關係:
任何典型的Web應用程序都會使用全部這些依賴項.Spring Boot Starter Web預先打包了這些。做爲開發人員,咱們不須要擔憂這些依賴關係或兼容版本。
3. Spring Boot Starter項目選項
正如Spring Boot Starter Web同樣,Starter項目幫助咱們快速入門開發特定類型的應用程序:
前面已經初步介紹過,在這裏詳細介紹一下。
當咱們啓動Spring Boot應用程序時,咱們能夠在日誌中看到一些重要的消息。
Mapping servlet: 'dispatcherServlet' to [/] Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
上面的日誌語句顯示了Spring Boot Auto Configuration的行爲。
一當咱們在應用中添加了Spring Boot Starter Web依賴,Spring Boot AutoConfiguration就會發現Spring MVC在類路徑下,它會自動配置dispatcherServlet,一個默認的錯誤頁面和webjars。
若是你添加了Spring Boot DataJPA Starter依賴,Spring Boot AutoConfiguration會自動配置數據源(datasource)和實體管理器(Entity Manager)
全部的自動配置邏輯都在spring-boot-autoconfigure.jar中實現。mvc、data和其餘框架的全部自動配置邏輯都存在與一個jar包中。
spring-boot-autoconfigure.jar中重要的文件是/META-INF/spring.factories,該文件;列出了在EnableAutoConfiguration key下啓動的全部自動配置類。下面列出一些重要的配置類:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
打開調試日誌
在application.properties打開調試日誌:
logging.level.org.springframework: DEBUG
當啓動程序時,會打印自動配置日誌信息
Spring Boot的出現自己就是爲了減低Web開發的門檻,使開發人員可以專一於業務開發,而不需浪費時間在業務開發以外,至此Spring MVC到Spring Boot的簡化之路到此結束。
做者:Beyondlcg 連接:https://juejin.im/post/5aa22d1f51882555677e2492 來源:掘金 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。