(第四講)Spring Boot 自動化配置原理解析

本講著重介紹Spring Boot的核心技術原理—自動化配置(AutoConfiguration)。通過對Spring Boot自動化配置相關源碼的梳理,一步步揭開Spring Boot自動化配置的神秘面紗。

1. 主要內容

通過本講的內容,你可以找到下面幾個問題的具體答案:

  1. 什麼是自動化配置?
  2. 為什麼需要自動化配置?
  3. 自動化配置是如何實現的?
  4. 如何調試自動化配置?

2. 為什麼需要自動化配置

在常規的Spring應用程序中,充斥著大量的配置文件,我們需要手動去配置這些文件,如配置組件掃描、配置servlet、配置視圖解析器,配置http編碼等。這裡以配置http編碼為例,我們需要在web.xml文件中配置類似的一個filter:

(第四講)Spring Boot 自動化配置原理解析

下面的這段代碼向我們展示了配置一個Servlet的經典寫法:

(第四講)Spring Boot 自動化配置原理解析

如果我們的項目中使用Hibernate/JPA時 ,我們還需要配置諸如數據源、Bean工廠和事務管理器等。

(第四講)Spring Boot 自動化配置原理解析

上述的配置可以稱得上是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自動配置的知識,可以在這裡查看具體的源碼。

在spring-boot-autoconfigure.jar包中還有一份重要的文件,它是Spring Boot實施自動配置的關鍵所在。該文件是/META-INFO/spring.factories。此文件列出了所有可以被Spring Boot實施自動配置的模塊清單,下面列舉其中的一部分以供參考:

(第四講)Spring Boot 自動化配置原理解析

4. 調試自動配置

有三種方式可以調試並查看有關自動配置的相關信息,如當前項目中有哪些組件被自動配置,有哪些組件未被自動配置以及產生的原因等。

  1. 通過java -jar [jarfile] —debug的方式運行項目,可以觀察自動化配置的相關信息。
  2. 打開項目的調試日誌記錄。在application.properties文件中為org.springframework包添加日誌記錄級別為
    DEBUG :
logging.level.org.springframework:DEBUG
  1. 為項目添加spring-boot-starter-actuator和spring-data-rest-hal-browser兩個依賴:
(第四講)Spring Boot 自動化配置原理解析


使用方式一和方式二時,當我們重新啟動應用程序時,你可以在控制檯找到一份自動配置的報告,這份報告包含了被自動配置的組件信息和未被自動配置的組件信息以及相關的說明。

(第四講)Spring Boot 自動化配置原理解析

如果採用第三種方式,重新啟動項目後,在瀏覽器地址欄輸入http://localhost:8080/actuator/#http://localhost:8080/autoconfig ,你將收到如下的信息:

(第四講)Spring Boot 自動化配置原理解析

(第四講)Spring Boot 自動化配置原理解析

5 Spring Boot自動配置的核心原理

在Spring Boot應用程序中,所有的運作都起源於@SpringBootApplication註解,@SpringBootApplication打開了運行程序的大門。該註解是一個組合註解,其核心功能是由@EnableAutoConfiguration註解提供的。現在先讓我們看一下@SpringBootApplication和@EnableAutoConfiguration註解的源碼。

(第四講)Spring Boot 自動化配置原理解析

在SpringBootApplication註解類中,最核心的地方是上圖1處的@EnableAutoConfiguration註解,它為@SpringBootApplication註解類貢獻了大部分的功能。我們再看看@Enableautoconfiguration註解的源碼:

(第四講)Spring Boot 自動化配置原理解析

這裡最關鍵的地方是由@Import註解導入的自動配置功能,EnableConfigurationImportSelector通過SpringFactoriesLoader.loadFactoryNames()方法來掃描spring-boot-autoconfigure.jar文件下/META-INF/spring.factories文件中配置的jar包信息,這就是一開始提到的那一份spring.factories文件的重要性。我們可以看一下EnableConfigurationImportSelector類中對應的代碼:

(第四講)Spring Boot 自動化配置原理解析

6. 一個自動配置的示例分析

org.springframework.boot.autoconfigure包下已經提供了很多的自動配置類,接下來我們以DataSourceAutoConfiguration為例子,看看其中配置的細節。通常,所有自動配置類都會查看類路徑中可用的其他類。如果類路徑中有特定的類,則通過自動配置啟用該功能的配置。判斷類路徑上是否存在特定的東西,這是通過org.springframework.boot.autoconfigure.condition包下的條件註解來完成的,這裡列舉幾個常用的條件註解解:

  1. @ConditionalOnBean:當容器中有指定的Bean的條件下
  2. @ConditionalOnClass:當類路徑下有指定的類的條件下
  3. @ConditionalOnMissingBean: 當容器中沒有指定Bean的情況下
  4. @ConditionalOnMissingClass: 當類路徑下沒有指定的類的條件下
(第四講)Spring Boot 自動化配置原理解析

@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }):僅當類路徑中有這些類時,才會啟用此配置。

@ConditionalOnMissingBean :僅當沒有其他bean配置相同名稱時才配置此Bean。

7.結束語

通過以上內容,簡單的梳理了Spring Boot 自動配置的大致原理,同時回答了一開始提出的4個問題。Spring Boot的出現,是為了提高我們的開發效率,我們需要去了解其核心的基本原理,但任何時候都不應該被一個框架或者技術所綁架,更為重要的是學習其基本的原理,而不是框架本身。基於這個出發點,在下一講中,將實現一個自定義的Spring Boot Starter,並提供自動化配置的能力。那本次內容到這裡就結束了,謝謝~~

(轉載本站文章請註明作者和出處:譚朝紅-ramostear.com,未經允許請勿做任何商業用途)


分享到:


相關文章: