spring源码实现InstantiationAwareBeanPostProcessor接口配置是否依赖注入:业务场景是有些时候我们不想依赖注入或者仅有特殊的配置才要求依赖注入这时候,我们需要做自定义的修改。
跟到源码去看看:
1、核心代码:在 doCreateBean 方法里找到下面的核心接口
//ioc di,依赖注入的核心方法
populateBean(beanName, mbd, instanceWrapper);
点击进入
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
if (bw == null) {
if (mbd.hasPropertyValues()) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
}
else {
// Skip property population phase for null instance.
return;
}
}
//这段代码功能,处理是否运行 类依赖注入(即写接口可以让所有类都不能依赖注入)
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
//核心是可以让postProcessAfterInstantiation这个接口返回false
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
return;
}
}
}
}
//省略其他暂时无用代码
}
2、业务代码自定义实现InstantiationAwareBeanPostProcessor 接口
import com.enjoy.jack.bean.Jack;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.core.env.Environment;
//配置文件配置参数
@PropertySource("classpath:application.properties")
@Component
public class InstantiationAwareBeanPostProcessorDemo implements InstantiationAwareBeanPostProcessor {
@Autowired
private Environment environment;//环境变量
//初始化所有的接口均走这里
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if(bean instanceof Jack) {
if(environment.getProperty("enjoy.name").equalsIgnoreCase("nandao")) {
//此条件下可以进行依赖注入
return true;
}
}
//不能进行依赖注入
return false;
}
}
环境配置:application.properties
内容:
enjoy.name=nandao
如图:
3、测试执行:验证处理if判断正确的返回true,其他的均返回false 及不能依赖注入。
这个接口尽量小心使用,避免产生大的问题。