spring boot 自動配置代碼解析

springboot 配置

初識Spring Boot時我們就知道,Spring Boot有一個全局配置文件:application.properties或application.yml。
我們的各種屬性都可以在這個文件中進行配置,最常配置的比如:server.port、logging.level.* 等等,然而我們實際用到的往往只是很少的一部分,那麼這些屬性是否有據可依呢?答案當然是肯定的,這些屬性都可以在官方文檔中查找到:
在這裏插入圖片描述

原理

Spring Boot關於自動配置的源碼在spring-boot-autoconfigure-x.x.x.x.jar中:
在這裏插入圖片描述
當然,自動配置原理的相關描述,官方文檔貌似是沒有提及。不過我們不難猜出,Spring Boot的啓動類上有一個@SpringBootApplication註解,這個註解是Spring Boot項目必不可少的註解。那麼自動配置原理一定和這個註解有着千絲萬縷的聯繫!

@EnableAutoConfiguration
在這裏插入圖片描述
@SpringBootApplication是一個複合註解或派生註解,在@SpringBootApplication中有一個註解@EnableAutoConfiguration,翻譯成人話就是開啓自動配置,其定義如下:
在這裏插入圖片描述
而這個註解也是一個派生註解,其中的關鍵功能由@Import提供,其導入的AutoConfigurationImportSelector的selectImports()方法通過SpringFactoriesLoader.loadFactoryNames()掃描所有具有META-INF/spring.factories的jar包。
在這裏插入圖片描述
點進去看方法
在這裏插入圖片描述
這裏有一個獲取配置的方法 點進去
在這裏插入圖片描述loadFactoryNames() 方法就會掃描所有的 META-INF/spring.factories 下面的包,。spring-boot-autoconfigure-x.x.x.x.jar裏就有一個這樣的spring.factories文件。
在這裏插入圖片描述
這個@EnableAutoConfiguration註解通過@SpringBootApplication被間接的標記在了Spring Boot的啓動類上。在SpringApplication.run(…)的內部就會執行selectImports()方法,找到所有JavaConfig自動配置類的全限定名對應的class,然後將所有自動配置類加載到Spring容器中。

自動配置生效

每一個XxxxAutoConfiguration自動配置類都是在某些條件之下才會生效的,這些條件的限制在Spring Boot中以註解的形式體現,常見的條件註解有如下幾項:

@ConditionalOnBean:當容器裏有指定的bean的條件下。

@ConditionalOnMissingBean:當容器裏不存在指定bean的條件下。

@ConditionalOnClass:當類路徑下有指定類的條件下。

@ConditionalOnMissingClass:當類路徑下不存在指定類的條件下。

@ConditionalOnProperty:指定的屬性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表當xxx.xxx爲enable時條件的布爾值爲true,如果沒有設置的情況下也爲true

以ServletWebServerFactoryAutoConfiguration配置類爲例,解釋一下全局配置文件中的屬性如何生效,比如:server.port=8081,是如何生效的(當然不配置也會有默認值,這個默認值來自於org.apache.catalina.startup.Tomcat)。
在這裏插入圖片描述
在ServletWebServerFactoryAutoConfiguration類上,有一個@EnableConfigurationProperties註解:開啓配置屬性,而它後面的參數是一個ServerProperties類,這就是習慣優於配置的最終落地點。
在這裏插入圖片描述
在這個類上,我們看到了一個非常熟悉的註解:@ConfigurationProperties,它的作用就是從配置文件中綁定屬性到對應的bean上,而@EnableConfigurationProperties負責導入這個已經綁定了屬性的bean到spring容器中(見上面截圖)。那麼所有其他的和這個類相關的屬性都可以在全局配置文件中定義,也就是說,真正“限制”我們可以在全局配置文件中配置哪些屬性的類就是這些XxxxProperties類,它與配置文件中定義的prefix關鍵字開頭的一組屬性是唯一對應的。

至此,我們大致可以瞭解。在全局配置的屬性如:server.port等,通過@ConfigurationProperties註解,綁定到對應的XxxxProperties配置實體類上封裝爲一個bean,然後再通過@EnableConfigurationProperties註解導入到Spring容器中。

而諸多的XxxxAutoConfiguration自動配置類,就是Spring容器的JavaConfig形式,作用就是爲Spring 容器導入bean,而所有導入的bean所需要的屬性都通過xxxxProperties的bean來獲得。

可能到目前爲止還是有所疑惑,但面試的時候,其實遠遠不需要回答的這麼具體,你只需要這樣回答:

Spring Boot啓動的時候會通過@EnableAutoConfiguration註解找到META-INF/spring.factories配置文件中的所有自動配置類,並對其進行加載,而這些自動配置類都是以AutoConfiguration結尾來命名的,它實際上就是一個JavaConfig形式的Spring容器配置類,它能通過以Properties結尾命名的類中取得在全局配置文件中配置的屬性如:server.port,而XxxxProperties類是通過@ConfigurationProperties註解與全局配置文件中對應的屬性進行綁定的。

通過一張圖標來理解一下這一繁複的流程:
在這裏插入圖片描述
以上內容是來源於博客: https://blog.csdn.net/u014745069/article/details/83820511

總結

綜上所述 自己去看了一下自己現在的網關項目:
在這裏插入圖片描述
從配置文件中點進去比如 routes 可以看到 類上面有@ConfigurationProperties 註解 是讀取配置文件中的這個值,在這裏插入圖片描述
然後點開源碼目錄可以看到 spring.factories 這裏面有很多讀取配置類 (redis,Discovery) 等等 上面看到的GatewayProperties 就是在GatewayAutoConfiguration 這個類中的

在這裏插入圖片描述
讀取了這個類中的文件 然後實例化一個Bean
在這裏插入圖片描述
其他的所有配置文件都是這麼讀取的,也就是可以理解 當你講這個依賴引入 然後配置好yml 或者peoperties 文件 這個依賴的底層就已經實現好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章