Spring 5 PostProcessor 在ApplicationContext # refresh() 各阶段的作用

说明

下面所有PostProcessor是按照执行方法顺序列出,所以有重复类名的情况
所有的PostProcessor都支持 PriorityOrdered,Ordered

BeanDefinitionRegistryPostProcessor

方法 void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
用途 添加更多的bean定义,
调用方法 AbstartApplicationContext # refresh() .invokeBeanFactoryPostProcessors(beanFactory);,
触发时机 在标准初始化之后,修改应用程序上下文的内部BeanDefinitionRegistry。所有常规beanDefinition都已经被加载,但尚未实例化任何bean。
方法 void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
用途 可以以覆盖或添加属性,设置可以用于初始化bean。
调用方法 AbstartApplicationContext # refresh() . invokeBeanFactoryPostProcessors(beanFactory);
触发时机 在 ApplicationContext 获取到BeanFactory并对其做完进行准备作用后回调。这个时候是BeanFactory标准化初始化后,修改应用程序上下文的内部bean工厂。所有bean定义已经被加载, 但尚未实例化任何bean.
补充 该方法比 单纯的BeanFactoryPostProcessor实现要先执行

BeanFactoryPostProcessor

方法 void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
用途 可以以覆盖或添加属性,设置可以用于初始化bean。
调用方法 AbstartApplicationContext # refresh() . invokeBeanFactoryPostProcessors(beanFactory);
触发时机 在 ApplicationContext 获取到BeanFactory并对其做完进行准备作用后回调。这个时候是BeanFactory标准化初始化后,修改应用程序上下文的内部bean工厂。所有bean定义已经被加载, 但尚未实例化任何bean.

InstiationAwareBeanPostProcessor

方法 Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
用途 根据 beanName,beanClasss 实例化Bean对象.该Bean对象不会再默认的初始化(如依赖注入【这里的依赖注入不包含 @Autowire注解的注入】,初始化方法,aware接口等),仅调用 BeanPostProcessor # Object postProcessAfterInitialization(Object bean, String beanName)。
调用方法 AbstractBeanFactory # createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) . resolveBeforeInstantiation(beanName, mbdToUse);
触发时机 在实例化目标 bean 之前应用此 BeanPostProcess.返回的bean对象可以是代替目标 bean 使用 的代理,从而有效抑制了目标 bean 的默认实例化 。
补充 默认返回 null,返回null时,意味着走默认的实例化方式

SmartInstantiationAwareBeanPostProcessor

方法 Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
用途 确定要为beanClass使用候选构造函数
调用方法 AbstractBeanFactory # doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) -> instanceWrapper = createBeanInstance(beanName, mbd, args);-> determineConstructorsFromBeanPostProcessors(beanClass, beanName);
触发时机 在实例化目标 bean 时,需要找到合适的构造函数时
补充 默认返回 null,返回null时,意味着走默认的实例化方式

MergedBeanDefinitionPostProcessor

方法 postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
用途 对 beanDefinition 做后处理,如设置属性等。
调用方法 AbstractBeanFactory # doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) -> applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
触发时机 对 beanDefinition 做后处理,如设置属性等。
用途 在以默认方式实例化目标 bean 之前回调该方法,修改后的mbd将影响beanName对应的Bean对象的实例化。

SmartInstantiationAwareBeanPostProcessor

方法 getEarlyBeanReference(Object bean, String beanName)
用途 传进来的bean是通常用于解决循环引用时的早期访问引用,可对bean进行封装,或者调整。
调用方法 DefaultSingletonBeanRegistry # getSingleton(String beanName, boolean allowEarlyReference) . singletonObject = singletonFactory.getObject();这里的 getObject() 实际上是调 AbstractAutowireCapableBeanFactory # getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean)
触发时机 解决循环引用时候
补充 默认返回 bean

InstantiationAwareBeanPostProcessor

