自动装配:根据classpath下的类、jar包转化为spring ioc中的bean。
@SpringBootApplication
触发时机都是在
spring refresh invokeBeanFactoryPostProcessors
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
调用ConfigurationClassPostProcessor处理器加载processConfigBeanDefinitions方法中调用ConfigurationClassParser类来解析@SpringBootConfiguration、@ComponentScan 、@EnableAutoConfiguration
org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions
直接new一个ConfigurationClassParser 解析器
// Parse each @Configuration class
ConfigurationClassParser parser = new ConfigurationClassParser(
this.metadataReaderFactory, this.problemReporter, this.environment,
this.resourceLoader, this.componentScanBeanNameGenerator, registry);
调用parse方法解析
org.springframework.context.annotation.ConfigurationClassParser#parse(java.util.Set<org.springframework.beans.factory.config.BeanDefinitionHolder>)
1、解析@SpringBootConfiguration,实际就是解析@Configuration标注的Bean类、方法,从候选者转化为BD,BeanFactory使用enhancer生成cglib代理来拦截Bean的method。
//解析@Configuration
org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass
//enhancer使用cglib proxy来拦截方法。
org.springframework.context.annotation.ConfigurationClassEnhancer
2、 解析@ComponentScan标注的Bean类、方法解析到内存,从候选者转化为BD。
org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass
Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
3、 在spring刷新阶段提前导入在spring.factories中需要自动装配的配置类,使用@EnableAutoConfiguration的自动配置类为org.springframework.boot.autoconfigure.EnableAutoConfiguration,其他比如redis、rabitmq、roketmq等默认的配置类都在这里反射实现。
//决定是否配置可以自动装配功能
org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector
//使用递归方式导入ImportSelector自动装配的Bean
org.springframework.context.annotation.ConfigurationClassParser#processImports
//EnableAutoConfigurationImportSelector的子类实现AutoConfigurationImportSelector,
这里使用SpringFactoriesLoader来加载META-INF/spring.factories下默认自动装配的类,包括
org.springframework.boot.autoconfigure.EnableAutoConfiguration和其他redis、RocketMQ、RabitMq
等jar包中的配置类。
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports