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

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

1. 主要內容

經過本講的內容,你能夠找到下面幾個問題的具體答案:html

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

2. 爲何須要自動化配置

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

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

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

上述的配置能夠稱得上是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包下,提供了以下的一些自動化配置源碼:app

如何你想了解更多關於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
  3. 爲項目添加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包下的條件註解來完成的,這裏列舉幾個經常使用的條件註解解:

  1. @ConditionalOnBean:當容器中有指定的Bean的條件下
  2. @ConditionalOnClass:當類路徑下有指定的類的條件下
  3. @ConditionalOnMissingBean: 當容器中沒有指定Bean的狀況下
  4. @ConditionalOnMissingClass: 當類路徑下沒有指定的類的條件下

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

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

7.結束語

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

做者:譚朝紅
連接:(第四講)Spring Boot 自動化配置原理解析來源:譚朝紅的技術分享博客著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索