spring源码-第五个后置处理器笔记

手动注入源码这篇博客中,记录的是手动注入的源码,但是实际上就是第六个后置处理器的使用;所以这篇博客就主要记录第五个后置处理器的学习;
第五个后置处理器,实际上在手动注入的时候,是和第六个后置处理器一起配合使用的

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

第五个和第六个后置处理器都是在这个方法中完成调用的,第五个后置处理器是来判断是否需要进行属性注入的,这里也算是一个扩展点吧,如果说我们想要对某一个bean的属性注入进行扩展,也就是说我们自己去进行属性注入,不使用spring的属性注入,那此时就可以实现一个后置处理器,实现第五个后置处理器的方法,在该方法中,对指定的bean,返回false,这样,指定的bean在初始化的过程中,就不会去调用spring属性注入的方法

接下来,我们先看源码

/**
 * 根据该标识判断是否需要进行属性注入
 */
boolean continueWithPropertyPopulation = true;

/**
 * 第五次调用后置处理器  判断是否需要填充属性;返回false,表示无需进行属性注入
 * 是调用的postProcessorAfterInstantiation方法,在这个方法里面,如果返回false,就不会再进行属性注入;
 * 所以,如果程序员要对所有注入的bean都不进行属性注入,就自己实现该方法,返回false即可(但是这种需求,一般也很少见吧)
 * 但是如果,只是要某一个bean不需要spring帮我们完成属性注入,一定要在扩展方法中加上对beanName的判断,否则的话,会导致所有的bean不进行属性注入
 * 因为每个bean在初始化的时候,都会去调用我们自己扩展的方法,只要有一个后置处理器的方法返回false,就不会属性填充了
 */
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    
    
  for (BeanPostProcessor bp : getBeanPostProcessors()) {
    
    
    if (bp instanceof InstantiationAwareBeanPostProcessor) {
    
    
      InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
      if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    
    
        continueWithPropertyPopulation = false;
        break;
      }
    }
  }
}

if (!continueWithPropertyPopulation) {
    
    
  return;
}

这就是第五个后置处理器的核心方法了,在ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)方法返回false的情况下,会将continueWithPropertyPopulation变量设置为false,此时就会直接return,不会继续进行属性注入

spring提供的后置处理器中,并没有对该方法进行太多的逻辑处理,直接默认都是返回的true,也就是使用spring的第六个后置处理器完成属性填充

这里只是有一个点需要特别注意:假如我们需要对某个bean进行特殊处理,也就是不使用spring的注入属性的逻辑,那就需要对第五个后置处理器进行扩展,比如:我们此时自己实现了一个beanPostProcessor的实现类,MySelfBeanPostProcessor,那在第五个后置处理器中,一定要判断beanName是否是我们要特殊处理的,如果是,就返回false,因为每个bean在初始化的时候,是会执行所有的后置处理器,对应的判断方法,只要有一个beanPostProcessor返回了false,就不会进行属性注入

猜你喜欢

转载自blog.csdn.net/CPLASF_/article/details/111645699