关于BeanDefinitionReader接口特性请看这里
注:ConfigurationClassBeanDefinitionReader修饰符是default,所以在我们自己的类中是提示不出来的,只在和它同包的其他类中使用
切记,这个类并不是BeanDefinitionReader接口的子类,虽然名字很像,以及里面的方法很像,这点,在ConfigurationClassBeanDefinitionReader类注释中有说明,它说BeanDefinitionReader接口是对Resource的操作,而ConfigurationClassBeanDefinitionReader是对configuration class的操作,而且BeanDefinitionReader很早很早之前就出现了
作用:将ConfigurationClass(模型类)变成BeanDefinition,注册到BeanDefinitionRegistry当中
方法解释
1.loadBeanDefinitionsForConfigurationClass
根据模型类的条件不同,所以转换成不同的BeanDefinition
2.loadBeanDefinitionsFromRegistrars
private void loadBeanDefinitionsFromRegistrars(Map<ImportBeanDefinitionRegistrar, AnnotationMetadata> registrars) {
for (Map.Entry<ImportBeanDefinitionRegistrar, AnnotationMetadata> entry : registrars.entrySet()) {
// entry.getValue()会获取到AspectJAutoProxyRegistrar类
// 该类会判断EnableAspectJAutoProxy注解,若存在该注解,则创建AnnotationAwareAspectJAutoProxyCreator
entry.getKey().registerBeanDefinitions(entry.getValue(), this.registry);
}
}
此处会判断ConfigurationClass类上是否有@EnableAspectJAutoProxy注解,如果有,则创建AnnotationAwareAspectJAutoProxyCreator类并且注入到容器中
时机:在ConfigurationClassPostProccessor的接口方法processConfigBeanDefinitions中,该方法中不但new了ConfigurationClassBeanDefinitionReader,并且调用ConfigurationClassBeanDefinitionReader的方法loadBeanDefinitions