方法 boolean postProcessAfterInstantiation(Object bean, String beanName)
用途 在Spring自动装配开始之前,通常对bean进行判断是否实现了指定的Aware规范接口,有就对其回调。
调用方法 AbstractBeanFactory # doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) . populateBean(beanName, mbd, instanceWrapper);
触发时机 通过构造函数或工厂方法,在实例化bean之后执行操作,但是在Spring属性值(从显式属性或自动装配) 发生之前执行操作
补充 如果应该在bean上设置属性,则为true;否则需要跳过 populateBean 方法,则为false。正常的实现应该返回true。 返回false还将防止这个bean实例调用任何后续的InstantiationAwareBeanPostProcessor实例
方法 PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) pvs – 【实际的属性值】
用途 对 pvs 进行后处理
调用方法 AbstractBeanFactory # doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) . populateBean(beanName, mbd, instanceWrapper);
触发时机 在工厂将pvs应用到给定Bean之前,对它们进行后处理,不需要任何属性扫描符
补充 实际的属性值适用于给定的bean(可以传入propertyvalue实例),或 null 以使populateBean方法继续 调用 postProcessPropertyValues(需要初始化PropertyDescriptors当前 bean类)
方法 PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
用途 1. 对 pvs 进行后处理 2. 检查是否所有依赖项都满足,例如基于"Require"注释在 bean属性 setter
调用方法 AbstractBeanFactory # doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) . populateBean(beanName, mbd, instanceWrapper);
用途 1. 对 pvs 进行后处理 2. 检查是否所有依赖项都满足,例如基于"Require"注释在 bean属性 setter
触发时机 在工厂将pvs应用到给定Bean之前,对它们进行后处理,不需要任何属性扫描符
补充 默认实现按原有返回给定的 pvs. 可返回应用于bean的实际属性值(可以传入PropertyValues实例),或者为null以跳过属性填充

BeanPostProcessors

方法 Object postProcessBeforeInitialization(Object bean, String beanName)
用途 1. 对bean进行后期个性化设置;2. 包装bean对象
调用方法 AbstractBeanFactory # doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) . exposedObject = initializeBean(beanName, exposedObject, mbd);
触发时机 在任何Bean初始化回调之前(如初始化Bean的afterPropertiesSet或自定义的init方法)将此BeanPostProcessor 应用到给定的新Bean实例。Bean已经填充了属性值。返回的Bean实例可能时原始Bean的包装器
补充 默认返回 bean,可以返回包装bean后的对象。
方法 Object postProcessAfterInitialization(Object bean, String beanName)
用途 1. 对bean进行后期个性化设置;2. 包装bean对象
调用方法 1. 对bean进行后期个性化设置;2. 包装bean对象
用途 AbstractBeanFactory # doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) . exposedObject = initializeBean(beanName, exposedObject, mbd);
触发时机 在任何bean初始化回调(例如InitalizingBean的afterPropertiesSet或自定义的init-method之后), 将此BeanPostProcessor应用于给定的新bean实例。该bean将已经用属性值填充。
补充 默认返回 bean,可以返回包装bean后的对象。

补充

SmartInstantiationAwareBeanPostProcessor

方法 Class<?> predictBeanType(Class<?> beanClass, String beanName)
用途 返回 beanClass 的后处理Class对象
调用方法 AbstractAutowireCapableBeanFactory # predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>… typesToMatch)
触发时机 1. 确定具有给定名称的bean类型。更具体地说,确定getBean将针对给定名称返回的对象 的类型.【AbstractBeanFactory # Class<?> getType(String name, boolean allowFactoryBeanInit)】;2. 检查具有给定名称的bean是否与指定的类型匹配【AbstractBeanFactory # boolean isTypeMatch(String name, ResolvableType typeToMatch, boolean allowFactoryBeanInit)】;3. 判断beanName,mbd所指的bean是否FactoryBean:【AbstractBeanFactory # boolean isFactoryBean(String beanName, RootBeanDefinition mbd)】;4. 检查Bean是否属于Type类型,如果不是抛出BeanNotOfRequiredTypeException【DefaultListableBeanFactory # void checkBeanNotOfRequiredType(Class<?> type, DependencyDescriptor descriptor)】
方法 Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
用途 返回 beanClass 的后处理Class对象
调用方法 AbstractAutowireCapableBeanFactory # predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>… typesToMatch)
触发时机 1. 确定具有给定名称的bean类型。更具体地说,确定getBean将针对给定名称返回的对象 的类型.【AbstractBeanFactory # Class<?> getType(String name, boolean allowFactoryBeanInit)】;2. 检查具有给定名称的bean是否与指定的类型匹配【AbstractBeanFactory # boolean isTypeMatch(String name, ResolvableType typeToMatch, boolean allowFactoryBeanInit)】;3. 判断beanName,mbd所指的bean是否FactoryBean:【AbstractBeanFactory # boolean isFactoryBean(String beanName, RootBeanDefinition mbd)】;4. 检查Bean是否属于Type类型,如果不是抛出BeanNotOfRequiredTypeException【DefaultListableBeanFactory # void checkBeanNotOfRequiredType(Class<?> type, DependencyDescriptor descriptor)】

猜你喜欢

转载自blog.csdn.net/qq_30321211/article/details/108602622
今日推荐