您现在的位置是:首页 >技术杂谈 >Springboot 自动装配流程分析网站首页技术杂谈
Springboot 自动装配流程分析
目录
1.基础知识:
springboot的自动装配是利用了spring IOC容器创建过程中的增强功能,即BeanFactoryPostProcessor, 其中的ConfigurationClassPostProcessor实现了BeanFactoryPostProcessor接口,在其中具体完成了springboot的自动装配过程,这个后置处理器会解析注解信息,启动类上有SpringbootApplication注解,这是一个复合注解,里面包含了@EnableAutoConfiguration注解
@EnableAutoConfiguration注解中import了一个ImportSelector类AutoConfigurationImportSelector,调用这个类里面的方法getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类,并生成对应的BeanDefinition,然后继续走spring的流程去生成bean。
2.具体代码执行流程
springboot main方法 -> SpringApplication.run
prepareContext方法完成SpringBoot项目的xxxApplication的BeanDefinition的注册;refreshContext通过spring的注解扫描完成自动装配。
然后执行refreshContext(context)方法,然后进入到spring框架的refresh(....)方法:
调用invokeBeanFactoryPostProcessors(beanFactory)去执行注册好的所有BeanFactoryPostProcessor,其中就包括ConfigurationClassPostProcessor,由它去完成自动装配。具体是有ConfigurationClassParser这个类去完成的,它是所有配置类(加了注解的类@Configuration)的解析类。
所有的解析都在其方法parse(......)中,会调用processImports(......)方法去解析@Import注解,拿到import注解里面配置的类AutoConfigurationImportSelector.class
@Import注解:
上面通过解析@Import注解,拿到类AutoConfigurationImportSelector之后,调用这个类里面的方法getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类,并生成对应的BeanDefinition,然后继续走spring的流程去生成bean
3.流程总结:
springboot main方法 -> SpringApplication.run -> refreshContext(context) -> refresh(....) -> invokeBeanFactoryPostProcessors(beanFactory) -> ConfigurationClassPostProcessor类的processConfigBeanDefinitions(.......)方法 -> ConfigurationClassParser类的parse(......)方法 -> processImports(......)解析@Import注解,拿到AutoConfigurationImportSelector.class -> getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类
流程中核心代码
//从spring.Factories文件中加载124个EnableAutoConfiguration,并进去条件过去重复的,不需要的EnableAutoConfiguration
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
//从spring.Factories文件中加载EnableAutoConfiguration 124个EnableAutoConfiguration
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
// 去除重复的
configurations = removeDuplicates(configurations);
//去除排除的类
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
//过滤的不用的类
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
//从spring.Factories文件中加载EnableAutoConfiguration
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
4.参考文章:
SpringBoot 自动装配流程以及核心源码剖析-CSDN博客
(1条消息) SpringBoot 启动过程和自动装配_spring boot 启动7个阶段_cap_qin的博客-CSDN博客