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

本人博客原地址:BeanFactoryPostProcessor,BeanPostProcessor,SmartInitializingSingleton等几个可拓展接口的执行时机
创作时间:2019.06.20 15:23:13

基于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中。
在执行invokeBeanFactoryPostProcessors的时候,首先从context中获取到前面手动new然后put入的BeanFactoryPostProcessors
在invokeBeanFactoryPostProcessors方法中,首先是对BeanDefinitionRegistryPostProcessor类型的processor进行处理

当通过beandefinition查找时,beanDefinition可能通过代码手动添加,或者通过扫描注解添加,此时都会提前实例化。这些通过beandefinition实例化的bean不会加入到context的beanFactoryPostProcessors列表中。
在处理完BeanDefinitionRegistryPostProcessor后,接下来处理非BeanDefinitionRegistryPostProcessor的beanFactoryPostProcessor操作跟通过beandefinition实例化的BeanDefinitionRegistryPostProcessor过程基本类似,也是先查找beandefinition,然后实例化,然后执行postProcessBeanFactory方法。
自定义demo如下:

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。过程跟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)
不过需要注意的是有些BeanPostProcessor是实现了MergedBeanDefinitionPostProcessor或者InstantiationAwareBeanPostProcessor(这两个接口也是继承了BeanPostProcessor接口),在执行前置后置方法时,如果不清楚一些变量从何而来,可以尝试从这两个接口特有的实现方法中找。自定义demo如下:

3、SmartInitializingSingleton
在所有的单例实例化完之后,对满足条件的实例做后续处理eg:org.springframework.context.event.EventListenerMethodProcessor
在org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons中,所有的beanDefinition实例化完之后,才开始查找其中实现了SmartInitializingSingleton接口的实例,因此只要使用注解生成SmartInitializingSingleton实现类实例就可以了
自定义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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值