文章目录
- 1. ConfigurationClassPostProcessor
- 1.1 BeanFactoryPostProcessor
- 1.2 BeanDefinitionRegistryPostProcessor
- 1.3 ConfigurationClassPostProcessor执行位置
- 2.RequiredAnnotationBeanPostProcessor
- 2.1 BeanPostProcessor
- 2.2 InstantiationAwareBeanPostProcessor
- 2.2.1 postProcessBeforeInstantiation()
- 2.2.2 postProcessAfterInstantiation()
- 2.2.3 postProcessPropertyValues()
- 2.3 SmartInstantiationAwareBeanPostProcessor
- 2.4 InstantiationAwareBeanPostProcessorAdapter
- 2.5 MergedBeanDefinitionPostProcessor
- 3.AutowiredAnnotationBeanPostProcessor
- 4.CommonAnnotationBeanPostProcessor
- 5.EventListenerMethodProcessor
- 6.DefaultEventListenerFactory
- 7. ApplicationContextAwareProcessor
spring在启动的时候,总共默认注册了6个后置处理器,本篇文章,我们看下这些个后置处理器都是什么类型,分别做了什么事情。
先说明以下,bean在创建的过程中,先经过 实例化,然后经过初始化。
1. ConfigurationClassPostProcessor
看这个类的名字,可以发现和Configuration有关,没错,就是处理@Configuration注解修饰的类的。
看类图:
此post process 实现了BeanDefinitionRegistryPostProcessor接口,BeanDefinitionRegistryPostProcessor又继承了BeanFactoryPostProcessor接口。
1.1 BeanFactoryPostProcessor
- bean工厂后置处理器,用来定制化bean的定义,作用于bean实例化之前,调整上下文基础bean工厂的bean属性值。
- 包含一个接口方法:postProcessBeanFactory()。
1.2 BeanDefinitionRegistryPostProcessor
- 继承于BeanFactoryPostProcessor,包含一个接口方法postProcessBeanDefinitionRegistry(),
- 看名字是跟bean有关。在应用上下文初始化之后,修改其中的注册表(registry)信息。此时,所有常规bean只是被注册,但是还没有实例化。通过这个方法允许我们进一步增加bean的描述。
- 在spring中,默认BeanDefinitionRegistryPostProcessor类型的后置处理器,拥有较高的执行优先级(相对于BeanFactoryPostProcessor类型)。
1.3 ConfigurationClassPostProcessor执行位置
ConfigurationClassPostProcessor是spring第一个执行的 post process。
- BeanDefinitionRegistryPostProcessor接口的具体实现;
- 用于引导处理加@Configuration注解的类,拥有最高优先级,是spring在启动过程中,最先执行的post process。
- 此后置处理会解析@Configuration注解修饰的类上的注解,比如@ComponentScan注解,因此,执行了此后置处理器,所有我们自定义的bean(比如@Component注解修饰的),都会被spring发现,并进行注册。
- AbstractApplicationContext#refresh()#invokeBeanFactoryPostProcessors()#PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()中,有如下代码:
//1.2 遍历beanName,实例化postProcessor
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
//beanFactory是DefaultListableBeanFactory
//getBean是其父类AbstractBeanFactory中的方法,调用完getBean就完成了实例化
//这里beanFactory.getBean方法是个比较重要的方法,实例化了bean,并放到了容器的单例池(singletonObjects)中
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
//根据优先级顺序排序,每个post processor 里面都有个gerOrder指定了order的值
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
//1.3 执行后置处理方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
最后一行就是执行。
2.RequiredAnnotationBeanPostProcessor
用于检查@Requried注解修饰的方法,必须注入set的值。
通过这个类,发现这个类的继承关系有点复杂,下面分别看下底层的几个接口作用。
2.1 BeanPostProcessor
后置处理器的根接口。包含两个接口方法。
用来定制bean的实例化,比如实现代理;作用于每个bean实例化过程中,初始化前后。
2.1.1 postProcessBeforeInitialization()
作用bean的初始化之前,类似 InitializingBean接口的 afterPropertiesSet方法,
或者自定义的init-method。
最终返回的可能是代理类;
2.1.2 postProcessAfterInitialization()
同postProcessBeforeInitialization,只是作用于bean的初始化之后。
2.2 InstantiationAwareBeanPostProcessor
此接口继承于BeanPostProcessor,在此基础上,又扩展了3个接口方法,作用于实例化前后。
2.2.1 postProcessBeforeInstantiation()
bean实例化之前执行,最终返回的可能是代理类;
默认返回null,如果此方法返回的不是null,那么bean的创建过程相当于被截断,下一个执行的方法就是BeanPostProcessor#postProcessAfterInitialization()。
2.2.2 postProcessAfterInstantiation()
作用于bean的实例化之后,返回boolen值。
如果希望bean在实例化之后,set bean的属性值,则返回true,否则返回false。
默认返回true。
2.2.3 postProcessPropertyValues()
看下入参(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName),是一些参数,
在这些参数被set到bean中之前,此方法用来处理这些参数:
比如检查参数,检擦依赖是否都满足。
比如替换或者修改参数。
默认对参数不做任何处理,直接返回。
2.3 SmartInstantiationAwareBeanPostProcessor
此接口继承于上一节的InstantiationAwareBeanPostProcessor接口,又补充了3个方法。
用于判断bean经过处理(被postprocessor)后的最终的类型。
2.3.1 predictBeanType()
在postProcessBeforeInstantiation方法执行之后,用于预测bean最终返回的类型。
2.3.2 determineCandidateConstructors()
确定用于给定bean的候选构造函数,并返回。
2.3.3 getEarlyBeanReference()
用于解决循环依赖;
获取bean的早期状态,就是实例化结束,但是还没有被初始化的状态。
2.4 InstantiationAwareBeanPostProcessorAdapter
抽象类,用于适配,默认没有任何实现,由其子类根据需要取实现。
2.5 MergedBeanDefinitionPostProcessor
此接口继承于BeanPostProcessor,只有一个接口方法postProcessMergedBeanDefinition()。
用于准备并缓存一些注解信息,比如@Autowired和@Resource等,在实例化之前执行。但是在postProcessBeforeInstantiation方法之后。
3.AutowiredAnnotationBeanPostProcessor
此类的继承关系和第2节RequiredAnnotationBeanPostProcessor,是一样的,不在赘述。
类图:
用于处理@Autowired/@Value注解,注入对应的值。
4.CommonAnnotationBeanPostProcessor
主要用于处理@Resource @PostConstruct @PreDestroy等注解。
5.EventListenerMethodProcessor
注册事件监听方法为独立的ApplicationListener实例。
5.1 SmartInitializingSingleton
此接口只有一个方法void afterSingletonsInstantiated();
在所有普通bean pre-instantiation结束后执行。用于确保所有常规bean都已经被实例化。
5.2 ApplicationContextAware
此接口只有一个方法setApplicationContext,用于初始化object,给运行中的对象赋值applicationContext。
在填充了bean属性值之后执行,但是在nitializingBean#afterPropertiesSet()或者init等方法之前执行。
6.DefaultEventListenerFactory
用于处理@EventListener注解;
具体方法在其委派类,ApplicationListenerMethodAdapter中实现。
7. ApplicationContextAwareProcessor
这个processor直接实现了根processor接口BeanPostProcessor。
在bean实例化后,初始化时会执行所有post processor,其中就包括这个。
它处理实现了ApplicationContextAware接口的bean。