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的自動裝配