SpringBoot 這兩個(gè)配置文件有什么區(qū)別?
?本文講解了關(guān)于 SpringBoot 自動(dòng)裝配的兩個(gè)配置文件spring.factories? 和 spring-autoconfigure-metadata.properties有什么區(qū)別?
??讀過上一片文章你可能會(huì)發(fā)現(xiàn),在自動(dòng)裝配相關(guān)源碼閱讀的過程中涉及到了兩個(gè)配置文件 spring.factories? 和 spring-autoconfigure-metadata.properties,如果查看過內(nèi)容,你會(huì)覺得他們非常相似。
那么 spring.factories? 和 spring-autoconfigure-metadata.properties有什么區(qū)別呢?
spring.factories
“約定大于配置”在 Springboot 是一個(gè)很重要的思想,有一個(gè)約定就是 SpringBoot 啟動(dòng)的時(shí)候會(huì)加載 META-INF/spring.factories 配置文件。在 spring.factories 文件中,配置都是按照 Key-Value 形式保存的,Key 是需要解析類的全路徑名,Value 是一個(gè)或多個(gè)類的全路徑名,用逗號(hào)分隔,并且 spring.factories 文件可能有多個(gè)。Spring Boot 自動(dòng)裝配解析的核心配置文件就是它。
以 Feign 舉例:
spring-autoconfigure-metadata.properties
spring.factories 和 spring-autoconfigure-metadata.properties 類似,都是位于 META-INF 目錄下的文件,并且都是 Key-Value 形式保存數(shù)據(jù)。不同的是 ,后者的 Key 的格式為 類的全路徑名.自動(dòng)裝配條件?,Value 為 類的全路徑名,使用逗號(hào)分隔。它管理的是 Bean 的裝配條件。
假設(shè)有兩個(gè)類需要自動(dòng)裝配,但是有裝配的順序要求,這就無法僅僅依靠 spring.factories 來實(shí)現(xiàn),于是有了 spring-autoconfigure-metadata.properties,他的 Key 后面追加名字就代表了對(duì)應(yīng)的裝配條件。
以 Feign 的配置文件舉例:
上面這段配置就代表 FeignAcceptGzipEncodingAutoConfiguration 必須在 FeignAutoConfiguration 裝配之后再裝配。
如何生成 spring-autoconfigure-metadata.properties
如果你閱讀過源碼,可能會(huì)發(fā)現(xiàn)源碼文件中并沒有找到 spring-autoconfigure-metadata.properties 文件,但是編譯好的包中卻有,這是怎么一回事呢?
因?yàn)樗亲詣?dòng)生成的!
對(duì)于類路徑上的每個(gè)自動(dòng)配置類,Spring Boot 必須計(jì)算 @ConditionalXXX 條件值,用于決定是否加載自動(dòng)配置及其所需的所有類,根據(jù) Spring 啟動(dòng)應(yīng)用程序中 starter 的數(shù)量,這可能會(huì)花費(fèi)很多時(shí)間,為了提升啟動(dòng)時(shí)間,我們需要在 pom.xml 中添加一個(gè)依賴:
這樣它會(huì)解析各種 condition,生成 spring-autoconfigure-metadata.properties 文件。這樣,Spring Boot 在啟動(dòng)期間讀取這些元數(shù)據(jù),可以過濾出不滿足條件的配置,而不必實(shí)際檢查這些類,提升啟動(dòng)速度。
總結(jié)
spring.factories :用于配置哪些 Bean 進(jìn)行自動(dòng)裝配。
spring-autoconfigure-metadata.properties :控制 Bean 裝配的條件信息,自動(dòng)生成。