Springboot項目的啟動類開始看起,啟動類有@SpringBootApplication注解表示是一個springboot應用,這個注解上又有很多注解,其中有個開啟自動配置的注解@EnableAutoConfiguration,自動裝配的關鍵就是EnableAutoConfiguration開啟自動配置
在@EnableAutoConfiguration注解中,通過@Import注解(就是給Spring容器中導入一些組件),這里會將AutoConfigurationImportSelector自動引進來,這是個關鍵,這個類中有個核心方法selectImports,加載的時候會去調用這個方法,將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中
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中,如上圖中所示。打開該文件,可以發現左邊是接口,右邊是實現,左邊接口就是上圖properties的key,可以發現有好多的比如JdbcAutoConfituration,CacheAutoConfiguration,FreeMarkerAutoConfiguration,KafkaAutoConfiguration,MongoAutoConfiguration,將來這些自動裝配前綴enableAutoConfiguration下的所有自動裝配的類的位置都能找到,因此通過反射然后將這些類全部加載注入到容器里面
比如jdbcTemplateConfiguration,但是不是直接注入的,是有要求的,沒有jdbcOperations類的bean實例以后才能把JdbcTemplateConfiguration 當成一個配置文件,否則不會將其視作一個配置文件,不會加載
總結
spring啟動是依靠他的main方法的,在main方法中會調用springbootapplication.run方法,在run方法執行的過程中會有一個刷新容器的方法refreshContext,在刷新容器的時候會通過解析注解的方式將我們的bean注入到容器中。解析注解的時候會解析我們的@SpringBootApplication注解,里面有個@EnableAutoConfiguration的注解,在這個注解中有一個核心的東西,給我們import進來一個類AutoConfigurationImportSelector,這個類會有一些核心方法幫助我們從類路徑下的META-INF下的spring.factories文件下加載一些東西,會加載以enableAutoconfiguration為key的所有的自動配置類到容器里面。而這些自動配置類中有很多條件注解會根據你引入的jar包以及容器里面的bean,把相應的bean自動注入容器中,就這樣實現了springboot的自動裝配