13.spring源码之ConfigurationClassPostProcessor类概括及其BeanDefintion的生成

前面的文章一些讲了xml解析、在xml中添加扫描组件就会把@Component类型注解的类封装成BeanDefinition,但现在xml文件的配置方法慢慢的退出了历史的舞台,大多都用注解开发,那么注解又是怎么完成对BeanDefinition的封装的呢?是通过ConfigurationClassPostProcessor类完成的,ConfigurationClassPostProcessor类实现了BeanDefintionRegistryPostProcessor类,在postProcessorBeanFactory()方法中完成了对@Configuration注解的解析,在postProcessorBeanDefinitionRegistr()方法中完成了对@Conditional、@ComponentScan、@Component、@PropertySource、@Import、@ImportSource、@Bean等注解的解析,流程图如下:

那么这个类又是在什么地方生产BeanDefiniton的呢?我们来看上下文注解对象

1.创建一个类添加ComponnetScan注解

ComponentScan注解就相当于xml解析中<context:componnet-scan basepackage="com.enjoy.AnnotationBean">组件

2.创建一个类添加Component注解

3.测试

发现AnnoBean、和ScanBean都实例化了

4.我们进入AnnotationConfigApplicationContext注解上下文的构造方法

发现这个构造方法中有三个方法,refresh()就是前面文章讲的容器加载的核心方法,register()方法完成了对传进来的参数ScanBean进行BeanDefiniiton的封装、注册,我们看this()空参构造方法

 

 

 

 

在这个方法中完成了对ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor等类BeanDefinition的封装。前面xml解析中组件注册的时候也调用了这个方法。而ConfigurationClassPostProcessor这个类实现了BeanDefintionRegistryPostProcessor接口,那么在refresh()中的invokeBeanFactoryPostProcessor()方法中会完成对ConfigurationClassPostProcessor中postProcessorBeanDefinitionRegistr()方法和postProcessorBeanFactory()方法的调用。这两个方法中完成了对诸多注解的解析。我们后续再讲。

 

posted @ 2021-08-14 17:31  福福猿  阅读(77)  评论(0)    收藏  举报