这里写目录标题
1. 版本2. 创建InstantiationAwareBeanPostProcessor接口的实现类3. 测试4. 代码分析
1. 版本
<dependency>
<groupId>org.springframework
</groupId>
<artifactId>spring-context
</artifactId>
<version>5.1.3.RELEASE
</version>
</dependency>
2. 创建InstantiationAwareBeanPostProcessor接口的实现类
重写postProcessAfterInstantiation方法,返回false
package org
.example
.beanPostProcessor
;
import org
.springframework
.beans
.BeansException
;
import org
.springframework
.beans
.factory
.config
.InstantiationAwareBeanPostProcessor
;
import org
.springframework
.stereotype
.Component
;
@Component
public class InstantiationAwareBeanPostProcessorTest implements InstantiationAwareBeanPostProcessor {
@Override
public boolean postProcessAfterInstantiation(Object bean
, String beanName
) throws BeansException
{
return false;
}
}
3. 测试
断点测试,都为null
return true
再看结果,注入成功
4. 代码分析
在AbstractAutowireCapableBeanFactory类中,populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)方法的1341行,debug测试方法
找到所有实现了BeanPostProcessor接口的类
for (BeanPostProcessor bp
: getBeanPostProcessors())
循环找到是InstantiationAwareBeanPostProcessor类型的类
if (bp
instanceof InstantiationAwareBeanPostProcessor)
如果是InstantiationAwareBeanPostProcessor类型的类,判断postProcessAfterInstantiation方法的返回是不是false(这里除了自己实现的那个类,其他的实现类的postProcessAfterInstantiation方法都返回了true)
if (!ibp
.postProcessAfterInstantiation(bw
.getWrappedInstance(), beanName
)) {
如果postProcessAfterInstantiation方法返回false,continueWithPropertyPopulation 设置为 false,结束循环
continueWithPropertyPopulation
= false;
break;
continueWithPropertyPopulation = false,进入if,方法直接结束,populateBean()这个方法是专门用来做依赖注入的,所以后面注入的方法都不会走,必然注入失败
if (!continueWithPropertyPopulation
) {
return;
}