當前位置:成語大全網 - 新華字典 - 210630:springBoot自動配置-自定義start

210630:springBoot自動配置-自定義start

Spring Boot關於自動配置的源碼在spring-boot-autoconfigure-x.x.x.x.jar中:

當然,自動配置原理的相關描述,官方文檔貌似是沒有提及。不過我們不難猜出,Spring Boot的啟動類上有壹個@SpringBootApplication註解,這個註解是Spring Boot項目必不可少的註解。那麽自動配置原理壹定和這個註解有著千絲萬縷的聯系!

@SpringBootApplication是壹個復合註解或派生註解,在@SpringBootApplication中有壹個註解@EnableAutoConfiguration,翻譯成人話就是 開啟自動配置 ,其定義如下:

而這個註解也是壹個派生註解,其中的關鍵功能由@Import提供,其導入的AutoConfigurationImportSelector的selectImports()方法通過SpringFactoriesLoader.loadFactoryNames()掃描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar裏就有壹個這樣的spring.factories文件。

這個spring.factories文件也是壹組壹組的key=value的形式,其中壹個key是EnableAutoConfiguration類的全類名,而它的value是壹個xxxxAutoConfiguration的類名的列表,這些類名以逗號分隔,如下圖所示:

這個@EnableAutoConfiguration註解通過@SpringBootApplication被間接的標記在了Spring Boot的啟動類上。在SpringApplication.run(...)的內部就會執行selectImports()方法,找到所有JavaConfig自動配置類的全限定名對應的class,然後將所有自動配置類加載到Spring容器中。

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

以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來獲得。

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

Starter可以理解為壹個可拔插式的插件,提供壹系列便利的依賴描述符,您可以獲得所需的所有Spring和相關技術的壹站式服務。應用程序只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息並啟動相應的默認配置。用壹句話描述,就是springboot的場景啟動器。

官方定義的starter命名都是spring-boot-starter-xxx,我們自己定義的壹般都 xxx-spring-boot-starter,新建壹個ruangh-id-gengerate-spring-boot-starter項目

導入springboot 包spring-boot-starter

定義壹個映射配置新的的類IdProperties和LockieProperties,添加註解ConfigurationProperties("machine.id"),我們的配置文件以machine.id開頭,比如mathine.id.name=boot-order,另外壹個配置是已spring.lockie開頭的

IdService裏面有個getId方法用來生成自定義的ID

在resources目錄下創建META-INF目錄,並添加文件spring.factories。在這個文件中配置EnableAutoConfiguration,具體如下:

創建壹個模塊,在pom文件中增加依賴

啟動類上添加註解

配置文件增加配置參數

添加測試類

運行壹下查看結果,看到結果是我們想要的,至此我們自定義壹個starter就成功了,總結壹下就是要創建3個類1個配置文件, xxProperties,xxService,xxAutoConfiguation和spring.factories