还留有的疑问就是
1.@configuration在哪一步开始进行了动态代理
2 .如何让@propertySource和@ConfigurationProperties生效
具体的就是在ConfigurationClassPostProcessor类中的postProcessBeanFactory方法。具体如下
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
得到当前beanFactory的hash值
int factoryId = System.identityHashCode(beanFactory);
检测当前的BeanFactoryprocessor是否已经处理 了该beanFactory
if (this.factoriesPostProcessed.contains(factoryId)) {
throw new IllegalStateException(
"postProcessBeanFactory already called on this post-processor against " + beanFactory);
}
this.factoriesPostProcessed.add(factoryId);
检测该beanFactoryProcessor作为BeanDefinitionRegistryPostProcessor时候是否已经执行了postProcessBeanDefinitionRegistry,如果没有就先执行
if (!this.registriesPostProcessed.contains(factoryId)) {
// BeanDefinitionRegistryPostProcessor hook apparently not supported...
// Simply call processConfigurationClasses lazily at this point then.
processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory);
}
增强configuration
enhanceConfigurationClasses(beanFactory);
添加bean的PostProcessor,ImportAwareBeanPostProcessor 处理实现ImportAware接口的Bean,此处就是留着处理我们@propertySource
beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));
}
- 1.enhanceConfigurationClasses的整个逻辑就是首先判断beanDefinition是否属于@Configuration注解,如果属于在看其是否属于AbstractBeanDefinition,如果是然后在判断该beanDefinition是否已经生成了单例对象,如果不是则加入集合 通过ConfigurationClassEnhancer生产一个proxy的class 修改beanDefinition的beanClass
- 2.添加ImportAwareBeanPostProcessor进入beanFactory的beanPostProcessors,并且看添加的BeanPostProcessor是否属于InstantiationAwareBeanPostProcessor,若是就将属性hasInstantiationAwareBeanPostProcessors职位true 同理hasDestructionAwareBeanPostProcessors也做同样的判断
- 3.ImportAwareBeanPostProcessor的作用,postProcessPropertyValues方法是看当前bean是否属于EnhancedConfiguration(该类是标识当前本是否是@configuration 增强的子类),如果是就设置该bean的beanfactory的属性,该方法是为了在AutowiredAnnotationBeanPostProcessor的postProcessPropertyValues尝试autowired configuration beans 时候给他们注入beanfactory
- 而ImportAwareBeanPostProcessor的postProcessBeforeInitialization就是帮助实现ImportAware接口的类获取将其父类导入的类的注解信息具体如下:
@Component
public class childClass extends fatherClass implements ImportAware {
@Override
public void setImportMetadata(AnnotationMetadata importMetadata) {
System.out.println("子类可以获取到导入其父类的类的注解信息");
}
}
public class fatherClass {
}
@Import(value = { fatherClass.class})
@SpringBootApplication
@EnableConfigurationProperties
@ImportResource(value = "classpath:spring.xml")
public class Application {
总结本篇文章只解决了1.@configuration在哪一步开始进行了动态代理
而2 .如何让propertySource生效估计是在bean生成的时候,所以留作以后解析