springboot自動裝配原理

Springboot項目的啟動類開始看起,啟動類有@SpringBootApplication注解表示是一個springboot應(yīng)用,這個注解上又有很多注解,其中有個開啟自動配置的注解@EnableAutoConfiguration,自動裝配的關(guān)鍵就是EnableAutoConfiguration開啟自動配置

在@EnableAutoConfiguration注解中,通過@Import注解(就是給Spring容器中導(dǎo)入一些組件),這里會將AutoConfigurationImportSelector自動引進來,這是個關(guān)鍵,這個類中有個核心方法selectImports,加載的時候會去調(diào)用這個方法,將所有需要導(dǎo)入的組件以全類名的方式返回,這些組件就會被添加到容器中

AutoConfigurationImportSelector#selectImports

可以看到在getAutoConfigurationEntry方法中返回了所有自動配置項的名稱

AutoConfigurationImportSelector#getAutoConfigurationEntry

AutoConfigurationImportSelector#getCandidateConfigurations

AutoConfigurationImportSelector#loadFactoryNames

    public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
        String factoryTypeName = factoryType.getName();
        return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
    }

AutoConfigurationImportSelector#loadSpringFactories

如上圖所示會依次遍歷所有jar包并加載所有jar包下的META-INF下的所有的spring.factories文件,這個url格式如:jar:file:/E:/maven/repository/org/springframework/boot/spring-boot-autoconfigure/2.1.7.RELEASE/spring-boot-autoconfigure-2.1.7.RELEASE.jar!/META-INF/spring.factories
最終讀取到properties中,如上圖中所示。打開該文件,可以發(fā)現(xiàn)左邊是接口,右邊是實現(xiàn),左邊接口就是上圖properties的key,可以發(fā)現(xiàn)有好多的比如JdbcAutoConfituration,CacheAutoConfiguration,F(xiàn)reeMarkerAutoConfiguration,KafkaAutoConfiguration,MongoAutoConfiguration,將來這些自動裝配前綴enableAutoConfiguration下的所有自動裝配的類的位置都能找到,因此通過反射然后將這些類全部加載注入到容器里面

比如jdbcTemplateConfiguration,但是不是直接注入的,是有要求的,沒有jdbcOperations類的bean實例以后才能把JdbcTemplateConfiguration 當(dāng)成一個配置文件,否則不會將其視作一個配置文件,不會加載

總結(jié)

spring啟動是依靠他的main方法的,在main方法中會調(diào)用springbootapplication.run方法,在run方法執(zhí)行的過程中會有一個刷新容器的方法refreshContext,在刷新容器的時候會通過解析注解的方式將我們的bean注入到容器中。解析注解的時候會解析我們的@SpringBootApplication注解,里面有個@EnableAutoConfiguration的注解,在這個注解中有一個核心的東西,給我們import進來一個類AutoConfigurationImportSelector,這個類會有一些核心方法幫助我們從類路徑下的META-INF下的spring.factories文件下加載一些東西,會加載以enableAutoconfiguration為key的所有的自動配置類到容器里面。而這些自動配置類中有很多條件注解會根據(jù)你引入的jar包以及容器里面的bean,把相應(yīng)的bean自動注入容器中,就這樣實現(xiàn)了springboot的自動裝配

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容