beanFactory初始化阶段会注册beanPostProcessor,它的作用就是在bean实例化前、后,初始化前、后进行拦截操作

BeanPostProcessor为最顶层的接口

共有5种类型不同作用的间接接口(包含自己) 如图beanPostProcessor


InstantiationAwareBeanPostProcessor

  • postProcessBeforeInstantiation
    可以拦截bean实例化之前(不包含factoryBean#getObject),如果返回不为空,则直接调用BeanPostProcessor的后置方法并直接返回,此时bean已创建完毕(很少用)

  • postProcessAfterInstantiation
    返回值为Boolean类型,如果返回为false则不允许自动装配(很少用)

  • postProcessProperties
    自动装配,最重要的实现AutowiredAnnotationBeanPostProcessor实现自动装配

  • postProcessPropertyValues
    如果postProcessProperties返回值为null,则会调用此方法
    自动装配,dubbo注解方式的自动装配:ReferenceAnnotationBeanPostProcessor


MergedBeanDefinitionPostProcessor

  • postProcessMergedBeanDefinition
    postProcessBeforeInstantiation之后,如果没有拦截实例化、则会通过beanDefinition准备实例化
    实例化之前可以拦截beanDefinition做一些修改,或提取一些信息
    比如说自动装配@Autowired、@Resource在这个阶段提取对应的字段或方法并缓存,然后再postProcessProperties阶段进行自动装配操作

BeanPostProcessor

  • postProcessBeforeInitialization
    可以替换或set对应的bean,最重要的实现ApplicationContextAwareProcessor,各种Aware的处理

  • postProcessAfterInitialization
    可以替换或set对应的bean
    最重要的实现AbstractAutoProxyCreator实现aop拦截


SmartInstantiationAwareBeanPostProcessor

  • getEarlyBeanReference

    提供早期的引用:如果是单例,并且是循环引用的情况下,最重要的实现InfrastructureAdvisorAutoProxyCreator实现事务aop拦截,且可以循环引用

  • predictBeanType
    通过beanName获取class的时候会调用此方法,可以重写此方法,返回bean的类型(返回可以为null)

  • determineCandidateConstructors
    Determine the candidate constructors to use for the given bean.(返回可以为null)


DestructionAwareBeanPostProcessor

  • postProcessBeforeDestruction
    bean在销毁时会调用

鸟瞰各个方法的调用顺序

1. postProcessBeforeInstantiation

InstantiationAwareBeanPostProcessor

在bean实例化的时候调用此方法,如果返回不为空则会调用postProcessAfterInitialization并返回,至此后面的流程不在调用

2. MergedBeanDefinitionPostProcessor

InstantiationAwareBeanPostProcessor

如果在postProcessBeforeInstantiation期间没有被提前实例化,则会调用此方法

3. getEarlyBeanReference

SmartInstantiationAwareBeanPostProcessor

这个方法是在单例bean创建的时候通过调用此方法,包装成回调并放入循环引用中的三级缓存中,默认实现AOP:AbstractAutoProxyCreator

4. postProcessAfterInstantiation

InstantiationAwareBeanPostProcessor

如果此方法如果返回false,则不允许自动装配了,换句话说就不会执行第5步了 如果返回true,则要自动装配
通过beanDefinition#getResolvedAutowireMode返回值,可选择的执行spring内置的autowireByType或者autowireByName

装配的属性必须有set方法,并且只装配在beanFactory中存在的bean,不存在的并不会报错

5. postProcessProperties或postProcessPropertyValues

InstantiationAwareBeanPostProcessor

spring实例化完bean之后调用populateBean进行自动装配
如果postProcessProperties返回为空,则会执行postProcessPropertyValues
默认实现IOC:AutowiredAnnotationBeanPostProcessor

6. postProcessBeforeInitialization

BeanPostProcessor

调用此方法之前会优先调用BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口的beanset...

此方法可以替换或set对应的bean,如各种Aware的处理进行setApplicationContextAwareProcessor

7. postProcessAfterInitialization

BeanPostProcessor

调用此方法前优先会调用InitializingBean接口的beanafterPropertiesSet
可以替换或set对应的bean,如aop拦截返回代理的beanAbstractAutoProxyCreator


postProcessBeforeDestruction bean在销毁的时候会调用,比如说当spring#close或者手动destroy时

总结

BeanPostProcessor为bean的后置处理器,共有5种不同的后置处理类型,每种后置类型有n多个方法
IOCAutowiredAnnotationBeanPostProcessor和AOPAbstractAutoProxyCreator都是通过后置处理完成的实现