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的自动装配
网友评论