spring中单个属性注入的控制(InstantiationAwareBeanPostProcessor)

单个属性注入的控制

简单应用

假设存在下面三个bean

@Component
public class A {
     
    
}

@Component
public class B {
     

    @Autowired
    private A a;

    public void test(){
     
        System.out.println("-------------------");
        System.out.println("b");
        System.out.println(a);
    }
}

@Component
public class C {
     

    @Autowired
    private A a;

    public void test(){
     
        System.out.println("-------------------");
        System.out.println("c");
        System.out.println(a);
    }
}

如果我们想要通过A自身来控制能否让B和C注入属性A,可以让A实现InstantiationAwareBeanPostProcessor接口,再实现它的postProcessAfterInstantiation方法。
spring中单个属性注入的控制(InstantiationAwareBeanPostProcessor)_第1张图片
这个方法的返回值决定了其他的bean能不能注入属性A,返回true就会注入,返回false就不会注入,现在我们直接全部返回false。

public static void main(String[] args) {
     
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
    B b = ac.getBean(B.class);
    C c = ac.getBean(C.class);
    b.test();
    c.test();
}

发现B和C都没能注入A
spring中单个属性注入的控制(InstantiationAwareBeanPostProcessor)_第2张图片
而且我们可以通过这个方法的两个参数判断出当前想要注入属性的bean

/**
 * 
 * @param bean      想要完成属性注入的bean对象
 * @param beanName  想要完成属性注入的bean的name
 * @return
 * @throws BeansException
 */
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
     
    System.out.println(beanName);
    System.out.println(bean);
    return false;
}

所以可以实现只让C的bean对象注入A

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
     
    if("c".equals(beanName)){
     
        return true;
    }
    return false;
}

结果
spring中单个属性注入的控制(InstantiationAwareBeanPostProcessor)_第3张图片

底层实现

这里的底层实现很简单,就是在bean属性注入的时候先判断注入的属性是否实现了InstantiationAwareBeanPostProcessor接口,如果实现了,就回调postProcessAfterInstantiation方法,根据返回值判断需不需要属性注入。

也是在这里将当前的bean实例和beanName传了过去
spring中单个属性注入的控制(InstantiationAwareBeanPostProcessor)_第4张图片
调用链如下
spring中单个属性注入的控制(InstantiationAwareBeanPostProcessor)_第5张图片

你可能感兴趣的:(java笔记——spring,framework相关)