本講著重介紹Spring Boot的核心技術原理—自動化配置(AutoConfiguration)。通過對Spring Boot自動化配置相關原始碼的梳理,一步步揭開Spring Boot自動化配置的神祕面紗。
1. 主要內容
通過本講的內容,你可以找到下面幾個問題的具體答案:
- 什麼是自動化配置?
- 為什麼需要自動化配置?
- 自動化配置是如何實現的?
- 如何除錯自動化配置?
2. 為什麼需要自動化配置
在常規的Spring應用程式中,充斥著大量的配置檔案,我們需要手動去配置這些檔案,如配置元件掃描、配置servlet、配置檢視解析器,配置http編碼等。這裡以配置http編碼為例,我們需要在web.xml檔案中配置類似的一個filter:
下面的這段程式碼向我們展示了配置一個Servlet的經典寫法:
如果我們的專案中使用Hibernate/JPA時 ,我們還需要配置諸如資料來源、Bean工廠和事務管理器等。
上述的配置可以稱得上是Spring應用程式的經典案例,但現在看起來,你是否覺得心累?常規的配置讓開發人員將更多的經歷耗費在了配置檔案上。而這些配置都是一些固定模式的配置方式,甚至很多都是模板程式碼,那既然是這樣一種情況,有沒有一種可能性,讓Spring自動完成這些模板配置工作呢?答案是肯定的,這就是Spring Boot AutoConfiguration產生的初衷。將開發人員從繁重的配置工作中解放出來,而這些繁瑣的配置細節交由Spring Boot去完成,如果我們需要提供自己的配置引數,只需要覆蓋自動配置的引數即可。現在是否覺得有點意思了?
3. Spring Boot自動化配置的核心原理
Spring Boot有關自動化配置的原始碼可以在spring-boot-autoconfigure-2.x.x.x.jar/spring-boot-autoconfigure-1.x.x.x.jar包中找到。在org.springframework.boot.autoconfigure包下,提供瞭如下的一些自動化配置原始碼:
如何你想了解更多關於Spring Boot自動配置的知識,可以在這裡檢視具體的原始碼。
在spring-boot-autoconfigure.jar包中還有一份重要的檔案,它是Spring Boot實施自動配置的關鍵所在。該檔案是/META-INFO/spring.factories。此檔案列出了所有可以被Spring Boot實施自動配置的模組清單,下面列舉其中的一部分以供參考:
4. 除錯自動配置
有三種方式可以除錯並檢視有關自動配置的相關資訊,如當前專案中有哪些元件被自動配置,有哪些元件未被自動配置以及產生的原因等。
-
通過java -jar [jarfile] --debug的方式執行專案,可以觀察自動化配置的相關資訊。
-
開啟專案的除錯日誌記錄。在application.properties檔案中為org.springframework包新增日誌記錄級別為DEBUG :
logging.level.org.springframework:DEBUG 複製程式碼
-
為專案新增spring-boot-starter-actuator和spring-data-rest-hal-browser兩個依賴:
使用方式一和方式二時,當我們重新啟動應用程式時,你可以在控制檯找到一份自動配置的報告,這份報告包含了被自動配置的元件資訊和未被自動配置的元件資訊以及相關的說明。
如果採用第三種方式,重新啟動專案後,在瀏覽器位址列輸入http://localhost:8080/actuator/#http://localhost:8080/autoconfig ,你將收到如下的資訊:
5 Spring Boot自動配置的核心原理
在Spring Boot應用程式中,所有的運作都起源於@SpringBootApplication註解,@SpringBootApplication開啟了執行程式的大門。該註解是一個組合註解,其核心功能是由@EnableAutoConfiguration註解提供的。現在先讓我們看一下@SpringBootApplication和@EnableAutoConfiguration註解的原始碼。
在SpringBootApplication註解類中,最核心的地方是上圖1處的**@EnableAutoConfiguration**註解,它為@SpringBootApplication註解類貢獻了大部分的功能。我們再看看@Enableautoconfiguration註解的原始碼:
這裡最關鍵的地方是由@Import註解匯入的自動配置功能,EnableConfigurationImportSelector通過SpringFactoriesLoader.loadFactoryNames()方法來掃描spring-boot-autoconfigure.jar檔案下/META-INF/spring.factories檔案中配置的jar包資訊,這就是一開始提到的那一份spring.factories檔案的重要性。我們可以看一下EnableConfigurationImportSelector類中對應的程式碼:
6. 一個自動配置的示例分析
org.springframework.boot.autoconfigure包下已經提供了很多的自動配置類,接下來我們以DataSourceAutoConfiguration為例子,看看其中配置的細節。通常,所有自動配置類都會檢視類路徑中可用的其他類。如果類路徑中有特定的類,則通過自動配置啟用該功能的配置。判斷類路徑上是否存在特定的東西,這是通過org.springframework.boot.autoconfigure.condition包下的條件註解來完成的,這裡列舉幾個常用的條件註解解:
- @ConditionalOnBean:當容器中有指定的Bean的條件下
- @ConditionalOnClass:當類路徑下有指定的類的條件下
- @ConditionalOnMissingBean: 當容器中沒有指定Bean的情況下
- @ConditionalOnMissingClass: 當類路徑下沒有指定的類的條件下
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
:僅當類路徑中有這些類時,才會啟用此配置。
@ConditionalOnMissingBean
:僅當沒有其他bean配置相同名稱時才配置此Bean。
7.結束語
通過以上內容,簡單的梳理了Spring Boot 自動配置的大致原理,同時回答了一開始提出的4個問題。Spring Boot的出現,是為了提高我們的開發效率,我們需要去了解其核心的基本原理,但任何時候都不應該被一個框架或者技術所綁架,更為重要的是學習其基本的原理,而不是框架本身。基於這個出發點,在下一講中,將實現一個自定義的Spring Boot Starter,並提供自動化配置的能力。那本次內容到這裡就結束了,謝謝~~