《深入Spring Boot》第一篇快速入門,本篇主要包含以下5部分内容:
1.Spring Boot是什麼;
2.為什麼要使用Spring Boot;
3.工具準備;
4.快速上手;
5.代碼解析。
1.Spring Boot是什麼
Spring Boot是Spring大家庭的成員,它是一個全新的架構。它的設計目的是盡可能簡單和快速的開發、運作Spring應用程式,簡化配置。
2.為什麼要使用Spring Boot
在使用Spring架構進行開發的過程中,需要配置很多Spring架構包的依賴,如spring-core、spring-bean、spring-context等,而這些配置通常都是重複添加的,而且需要做很多架構使用及環境參數的重複配置,如開啟注解、配置日志等。Spring Boot緻力于弱化這些不必要的操作,提供預設配置,當然這些預設配置是可以按需修改的,快速搭建、開發和運作Spring應用。
3.工具準備
在進行快速上手之前,準備開發工具。
本文内容是基于Spring Boot最新穩定版1.5.10,要安裝JDK7或更高版本;
依賴管理的建構工具,可以安裝Ant、Maven或Gradle,本文使用Maven;
代碼編輯工具推薦使用IntelliJ IDEA。
4.快速上手
下面使用Spring Boot編寫一個Web應用,編寫完成後并運作。
1.在IDEA中建立項目,直接上圖。
2.下圖是建立好的項目目錄結構。
3.打開pom.xml,添加web應用需要的依賴配置,配置如下。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
添加後的pom.xml如圖。
4.使用mvn package指令或IDEA自帶的可視化工具加載依賴,本文使用IDEA自帶的可視化工具,輕按兩下package立即執行依賴加載。
5.在java目錄下建立Example類,編寫代碼,具體代碼如下。
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
6.直接執行Example類中的main方法啟動應用,應用啟動時會使用内嵌的Tomcat伺服器,同時使用預設8080端口對外提供服務。成功啟動後會輸出如下圖的日志資訊。
7.打開浏覽器通路http://localhost:8080/,頁面會顯示Hello World!。
至此,一個簡單的Web應用就編寫完成并可以提供服務。
代碼解析
首先是pom.xml中的配置,繼承spring-boot-starter-parent是快速使用Spring Boot的一種方式,也可以選擇不繼承。Spring Boot中的Starter是一個包含很多依賴描述的集合,隻要添加一個Starter,這個Starter裡面約定的依賴都會被添加到項目中,例如示例代碼添加了spring-boot-starter-web,執行maven操作會下載下傳web應用需要的依賴jar,如下圖。
示例代碼中使用了@RestController、@RequestMapping、@EnableAutoConfiguration和SpringApplication,其中@RestController和@RequestMapping是SpringMVC中的注解,@EnableAutoConfiguration和SpringApplication是Spring Boot中的。
@EnableAutoConfiguration注解從字面上了解是開啟自動配置,有注解就有對應的處理類,先看一下這個注解的定義。
這個注解有兩個屬性,exclude用于标記哪些類不需要被自動配置,excludeName也用于标記哪些類不需要被自動配置,隻不過它存的是類的名稱。從上圖的紅框中可以看到在@EnableAutoConfiguration注解的定義中使用了@Import注解,@Import注解是在Spring3.0添加的,使用@Import導入EnableAutoConfigurationImportSelector.class,作用等同于在Spring的xml檔案中使用導入,檢視EnableAutoConfigurationImportSelector源碼你會發現它就是用于處理@EnableAutoConfiguration注解的,不過在Spring Boot1.5版本開始被标記為棄用,可以使用AutoConfigurationImportSelector代替,也就是它的父類。
進入AutoConfigurationImportSelector類中,重要的方法是selectImports。
執行AnnotationAttributes attributes = getAttributes(annotationMetadata)可以擷取@EnableAutoConfiguration注解中exclude和excludeName屬性值,然後把值封裝在AnnotationAttributes中。
執行List configurations = getCandidateConfigurations(annotationMetadata,attributes),将在classpath下jar包中META-INF目錄下搜尋spring.factories檔案,然後在spring.factories檔案中查找以org.springframework.boot.autoconfigure.EnableAutoConfiguration為key的值,這個值是一個清單,清單如下圖。
接着就是使用exclude和excludeName屬性值排除掉不需要自動配置的類,需要自動化配置的類會被執行,例如AopAutoConfiguration會自動配置Aop相關配置,使用JDK代理還是CGLIB代理。
到這裡,自動配置還沒完成,有一個問題還沒弄明白,就是AutoConfigurationImportSelector類的selectImports方法是在哪裡被觸發的?解決這個問題可以通過斷點調試或IDEA裡的查找調用來擷取調用方,無論哪種方式都可以發現是ConfigurationClassParser類的parse方法間接調用的,在parse方法中完成了需要自動配置類的初始化,進而完成一些預設的配置。那這個parse方法又是在哪被觸發調用的?同樣可以通過上面的任意方法,查找到是ConfigurationClassPostProcessor類的postProcessBeanFactory方法中調用的,而這個ConfigurationClassPostProcessor實作了BeanDefinitionRegistryPostProcessor接口,而BeanDefinitionRegistryPostProcessor繼承了BeanFactoryPostProcessor接口,熟悉Spring原理的都知道BeanFactoryPostProcessor接口中的postProcessBeanFactory方法會在Spring容器加載bean的定義檔案之後,在bean執行個體化之前執行,而這一步是由SpringApplication的run方法觸發的,在這個run方法中實作了Spring容器的啟動及初始化。