spring5源码阅读(五)Post Processors类型及作用详解

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。

发布了62 篇原创文章 · 获赞 29 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csdn_20150804/article/details/100858729
今日推荐