最近開始學習spring源碼,看各種文章的時候看到了springboot自動裝配實現原理。用自己的話簡單概括下。
首先打開一個基本的springboot項目,點進去@SpringBootApplication注解。
可以根據名字知道實現自動裝配應該是上面的@EnableAutoConfiguration注解,繼續點進去
這時候對spring注解比較了解的同學應該能感覺到實現原理就在@Import(AutoConfigurationImportSelector.class)這個注解中,@Import注解的參數可以是靜態類(用作直接導入)也可以是實現了ImportSelector接口的類,當是實現了ImportSelector會根據實現的selectImports方法來對類進行導入。讓我們看看AutoConfigurationImportSelector的實現
圖中loadmetadata的方法是加載項目的基本配置數據信息,而getAutoConfigurationEntry方法則是自動裝配的邏輯,繼續點進去
還是在加載配置,繼續點進去
其實到這一步基本清楚了,做的這些事情都是在加載類,那么自動裝配到底加載的是什么類呢,這里從外部傳入的factoryname是Enableautoconfiguration.class
點進去加載邏輯可以看到是在加載FACTORIES_RESOURCE_LOCATION路徑下的類。
會自動掃描所有項目下FACTORIES_RESOURCE_LOCATION這個路徑下的類,那么這個路徑是啥?
總結:到這里基本清楚了,springboot的自動裝配就是通過自定義實現ImportSelector接口,從而導致項目啟動時會自動將所有項目META-INF/spring.factories路徑下的配置類注入到spring容器中,從而實現了自動裝配。
相關的starter和自定義starter都是根據這個實現的。后續有空的話還會寫一下如何實現自定義starter的隨筆。
系統默認的META-INF/spring.factories路徑下配置為
筆者用的springboot版本為2.2.1,參考文章
https://mp.weixin.qq.com/s?__biz=MzU5MDgzOTYzMw==&mid=2247484694&idx=1&sn=e8d18bf3f2ee144ecb63f1b3d3190033&scene=21#wechat_redirect