為什麼使用Spring Boot?

語言: CN / TW / HK

為什麼要使用Spring Boot?

在使用Spring框架進行開發的過程中,需要配置很多Spring框架包的依賴,如spring-core、spring-bean、spring-context等,而這些配置通常都是重複新增的,而且需要做很多框架使用及環境引數的重複配置,如開啟註解、配置日誌等。自動配置:spring boot能夠根據當前類路徑下的類,jar包來自動配置bean,如新增一個spring-boot-starter-web啟動器就能擁有web的功能,無需其他配置、無程式碼生成和XML配置:spring boot配置過程中無程式碼生成,也無XML配置就能完成所有的配置工作,這一切都是藉助於條件註解完成的,這也是spring4.x的核心功能之一。 還有應用監控:spring boot提供一系列端點可以監控服務和應用,做健康檢查

Spring Boot是微服務的框架嗎?

Spring Boot是Spring家族的成員,它是一個全新的框架,它的設計目的是儘可能簡單和快速的開發、執行Spring應用程式,簡化配置。它為開發者快捷的使用Spring及相關開發框架提供了便利,但是它並不是微服務的框架,它只是為微服務框架的使用也提供了很好的腳手架。

image.png

Spring Boot中的Starter是什麼?

Spring Boot中的Starter是一個包含很多依賴描述的集合,只要新增一個Starter,這個Starter裡面約定的依賴都會被新增到專案中,例如程式碼添加了spring-boot-starter-web,執行maven操作就會下載web應用需要的依賴jar。開發者通過使用這些Starter可以快速的搭建開發環境,自動載入所需要的依賴和配置引數屬性。

image.png

使用Spring Boot快速搭建開發環境,是不是需要從無到有手動搭建?

如果想快速搭建專案開發環境,可以通過Spring Initializr[http://start.spring.io/]引導快速構建專案。最近阿里也開源了Aliyun Java Initializr[https://start.aliyun.com/],也可以通過它的引導快速構建Java專案。

Spring Boot中@EnableAutoConfiguration註解有什麼作用?

@EnableAutoConfiguration註解從字面上理解是開啟自動配置,在@EnableAutoConfiguration註解的定義中使用了@Import註解,使用@Import匯入 EnableAutoConfigurationImportSelector.class,作用等同於在Spring的xml檔案中使用匯入,檢視EnableAutoConfigurationImportSelector原始碼會發現它就是用於處理@EnableAutoConfiguration註解的,不過在Spring Boot1.5版本開始被標記為棄用,使用AutoConfigurationImportSelector代替,也就是它的父類,在這個類中將在classpath下jar包中META-INF目錄下搜尋spring.factories檔案,然後在spring.factories檔案中查詢以org.springframework.boot.autoconfigure.EnableAutoConfiguration為key的值,值是一個列表,列表中記錄的是需要進行自動化配置的類會被執行,例如AopAutoConfiguration會自動配置Aop相關配置,使用JDK代理還是CGLIB代理。

那這個自動化配置是如何觸發的?

ConfigurationClassPostProcessor類的postProcessBeanFactory方法中呼叫了ConfigurationClassParser類的parse方法,而ConfigurationClassParser類的parse方法間接呼叫了AutoConfigurationImportSelector類。這個ConfigurationClassPostProcessor實現了BeanDefinitionRegistryPostProcessor介面,而BeanDefinitionRegistryPostProcessor繼承了BeanFactoryPostProcessor介面,熟悉Spring原理的都知道BeanFactoryPostProcessor介面中的postProcessBeanFactory方法會在Spring容器載入bean的定義檔案之後,在bean例項化之前執行,而這一步是由SpringApplication的run方法觸發的,在這個run方法中實現了Spring容器的啟動及初始化。

image.png

有些開發者會在pom.xml中繼承spring-boot-starter-parent,這樣做有什麼好處?

通過繼承的方式可以很方便的進行依賴版本管理,使用預設的依賴版本,當然也可以更改這些依賴的版本號。繼承 spring-boot-starter-parent可以獲取以下預設特性: 預設使用Java1.6進行編譯; 預設程式碼編碼為UTF-8; 新建專案的pom檔案可以省略依賴庫的標籤,例如新增activemq依賴的時候,可以不寫版本號; 恰到好處的資源過濾; 恰到好處的外掛配置,如exec外掛; 恰到好處的對application.properties和application.yml進行篩選。

Spring Boot中如何實現對不同環境的屬性配置檔案的支援?

Spring-Boot支援不同環境的屬性配置檔案切換,通過建立application-{profile}.properties檔案,其中{profile}是具體的環境標識名稱,例如: application-dev.properties用於開發環境,application-test.properties用於測試環境,application-uat.properties用於uat環境。如果要想使用application-dev.properties檔案,則在application.properties檔案中新增spring.profiles.active=dev;如果要想使用application-test.properties檔案,則在application.properties檔案中新增spring.profiles.active=test。

打包部署都手動修改application.properties中spring.profiles.active的值,這個問題如何解決?

一般的做法是在專案路徑下建立以環境標識名稱為名的目錄,然後每個目錄下新增各自環境的application.properties屬性配置,在自動打包部署的時候將對應的application.properties拷貝到classpath下,這樣就實現了配置檔案切換。

Spring Boot會自動載入哪些路徑下的application.properties?

Spring Boot支援從以下位置載入application.properties檔案:當前目錄下的/config子目錄、當前目錄、classpath下的/config包、classpath根路徑。

如果這四個路徑的application.properties檔案中配置了某屬性,最終生效的是哪個檔案裡的?

最終生效的是當前目錄下的/config子目錄下的application.properties中的配置,覆蓋順序是當前目錄下的/config子目錄覆蓋當前目錄,當前目錄覆蓋classpath下的/config包,classpath下的/config包覆蓋classpath根路徑。

@SpringBootApplication註解有什麼作用?

從@SpringBootApplication註解原始碼可以看到它具有@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三個註解的作用。@SpringBootConfiguration註解用於標註Spring應用引導類,在應用啟動的時候這個引導類會被執行;@EnableAutoConfiguration註解用於根據依賴自動開啟一些配置;@ComponentScan註解用於配置哪些基礎包或類被自動掃描。