InstantiationAwareBeanPostProcessor
一般用途:
一般用于抑制特定bean的默认实例化,
例如创建具有特殊目标源的代理(池目标,
延迟初始化目标等),或实现额外的注入策略(注解Autowired实现就是实现类该接口)
总体方法介绍:
实例化前调用,返回不为null,短路bean的创建流程
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
postProcessBeforeInstantiation返回为null,才会调用此方法,该方法实例化后创建,返回true为正常调用,返回false会中断后面的InstantiationAwareBeanPostProcessor 接口
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
@Deprecated
@Nullable
default PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
return pvs;
}
方法介绍:
postProcessBeforeInstantiation
在bean实例化前调用
@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
return null;
}
如果该方法返回值不为空,那么bean的创建过程会短路,短路是什么意思呢? 下面开始介绍
在
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean 方法大概503行左右
你看英文注释就可以知道意思
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
//这里如果返回不为null,则下面doCreateBean无法调用到,而doCreateBean中是调用
//populateBean和initializeBean方法的,所以相应方法也会短路(initializeBean方法可以说会调用BeanPostProcessor接口的方法的)
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
....
try {
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isTraceEnabled()) {
logger.trace("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
......
}
你点到org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation方法可以看到他就在调用InstantiationAwareBeanPostProcessor 接口
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
//ioc中是否有InstantiationAwareBeanPostProcessor目标接口
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
postProcessAfterInstantiation
实例化之后调用
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
.....
// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
// state of the bean before properties are set. This can be used, for example,
// to support styles of field injection.
//遍历所有InstantiationAwareBeanPostProcessors 接口,如果方法返回false
//会中断后面InstantiationAwareBeanPostProcessors 接口的调用,
//方法即使返回false也不会中断bean生命周期的后续流程
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
return;
}
}
}
}
....
}
//todo
go home