Spring源码之BeanPostProcessor

BeanPostProcessor及其子接口是容器级回调接口,通过BeanPostProcessor定义的接口方法可以对容器中的Bean进行个性化的修改,例如:检查bean是不是具有某种特征,如果具有某种特征,就对该类bean做一些个性化定制,比如:填充某些属性亦或者是创建bean的代理等。
ApplicationContext容器在启动时能够自动检测应用中定义的BeanPostProcessor,并自动将他们应用到Bean的创建过程中。普通的BeanFactory需要用编程的方式注册自己定义的BeanPostProcessor。
BeanPostProcessor
Spring中Bean的创建分为实例化、属性填充和初始化三个阶段。BeanPostProcessor接口中定义的两个方法就是在初始化阶段的前后起作用的。
BeanPostProcessor定义了两个回调方法:
- Object postProcessBeforeInitialization(...)
该方法在bean属性填充之后,初始化阶段之前被调用。注意该方法的返回值可以是原始bean的一个wrapper,也可以是原始bean,当然也可以返回null.如果返回null,意味着当容器中有多个BeanPostProcessor时,后续的BeanPostProcessor都不会被调用了。
- Object postProcessAfterInitialization(...)
该方法在bean初始化阶段之后被调用。返回值及其含义同postProcessBeforeInitialization。
一般情况下,如果需要为某类bean做属性设置的话,实现postProcessBeforeInitialization即可。如果想要没某类Bean创建代理,通常需要实现postProcessAfterInitialization。
InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口。它在BeanPostProcessor的基础上新增了三个接口,主要用于bean实例化阶段的回调。InstantiationAwareBeanPostProcessor主要提供三个回调方法:
- Object postProcessBeforeInstantiation(...)
该方法在bean实例化之前被调用。该方法返回的bean对象可以替代正在被创建的目标bean。一旦该方法返回一个bean,那么正在被创建的bean将不会被真正创建,也就是说bean的实例化、属性填充和初始化三个阶段都会被跳过。而如果该方法返回null,则正常执行bean的创建流程。
- boolean postProcessAfterInstantiation(...)
该方法在bean实例化之后,属性填充之前被调用。该方法是自定义bean属性注入的理想方法。如果该方法返回false,则属性填充阶段将被跳过。
- PropertyValues postProcessProperties(...)
该方法在将属性应用到bean之前调用。主要用于加工bean属性。
SmartInstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor是InstantiationAwareBeanPostProcessor的子接口。它增加了三个回调方法:
- Class<?> predictBeanType(...)
如果postProcessBeforeInstantiation返回值不是null,这个方法可以返回postProcessBeforeInstantiation的返回值类型。主要用于bean类型的预测。为什么要进行Bean类型的预测?
- Constructor<?>[] determineCandidateConstructors(...)
筛选用于实例化bean的构造方法。主要用于bean实例化阶段,使得SmartInstantiationAwareBeanPostProcessor能够决定用哪个构造方法来实例化Bean.如果这个方法返回null,实例化时将使用默认无参构造方法。主要用于在构造方法注入时,筛选带Autowired的注解的构造方法。
- Object getEarlyBeanReference(...)
获取Bean的早期引用,主要用于解决循环依赖。如果一个Bean处于循环依赖当中,并且这个Bean还需要被代理,那么早期暴露的Bean与代理后的Bean需要一直。这个方法可以将代理Bean暴露出去。
实现SmartInstantiationAwareBeanPostProcessor接口的主要功能类:

MergedBeanDefinitionPostProcessor
MergedBeanDefinitionPostProcessor也是BeanPostProcessor的子接口。它在BeanPostProcessor的基础上新增了两个接口。
- void postProcessMergedBeanDefinition(...)
在bean实例化之后,postProcessAfterInstantiation之前,对BeanDefinition进行处理。比如扫描Bean中的注解用于后续的属性注入。
- void resetBeanDefinition(...)
重置BeanDefinition 未理解
实现MergedBeanDefinitionPostProcessor接口的相关功能类如下:

实例
AutowiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor实现了SmartInstantiationAwareBeanPostProcessor和MergedBeanDefinitionPostProcessor接口,完成Autowired注解的扫描及自动注入功能。其相关实现分析如下:
- 通过实现determineCandidateConstructors()接口方法,在bean的实例化阶段,完成对Bean中带有Autowired注解的构造方法的扫描,以便实例化阶段使用该构造方法创建bean的实例。
- 通过实现postProcessMergedBeanDefinition(...)接口方法,在bean实例化完成后,属性填充未开始之前,完成对Bean中带有Autowired和Value注解的属性的扫描,以便后续进行属性的自动注入。
- 通过实现postProcessProperties(...),完成对带有Autowired和Value注解的属性的自动注入。
AbstractAutoProxyCreator
AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor接口,完成动态代理创建过程的流程化代码实现。
- 通过实现postProcessAfterInitialization(...),在Bean的初始化阶段完成Bean的动态代理的创建。
- 通过实现getEarlyBeanReference(...)解决代理创建时的Bean循环依赖问题,将代理的创建提前至实例化后,属性填充之前,以便及早将代理暴露出去。
- 通过实现postProcessBeforeInstantiation(...),在Bean的实例化开始之前,完成对一些自定义的TargetSource的代理创建。
- 通过实现predictBeanType(...)将代理类的类型提前暴露给容器,以便于容器查找Bean。
浙公网安备 33010602011771号