BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机

基于springboot2.1.4

1、BeanFactoryPostProcessor
主要用于对beanDefinition的修改,对beanFactory中的相关参数进行修改
eg:org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanFactory

在执行org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors之前,可以在创建context后通过listener、initializer等方式手动new一个BeanFactoryPostProcessor的实现类,然后put入context的org.springframework.context.support.AbstractApplicationContext#beanFactoryPostProcessors中。
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第1张图片
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第2张图片

在执行invokeBeanFactoryPostProcessors的时候,首先从context中获取到前面手动new然后put入的BeanFactoryPostProcessors
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第3张图片

在invokeBeanFactoryPostProcessors方法中,首先是对BeanDefinitionRegistryPostProcessor类型的processor进行处理
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第4张图片

当通过beandefinition查找时,beanDefinition可能通过代码手动添加,或者通过扫描注解添加,此时都会提前实例化。这些通过beandefinition实例化的bean不会加入到context的beanFactoryPostProcessors列表中。

在处理完BeanDefinitionRegistryPostProcessor后,接下来处理非BeanDefinitionRegistryPostProcessor的beanFactoryPostProcessor
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第5张图片
操作跟通过beandefinition实例化的BeanDefinitionRegistryPostProcessor过程基本类似,也是先查找beandefinition,然后实例化,然后执行postProcessBeanFactory方法。
自定义demo如下:
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第6张图片

2、BeanPostProcessor
主要用于bean实例化的前置后置处理eg:org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor

BeanPostProcessor保存在ConfigurableListableBeanFactory中,通过beandefinition定义的会在org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors-->org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors()提前实例化并添加到BeanFactory中,如果通过new BeanPostProcessor实现类然后手动添加到BeanFactory,则需要在实例化bean执行org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization前,保证需要的BeanPostProcessor已经添加到BeanFactory。
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第7张图片
过程跟1中的invokeBeanFactoryPostProcessors类似,不做过多描述
前置后置方法执行时机

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean-->org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第8张图片

不过需要注意的是有些BeanPostProcessor是实现了MergedBeanDefinitionPostProcessor或者InstantiationAwareBeanPostProcessor(这两个接口也是继承了BeanPostProcessor接口),在执行前置后置方法时,如果不清楚一些变量从何而来,可以尝试从这两个接口特有的实现方法中找。自定义demo如下:
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第9张图片

3、SmartInitializingSingleton
在所有的单例实例化完之后,对满足条件的实例做后续处理eg:org.springframework.context.event.EventListenerMethodProcessor

在org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons中,所有的beanDefinition实例化完之后,才开始查找其中实现了SmartInitializingSingleton接口的实例,因此只要使用注解生成SmartInitializingSingleton实现类实例就可以了
BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机_第10张图片

自定义demo
/**
 * 参考org.springframework.context.event.EventListenerMethodProcessor
 */

@Component
public class AnnoCustomBeanSingletonProcessor implements SmartInitializingSingleton {
    @Override
    public void afterSingletonsInstantiated() {
        System.out.println("AnnoCustomBeanSingletonProcessor afterSingletonsInstantiated");
    }
}

4、MergedBeanDefinitionPostProcessor
5、InstantiationAwareBeanPostProcessor
除了BeanPostProcessor的两个接口方法外还有如下两个接口,在实例化后初始化前,完成成员变量的填充
postProcessProperties(PropertyValues pvs, Object bean, String beanName)
postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
6、Aware接口
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods
在bean填充完成员变量之后,在bean初始化时先完成几个Aware接口的回调((BeanNameAware) bean).setBeanName(beanName);、((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);、((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
7、org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor
继承自InstantiationAwareBeanPostProcessor
可用于自定义检测构造方法等Constructor[] determineCandidateConstructors(Class beanClass, String beanName)

你可能感兴趣的:(BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机)