作用
用于注解BeanDefinition的读取解析
在哪里初始化:
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
初始化 AnnotationConfigApplicationContext 上下文的时候同时初始化AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner
初始化的时候做了什么事情
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
// 省略非主流程代码......
//注册spring自带的 BeanFactoryPostProcessor 和 BeanPostProcessor
(this.registry);
}
AnnotationConfigUtils.registerAnnotationConfigProcessors 做了什么事情
// 往bean工厂设置了用于排序的类
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
//这个不懂 todo
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
//接下来很重要
//往bean工厂注册 ConfigurationClassPostProcessor //(是一种BeanDefinitionRegistryPostProcessor)很重要,后面讲
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
//接下来不贴代码,都是往bean工厂注册 BeanPostProcessor
// 重点 跟@Autowired @Value @Inject 有关
AutowiredAnnotationBeanPostProcessor
// 重点 和@PostConstruct @Resource @PreDestroy 有关
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
EventListenerMethodProcessor
DefaultEventListenerFactory
所以初始化就是往bean工厂添加几个spring自带的PostProcessor
需要关注的方法
public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {
// 传入一个class 解析成beandefinition
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
// 。。。 省略一堆代码,认为是解析beandefinition的过程,比如解析
//是否有@Lazy 然后设置懒加载属性,解析是否有 Primary //然后设置Primary属性
//接下来就是注册beandefinition到bean工厂中,在另外一个类中DefaultListabl // eBeanFactory#registerBeanDefinition 专门解析,其实比较简单,就是往
// map中put
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}
总结
AnnotatedBeanDefinitionReader 在spring上下文初始化的时候调用,AnnotatedBeanDefinitionReader自己在初始化的时候会往bean工厂注册spring自带的beanFactoryPostProcessor和beanPostProcessor,这些注册到bean工厂的list中,后面会使用到。AnnotatedBeanDefinitionReader#register 可以往bean工厂注册beanDefinition