作者:lixinleslee | 来源:互联网 | 2023-09-05 17:34
概述org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor这个回调接口中有两个
概述
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
这个回调接口中有两个方法:
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {return null;
}
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {return true;
}
这两个方法分别有什么用&#xff1f;
postProcessBeforeInstantiation
在bean实例化之前&#xff0c;传入该bean的class对象和beanName&#xff0c;如果我们返回的Object不为空&#xff0c;那么则说明这个类不需要Spring实例化且后序自动装配、bean初始化回调等都不会被执行等&#xff08;但注意会去执行BeanPostProcessor的after初始化方法&#xff09;&#xff0c;相当于是在Spring准备初始化之前&#xff0c;如果该类返回不为空&#xff0c;那么后序所有事情都不会进行&#xff0c;Spring认为这个Bean已经是完整的bean了&#xff0c;所以它不会进行其他操作了。但注意这个Bean仍然会被放到Spring容器中去
postProcessAfterInstantiation
当Spring创建完Bean以后&#xff0c;进行自动装配以前&#xff0c;调用此回调&#xff0c;如果此方法中返回false&#xff0c;那么Spring则不会对这个bean进行自动装配(也就是属性注入)的操作。
源码解析
首先看postProcessBeforeInstantiation
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])方法中
注意看下一个红框里面的doCreateBean方法做完后&#xff0c;bean就被初始化创建且属性已注入&#xff0c;在此之前上一个红框中。
resoleveBeforeInstantiation方法的返回值如果不为空&#xff0c;那么则直接return&#xff0c;后序的doCreateBean就没进入了。
那么我们此处看看上面红框中的方法。
1、Object bean &#61; resolveBeforeInstantiation(beanName, mbdToUse);
第一个红框中就是去执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法&#xff0c;第二个红框中就是去执行BeanPostProcessor的after初始化方法。
先来看看applyBeanPostProcessorsBeforeInstantiation方法。
2、applyBeanPostProcessorsBeforeInstantiation
这里面可以看出来其调用了InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法&#xff0c;如果返回的不为空&#xff0c;则直接return出去了&#xff0c;这些代码比较简单直接&#xff0c;不需要特别解释。
然后第二个红框中的applyBeanPostProcessorsAfterInitialization方法
3、applyBeanPostProcessorsAfterInitialization
这里没有什么好去解释的&#xff0c;这证实了上面我们说的如果postProcessBeforeInstantiation如果不返回空则不进行后序spring的操作&#xff0c;并且还会执行BeanPostProcessor的after初始化方法。
然后看postProcessAfterInstantiation
在上面我们解释的是对象创建以前的时候那个回调会被执行。现在和这个postProcessAfterInstantiation方法是在bean创建了&#xff0c;但还没有自动装配的时候。前面我们说了创建bean的方法是&#xff0c;那么我们进入这个方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
doCreateBean
这里面我们不过多描述Spring在自动装配以前如何通过构造器创建对象&#xff0c;这个我上一篇博客有详细解释。
我们看这个populateBean方法&#xff0c;这个方法时给当前已经创建出来的Bean填充属性的。
populateBean
可以看到这里面如果postProcessAfterInstantiation方法的返回值为false&#xff0c;那么直接return&#xff0c;后序的自动装配代码就不会被执行到。
至此&#xff0c;这个回调接口解释完&#xff0c;具体应用场景看项目业务要求&#xff0c;目前我还没有使用过。