美文网首页
BeanFactoryPostProcessor,BeanPos

BeanFactoryPostProcessor,BeanPos

作者: Eshin_Ye | 来源:发表于2019-06-20 15:23 被阅读0次

基于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)

相关文章

网友评论

      本文标题:BeanFactoryPostProcessor,BeanPos

      本文链接:https://www.haomeiwen.com/subject/vqnrqctx.html