Spring中重要扩展点

165 阅读22分钟

熟悉 spring framework源码其中一个重要目的,灵活应用Spring的自定义扩展点


1. 背景

Spring生命周期中有两大接口,来对外提供强大的扩展功能。SpringBoot、SpringCloud中大量应用了这两大接口,所有熟悉两大接口既方便了扩展、又方便了对Spring体系的框架代码阅读。 在使用时时,通常我们并不会直接调用这两个接口,而是去实现该接口的子类。

2. 扩展点预览

2.1 第一大后置处理器 BeanFactoryPostProcessor

@FunctionalInterface
public interface BeanFactoryPostProcessor {

  // 1.在所有的bean的InitializingBean类的afterPropertiesSet方法之前执行
  // 2.beanFactory可以修改bean的元数据信息(beanDefintion),切记勿在该方法中实例化bean
  void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

2.1.1 BeanDefinitionRegistryPostProcessor

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

  // 1.在所有的bean的InitializingBean的afterPropertiesSet方法之后执行
  // 2.registry可以再添加一些额外的BeanDefinition
  void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}

2.3 第二大后置处理器 BeanPostProcessor

在Spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑

public interface BeanPostProcessor {

  // bean初始化方法调用前被调用
  @Nullable
  default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    return bean;
  }

  // bean初始化方法调用后被调用
  @Nullable
  default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    return bean;
  }

}

2.3.1 InstantiationAwareBeanPostProcessor

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

  // 1.在方法实例化之前执行,bean对象还未创建
  // 2.可以返回代理后的bean,返回后只会调用BeanPostProcessor的 postProcessAfterInitialization,后续方法不会再调用
  @Nullable
  default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    return null;
  }
  
  // 1.实例化后的bean,用来进行属性赋值操作
  // 2.返回值为true表示为进行属性赋值,会执行postProcessPropertyValues方法
  // 3.返回为fales表示属性已进行过赋值,不会执行postProcessPropertyValues方法
  default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    return true;
  }

  @Nullable
  default PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
    return pvs;
  }
  
}

2.3.2 SmartInstantiationAwareBeanPostProcessor

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {

  @Nullable
  default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
    return null;
  }

  @Nullable
  default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)
      throws BeansException {

    return null;
  }

  default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
    return bean;
  }

}

2.3.3 MergedBeanDefinitionPostProcessor

public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

  void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName);

}

2.3.4 DestructionAwareBeanPostProcessor

public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {

  void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;

  default boolean requiresDestruction(Object bean) {
    return true;
  }

}

3. 图示说明

4. 扩展点BeanFactoryPostProcessor 源码分析

在Spring生命周期的源码中,核心AbstractApplicationContext类中refresh方法。refresh方法会调用invokeBeanFactoryPostProcessors方法,invokeBeanFactoryPostProcessors方法为执行BeanFactoryPostProcessor策略的入口

4.1 流程入口

public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
      // 准备工作, 设置属性:设置启动时间,设置容器开启、关闭标志,初始化容器资源
      prepareRefresh();

      // 创建新的beanFactory,完成bean的加载,会生成beanDefiniton对象,把对象放在beanDefinitonMap中
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      // 准备beanFactory信息,其实就是为beanFactory对象中的属性进行赋默认值
      prepareBeanFactory(beanFactory);

      try {
      
        // 模版设计模式的空方法,提供子类去实现,也算得上是一个扩展点
        postProcessBeanFactory(beanFactory);

        // 本文重点方法:使用了策略模式, 调用所有实现列BeanFactoryPostProcessor接口的策略
        invokeBeanFactoryPostProcessors(beanFactory);

        // 仅注册BeanPostProcessors,暂不执行
        registerBeanPostProcessors(beanFactory);

        // 附加功能,国际化处理
        initMessageSource();

        // 附加功能,初始化多播器,后续处理Spring发布、监听事件用到。 使用了观察者模式
        initApplicationEventMulticaster();

        // 模版设计模式的空方法,留个子类实现。Springboot中实现该方法启动tomcat
        onRefresh();

        // 注册监听器
        registerListeners();

        // 以上的步骤都是做初始化操作,该方法才是真正实例化Bean操作。
        // 实例化所有非懒加载的单例对象
        finishBeanFactoryInitialization(beanFactory);

        // 最后容器刷新 发布刷新事件
        finishRefresh();
      }

      catch (BeansException ex) {
        // Destroy already created singletons to avoid dangling resources.
        destroyBeans();
        // Reset 'active' flag.
        cancelRefresh(ex);
        // Propagate exception to caller.
        throw ex;
      }

      finally {
        // Reset common introspection caches in Spring's core, since we
        // might not ever need metadata for singleton beans anymore...
        resetCommonCaches();
      }
    }
  }

4.1 核心处理

核心invokeBeanFactoryPostProcessors方法处理流程说明

1.从入参、容器中获取BeanDefinitionRegistryPostProcessor和 BeanFactoryPostProcessor 放在集合中

2.对BeanDefinitionRegistryPostProcessor和 BeanFactoryPostProcessor 集合按照实现的顺序接口进行排序

3.执行后置处理器顺序

   1.先执行参数传递 BeanDefinitionRegistryPostProcessor 类型的 postProcessBeanDefinitionRegistry 方法

   2.加载并执行容器BeanDefinitionRegistryPostProcessor 类型的 postProcessBeanDefinitionRegistry 方法

   3.执行参数传递的 BeanFactoryPostProcessor 类型的 postProcessBeanFactory 方法

   4.加载并执行容器中 BeanFactoryPostProcessor 类型的 postProcessBeanFactory 方法

invokeBeanFactoryPostProcessors源码查看,标注背景色的为重要处理代码

final class PostProcessorRegistrationDelegate {

 public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

    // 定义已处理的后置处理器。 目的是处理过后,后续逻辑将不再处理
    Set<String> processedBeans = new HashSet<>();

    // 通常beanFactory为DefaultListableBeanFactory类,该类实现BeanDefinitionRegistry接口,所有会进入IF判断
    if (beanFactory instanceof BeanDefinitionRegistry) {
    
      // 强制转换BeanDefinitionRegistry类型
      BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      
      // 入参中BeanFactoryPostProcessor集合 用于执行postProcessBeanFactory方法
      List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
      
      // 入参中的BeanDefinitionRegistryPostProcessor集合 用于执行postProcessBeanFactory方法
      List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

      // 循环我们传递进来的beanFactoryPostProcessors
      for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
      
        //判断我们的后置处理器是不是BeanDefinitionRegistryPostProcessor
        if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
        
          //进行强制转化
          BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor;
          
          //1.执行入参中BeanDefinitionRegistryPostProcessor实现该接口的 postProcessBeanDefinitionRegistry方法
**          registryProcessor.postProcessBeanDefinitionRegistry(registry);
**          
          //入参中 BeanDefinitionRegistryPostProcessor保存集合中, 用于执行postProcessBeanFactory方法
          registryProcessors.add(registryProcessor);
          
        }
        else {
          //参数传递 BeanFactoryPostProcessor类型放在容器中
          regularPostProcessors.add(postProcessor);
        }
      }

      //容器中获取的BeanDefinitionRegistryPostProcessor
      List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

      //从容器中获取BeanDefinitionRegistryPostProcessor类的属性名称
      String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      
      //循环筛选出来的匹配BeanDefinitionRegistryPostProcessor的类型名称
      for (String ppName : postProcessorNames) {
      
        //依次循环调用三个IF,IF条件内容一致,目的是根据先后顺序去执行对应的BeanDefinitionRegistryPostProcessor
        //if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class))
        //if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class))
        //if (!processedBeans.contains(ppName))
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
        
          //显示的调用getBean()的方式获取出该对象然后加入到currentRegistryProcessors集合中去,为了调用postProcessBeanDefinitionRegistry方法
          currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
          
          //同时加入到已处理的集合中,后续循环将不再处理
          processedBeans.add(ppName);
          
        }
      }
      
      //对currentRegistryProcessors集合中BeanDefinitionRegistryPostProcessor进行排序
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      
      //把当前的加入到总的里面去,用于执行postProcessBeanFactory方法
      registryProcessors.addAll(currentRegistryProcessors);
      
      //2.执行从容器中获取的BeanDefinitionRegistryPostProcessor实现该接口的 postProcessBeanDefinitionRegistry 方法
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      
      // 清空集合
      currentRegistryProcessors.clear();
      
      //上述说的循环调用,省略该代码
      //处理实现Ordered的后置处理器
      //处理没有实现PriorityOrdered、Ordered的后置处理
   
      // 3.执行从容器中获取的BeanDefinitionRegistryPostProcessor 实现该接口的 postProcessBeanFactory 方法
      invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
      
      // 4.执行入参中BeanFactoryPostProcessor 实现该接口的 postProcessBeanFactory 方法
      invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    }

    else {
       //若当前的beanFactory没有实现了BeanDefinitionRegistry 说明没有注册Bean定义的能力
       // 那么就直接调用BeanDefinitionRegistryPostProcessor.postProcessBeanFactory方法
      invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
    }

}

执行容器中BeanFactoryPostProcessor类型的postProcessBeanFactory方法

    //获取容器中所有的 BeanFactoryPostProcessor
    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

    //保存BeanFactoryPostProcessor类型实现了priorityOrdered
    List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    
    //保存BeanFactoryPostProcessor类型实现了Ordered接口的
    List<String> orderedPostProcessorNames = new ArrayList<>();
    
    //保存BeanFactoryPostProcessor没有实现任何优先级接口的
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    
    for (String ppName : postProcessorNames) {
    
      //processedBeans包含的话,表示在上面处理BeanDefinitionRegistryPostProcessor的时候处理过了
      if (processedBeans.contains(ppName)) {
        //空方法,为了不执行后面逻辑,使用continue更好
      }
      //判断优先级,放入到对应的集合,省略不重要的代码,用注解代替
      //else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class))
      //else if (beanFactory.isTypeMatch(ppName, Ordered.class))
      //else
      else {
        nonOrderedPostProcessorNames.add(ppName);
      }
    }
    
    // 重复代码,用注释代替。 执行对应的BeanFactoryPostProcessor
    // 第一步执行优先级最高的priorityOrderedPostProcessors 集合, 先排序
    // 第二步执行 orderedPostProcessorNames 集合,先排序
    // 第三步执行 nonOrderedPostProcessorNames 集合,不用排序
    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
    for (String postProcessorName : orderedPostProcessorNames) {
    
      //根据属性名称,加载对应的BeanFactoryPostProcessor到集合
      orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
      
    }
    //对BeanFactoryPostProcessor集合进行排序
    sortPostProcessors(orderedPostProcessors, beanFactory);
    
    //执行实现BeanFactoryPostProcessor接口的postProcessBeanFactory方法
    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

    // 清除元数据缓存
    beanFactory.clearMetadataCache();
  }

4.3 执行策略

执行BeanDefinitionRegistryPostProcessor 实现类中的postProcessBeanDefinitionRegistry方法

  private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {
    for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
      postProcessor.postProcessBeanDefinitionRegistry(registry);
    }
  }

执行BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor 实现类中的postProcessBeanFactory 方法

  private static void invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {

    for (BeanFactoryPostProcessor postProcessor : postProcessors) {
      postProcessor.postProcessBeanFactory(beanFactory);
    }
  }

5. 扩展点BeanPostProcessor

BeanPostProcessor与BeanFactoryPostProcessor处理流程不同,BeanPostProcessor集中注册,执行代码却散落在Spring生命周期中。

5.1 注册处理器

final class PostProcessorRegistrationDelegate {

 public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

    //去容器中获取所有的BeanPostProcessor 的名称(还是bean定义)
    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

    /**
     * bean的后置处理器的个数 beanFactory.getBeanPostProcessorCount()成品的个数 之前refresh-->prepareBeanFactory()中注册的
     * postProcessorNames.length  beanFactory工厂中bean定义的个数
     * +1 在后面又马上注册了BeanPostProcessorChecker的后置处理器
     */
    int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
    beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

    /**
     * 按照BeanPostProcessor实现的优先级接口来分离我们的后置处理器
     */
    //保存实现了priorityOrdered接口的
    List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    //系统内部的
    List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    //实现了我们ordered接口的
    List<String> orderedPostProcessorNames = new ArrayList<>();
    //没有优先级的
    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    //循环我们的bean定义(BeanPostProcessor)
    for (String ppName : postProcessorNames) {
      //若实现了PriorityOrdered接口的
      if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
        //显示的调用getBean流程创建bean的后置处理器
        BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
        //加入到集合中
        priorityOrderedPostProcessors.add(pp);
        //判断是否实现了MergedBeanDefinitionPostProcessor
        if (pp instanceof MergedBeanDefinitionPostProcessor) {
          //加入到集合中
          internalPostProcessors.add(pp);
        }
      }
      //判断是否实现了Ordered
      else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
        orderedPostProcessorNames.add(ppName);
      }
      //没有任何拍下接口的
      else {
        nonOrderedPostProcessorNames.add(ppName);
      }
    }

    // 把实现了priorityOrdered注册到容器中
    sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

    // 处理实现Ordered的bean定义
    List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
    for (String ppName : orderedPostProcessorNames) {
      //显示调用getBean方法
      BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
      //加入到集合中
      orderedPostProcessors.add(pp);
      //判断是否实现了MergedBeanDefinitionPostProcessor
      if (pp instanceof MergedBeanDefinitionPostProcessor) {
        //加入到集合中
        internalPostProcessors.add(pp);
      }
    }
    //排序并且注册我们实现了Order接口的后置处理器
    sortPostProcessors(orderedPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, orderedPostProcessors);

    // 实例化我们所有的非排序接口的
    List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
    for (String ppName : nonOrderedPostProcessorNames) {
      //显示调用
      BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
      nonOrderedPostProcessors.add(pp);
      //判断是否实现了MergedBeanDefinitionPostProcessor
      if (pp instanceof MergedBeanDefinitionPostProcessor) {
        internalPostProcessors.add(pp);
      }
    }
    //注册我们普通的没有实现任何排序接口的
    registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

    //注册.MergedBeanDefinitionPostProcessor类型的后置处理器 bean 合并后的处理, Autowired 注解正是通过此方法实现诸如类型的预解析。
    sortPostProcessors(internalPostProcessors, beanFactory);
    registerBeanPostProcessors(beanFactory, internalPostProcessors);

    //注册ApplicationListenerDetector 应用监听器探测器的后置处理器
    beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
  }

}

5.2 执行扩展点时机

触发执行有9个地方,下面我们来一一讲解

AbstractAutowireCapableBeanFactory 执行扩展点,通过创建bean调用

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {

  @Override
  protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {

    RootBeanDefinition mbdToUse = mbd;

    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
      mbdToUse = new RootBeanDefinition(mbd);
      mbdToUse.setBeanClass(resolvedClass);
    }

    try {
      mbdToUse.prepareMethodOverrides();
    }

    try {
      /**
       * 第1个bean后置处理器
       * 通过bean的后置处理器来进行后置处理生成代理对象,一般情况下在此处不会生成代理对象
       * 为什么不能生成代理对象,不管是我们的jdk代理还是cglib代理都不会在此处进行代理,因为我们的
       * 真实的对象没有生成,所以在这里不会生成代理对象,那么在这一步是我们aop和事务的关键,因为在这里
       * 解析我们的aop切面信息进行缓存
       */
      Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
      if (bean != null) {
        return bean;
      }
    }

    try {
      /**
       * 该步骤是我们真正的创建我们的bean的实例对象的过程
       */
      Object beanInstance = doCreateBean(beanName, mbdToUse, args);
      return beanInstance;
    }
    
  }
}
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {

  @Nullable
  protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
  
    Object bean = null;
    
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
    
      //判断容器中是否有InstantiationAwareBeanPostProcessors
      if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
      
        //获取当前bean 的class对象
        Class<?> targetType = determineTargetType(beanName, mbd);
        if (targetType != null) {
          /**
           * 后置处理器的【第一次】调用 总共有九处调用 事务在这里不会被调用,aop的才会被调用
           * 为啥aop在这里调用了,因为在此处需要解析出对应的切面报错到缓存中
           */
          bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
          //若InstantiationAwareBeanPostProcessors后置处理器的postProcessBeforeInstantiation返回不为null

          //说明生成了代理对象那么我们就调用
          if (bean != null) {
            /**
             * 后置处理器的第二处调用,该后置处理器若被调用的话,那么第一处的处理器肯定返回的不是null
             * InstantiationAwareBeanPostProcessors后置处理器postProcessAfterInitialization
             */

            bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
          }
          
        }
        
      }
      
      mbd.beforeInstantiationResolved = (bean != null);
    }
    return bean;
  }

}

5.2.1 第1⃣️次调用InstantiationAwareBeanPostProcessor

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

  @Nullable
  default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { return null; }
  
  default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { return true; }
  
  @Nullable
  default PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { return pvs; }
  
}
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {
  
  @Nullable
  protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
    /**
     * 获取容器中的所有后置处理器
     */
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
      //判断后置处理器是不是InstantiationAwareBeanPostProcessor
      if (bp instanceof InstantiationAwareBeanPostProcessor) {
        //把我们的BeanPostProcessor强制转为InstantiationAwareBeanPostProcessor
        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
        /**
         * 【很重要】
         * 我们AOP @EnableAspectJAutoProxy 为我们容器中导入了 AnnotationAwareAspectJAutoProxyCreator
         * 我们事务注解@EnableTransactionManagement 为我们的容器导入了 InfrastructureAdvisorAutoProxyCreator
         * 都是实现了我们的 BeanPostProcessor接口,InstantiationAwareBeanPostProcessor,
         * 进行后置处理解析切面
         */
        Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
        if (result != null) {
          return result;
        }
      }
    }
    return null;
  }

}

还没搞清楚为什么全部调用,为什么是第九次调用

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {

  @Override
  public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {

    Object result = existingBean;
    //获取我们容器中的所有的bean的后置处理器
    for (BeanPostProcessor processor : getBeanPostProcessors()) {
      /**
       * 在这里是后置处理器的【第九次调用】 aop和事务都会在这里生存代理对象
       *
       * 【很重要】
       * 我们AOP @EnableAspectJAutoProxy 为我们容器中导入了 AnnotationAwareAspectJAutoProxyCreator
       * 我们事务注解@EnableTransactionManagement 为我们的容器导入了 InfrastructureAdvisorAutoProxyCreator
       * 都是实现了我们的 BeanPostProcessor接口,InstantiationAwareBeanPostProcessor,
       * 在这里实现的是BeanPostProcessor接口的postProcessAfterInitialization来生成我们的代理对象
       */
      Object current = processor.postProcessAfterInitialization(result, beanName);
      //若只有有一个返回null 那么直接返回原始的
      if (current == null) {
        return result;
      }
      result = current;
    }
    return result;
  }
  
}

5.2.2 第2⃣️次调用 SmartInstantiationAwareBeanPostProcessor

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
  @Nullable
  default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException { return null; }

  @Nullable
  default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException { return null;}
 
  default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {return bean;}
}

真的创建bean的逻辑,该方法是最复杂的包含了调用构造函数,给bean的属性赋值。 调用bean的初始化操作以及 生成代理对象 都是在这里

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {

  protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException {

    //BeanWrapper 是对 Bean 的包装,其接口中所定义的功能很简单包括设置获取被包装的对象,获取被包装 bean 的属性描述器
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
      //从没有完成的FactoryBean中移除
      instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
      // 第二处调用后置处理器 SmartInstantiationAwareBeanPostProcessor入口
      //创建bean实例化 使用合适的实例化策略来创建新的实例:工厂方法、构造函数自动注入、简单初始化 该方法很复杂也很重要
      instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    //从beanWrapper中获取我们的早期对象
    final Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
      mbd.resolvedTargetType = beanType;
    }

    // Allow post-processors to modify the merged bean definition.
    synchronized (mbd.postProcessingLock) {
      if (!mbd.postProcessed) {
        try {
          // 第三次调用后置处理器 MergedBeanDefinitionPostProcessor
          //进行后置处理 @AutoWired @Value的注解的预解析
          applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
        }
        catch (Throwable ex) {
          throw new BeanCreationException(mbd.getResourceDescription(), beanName,
              "Post-processing of merged bean definition failed", ex);
        }
        mbd.postProcessed = true;
      }
    }

    /**
     * 缓存单例到三级缓存中,以防循环依赖
     * 判断是否早期引用的Bean,如果是,则允许提前暴露引用
     * 判断是否能够暴露早期对象的条件:
     * 是否单例
     * 是否允许循环依赖
     * 是否正在创建的Bean
     */
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));
    //上述条件满足,允许中期暴露对象
    if (earlySingletonExposure) {
      // 第四次调用后置处理器
      //把我们的早期对象包装成一个singletonFactory对象 该对象提供了一个getObject方法,该方法内部调用getEarlyBeanReference方法
      addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }

    // Initialize the bean instance.
    Object exposedObject = bean;
    try {
      // 第五次次调用后置处理器
      //属性赋值 给我们的属性进行赋值(调用set方法进行赋值)
      populateBean(beanName, mbd, instanceWrapper);
      
      // 第七次调用后置处理器
      //进行对象初始化操作(在这里可能生成代理对象)
      exposedObject = initializeBean(beanName, exposedObject, mbd);
    }
    catch (Throwable ex) {
      if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
        throw (BeanCreationException) ex;
      }
      else {
        throw new BeanCreationException(
            mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
      }
    }

    // 是早期对象暴露
    if (earlySingletonExposure) {
      /**
       * 去缓存中获取到我们的对象 由于传递的allowEarlyReference 是false 要求只能在一级二级缓存中去获取
       * 正常普通的bean(不存在循环依赖的bean) 创建的过程中,压根不会把三级缓存提升到二级缓存中
       */
      Object earlySingletonReference = getSingleton(beanName, false);
      //能够获取到
      if (earlySingletonReference != null) {
        //经过后置处理的bean和早期的bean引用还相等的话(表示当前的bean没有被代理过)
        if (exposedObject == bean) {
          exposedObject = earlySingletonReference;
        }
        //处理依赖的bean
        else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
          String[] dependentBeans = getDependentBeans(beanName);
          Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
          for (String dependentBean : dependentBeans) {
            if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
              actualDependentBeans.add(dependentBean);
            }
          }
          if (!actualDependentBeans.isEmpty()) {
            throw new BeanCurrentlyInCreationException(beanName,
                "Bean with name '" + beanName + "' has been injected into other beans [" +
                StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
                "] in its raw version as part of a circular reference, but has eventually been " +
                "wrapped. This means that said other beans do not use the final version of the " +
                "bean. This is often the result of over-eager type matching - consider using " +
                "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
          }
        }
      }
    }

    // Register bean as disposable.
    try {
      //注册销毁的bean的销毁接口
      registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }
    catch (BeanDefinitionValidationException ex) {
      throw new BeanCreationException(
          mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    }

    return exposedObject;
  }
}
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    
    //从bean定义中解析出当前bean的class对象
    Class<?> beanClass = resolveBeanClass(mbd, beanName);

    //该方法是spring5.0 新增加的  如果存在 Supplier 回调,则使用给定的回调方法初始化策略
    Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
    if (instanceSupplier != null) {
      return obtainFromSupplier(instanceSupplier, beanName);
    }

    /**
     * 工厂方法,我们通过配置类来进行配置的话 采用的就是工厂方法,方法名称就是tulingDao就是我们工厂方法的名称
     * @Bean会在这创建实例
     *  Bean
       public TulingDao tulingDao() {

         return new TulingDao(tulingDataSource());
       }
     */
    if (mbd.getFactoryMethodName() != null) {
      return instantiateUsingFactoryMethod(beanName, mbd, args);
    }

      /**
     * 当多次构建同一个 bean 时,可以使用此处的快捷路径,即无需再次推断应该使用哪种方式构造实例,
     * 以提高效率。比如在多次构建同一个 prototype 类型的 bean 时,就可以走此处的捷径。
     * 这里的 resolved 和 mbd.constructorArgumentsResolved 将会在 bean 第一次实例
     * 化的过程中被设置,在后面的源码中会分析到,先继续往下看。
         */
    //判断当前构造函数是否被解析过
    boolean resolved = false;
    //有没有必须进行依赖注入
    boolean autowireNecessary = false;
    /**
     * 通过getBean传入进来的构造函数是否来指定需要推断构造函数
     * 若传递进来的args不为空,那么就可以直接选出对应的构造函数
     */
    if (args == null) {
      synchronized (mbd.constructorArgumentLock) {
        //判断我们的bean定义信息中的resolvedConstructorOrFactoryMethod(用来缓存我们的已经解析的构造函数或者工厂方法)
        if (mbd.resolvedConstructorOrFactoryMethod != null) {
          //修改已经解析过的构造函数的标志
          resolved = true;
          //修改标记为true 标识构造函数或者工厂方法已经解析过
          autowireNecessary = mbd.constructorArgumentsResolved;
        }
      }
    }
    //若被解析过
    if (resolved) {
      if (autowireNecessary) {
        //通过有参的构造函数进行反射调用
        return autowireConstructor(beanName, mbd, null, null);
      }
      else {
        //调用无参数的构造函数进行创建对象
        return instantiateBean(beanName, mbd);
      }
    }

    /**
     * 通过bean的后置处理器进行选举出合适的构造函数对象
     */
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    /**
     *  如果自定义了BeanPostProcessor返回了构造器   或者
     *  使用构造器自动装配模式                      或者
     *  设置了BeanDefinition构造器参数              或者
     *  有参数:即getBean(String name, Object... args) 中的args
     *
     *        则使用自定义的构造器初始化
     */
    if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
        mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
      //通过构造函数创建对象
      return autowireConstructor(beanName, mbd, ctors, args);
    }

    //使用无参数的构造函数调用创建对象
    return instantiateBean(beanName, mbd);
  }

通过SmartInstantiationAwareBeanPostProcessor的后置处理器的determineCandidateConstructors来查找出对应的构造函数

  @Nullable
  protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
      throws BeansException {
    //beanClass对象不为空 且 ioc容器中有InstantiationAwareBeanPostProcessors的后置处理器
    if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
      //获取到容器中所有的后置处理器BeanPostProcessors
      for (BeanPostProcessor bp : getBeanPostProcessors()) {
        //判断我们的后置处理器是否为SmartInstantiationAwareBeanPostProcessor
        if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
          //强行转化我们的后置处理器SmartInstantiationAwareBeanPostProcessor是他的BeanPostProcessors实现
          SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
            //调用我们后置处理器的determineCandidateConstructors 来决定我们的构造方法
            Constructor<?>[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
            if (ctors != null) {
            return ctors;
          }
        }
      }
    }
    return null;
  }

5.2.3 第3⃣️次MergedBeanDefinitionPostProcessor

  protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
      if (bp instanceof MergedBeanDefinitionPostProcessor) {
        MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
        bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
      }
    }
  }

5.2.4 第4⃣️次 SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

  /**
   * 三级缓存通过函数接口回调方式(即不会立即缓存单例对象,而是等待调用时再返回)
   * 这样做有什么好处呢?
   * 1:延迟获取,提高性能: 因为并不是所有的Bean都存在循环引用(不需要所有单例都缓存起来等待循环依赖调用),
   *     所以当真正调用时再缓存该单例到二级缓存。
   * 2:提高扩展性:这是spring一贯作风,采用bean的后置处理器方式可以提高扩展性(如代理操作等..)
   * 3:aop的考虑:如果依赖的bean是代理类,那么将代理创建的方法作为回调方法。
   * @param beanName the name of the bean (for error handling purposes)
   * @param mbd the merged bean definition for the bean
   * @param bean the raw bean instance
   * @return the object to expose as bean reference
   */
  protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    Object exposedObject = bean;
    //判读我们容器中是否有InstantiationAwareBeanPostProcessors类型的后置处理器
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
      //获取我们所有的后置处理器
      for (BeanPostProcessor bp : getBeanPostProcessors()) {
        //判断我们的后置处理器是不是实现了SmartInstantiationAwareBeanPostProcessor接口
        if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
          //进行强制转换
          SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
          //挨个调用SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference
          exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
        }
      }
    }
    return exposedObject;
  }

5.2.5 第5⃣️次调 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

5.2.6 第6⃣️次调InstantiationAwareBeanPostProcessor#postProcessPropertyValues

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {


    /**
         * 在属性被填充前,给 InstantiationAwareBeanPostProcessor 类型的后置处理器一个修改
         * bean 状态的机会。官方的解释是:让用户可以自定义属性注入。比如用户实现一
         * 个 InstantiationAwareBeanPostProcessor 类型的后置处理器,并通过
         * postProcessAfterInstantiation 方法向 bean 的成员变量注入自定义的信息。
         *当时我们发现系统中的的InstantiationAwareBeanPostProcessor.postProcessAfterInstantiationM没有进行任何处理,
         *若我们自己实现了这个接口 可以自定义处理.....spring 留给我们自己扩展接口的
         *特殊需求,直接使用配置中的信息注入即可。
         */
    boolean continueWithPropertyPopulation = true;
    //是否持有 InstantiationAwareBeanPostProcessor
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
      //获取容器中的所有的BeanPostProcessor
      for (BeanPostProcessor bp : getBeanPostProcessors()) {
        //判断我们的后置处理器是不是InstantiationAwareBeanPostProcessor
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
          //进行强制转化
          InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
          //若存在后置处理器给我们属性赋值了,那么返回false 可以来修改我们的开关变量,就不会走下面的逻辑了
          if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
            // 返回值为是否继续填充 bean
            // postProcessAfterInstantiation:如果应该在 bean上面设置属性则返回 true,否则返回 false
            // 一般情况下,应该是返回true 。
            // 返回 false 的话,将会阻止在此 Bean 实例上调用任何后续的 InstantiationAwareBeanPostProcessor 实
            continueWithPropertyPopulation = false;
            break;
          }
        }
      }
    }
    // 如果后续处理器发出停止填充命令,则终止后续操作
    if (!continueWithPropertyPopulation) {
      return;
    }

    //获取bean定义的属性
    PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

    /**
     * 判断我们的bean的属性注入模型
     * AUTOWIRE_BY_NAME 根据名称注入
     * AUTOWIRE_BY_TYPE 根据类型注入
     */

    if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
      //把PropertyValues封装成为MutablePropertyValues
      MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
      //根据bean的属性名称注入
      if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
        autowireByName(beanName, mbd, bw, newPvs);
      }
      //根据bean的类型进行注入
      if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
        autowireByType(beanName, mbd, bw, newPvs);
      }
      //把处理过的 属性覆盖原来的
      pvs = newPvs;
    }

    /**
         * 这里又是一种后置处理,用于在 Spring 填充属性到 bean 对象前,对属性的值进行相应的处理,
         * 比如可以修改某些属性的值。这时注入到 bean 中的值就不是配置文件中的内容了,
         * 而是经过后置处理器修改后的内容
         */
    boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    //判断是否需要检查依赖
    boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

    if (hasInstAwareBpps || needsDepCheck) {
      if (pvs == null) {
        pvs = mbd.getPropertyValues();
      }
      //提出当前正在创建的beanWrapper 依赖的对象
      PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
      if (hasInstAwareBpps) {
        //获取所有的后置处理器
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
          if (bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
            //对依赖对象进行后置处理
            pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
            if (pvs == null) {
              return;
            }
          }
        }
      }
      //判断是否检查依赖
      if (needsDepCheck) {
        checkDependencies(beanName, mbd, filteredPds, pvs);
      }
    }

    /**
     * 其实,上面只是完成了所有注入属性的获取,将获取的属性封装在 PropertyValues 的实例对象 pvs 中,
     * 并没有应用到已经实例化的 bean 中。而 #applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) 方法,
     * 则是完成这一步骤的
     */
    if (pvs != null) {
      applyPropertyValues(beanName, mbd, bw, pvs);
    }
  }

5.2.7 第7⃣️次调用 后置处理器入口

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
    if (System.getSecurityManager() != null) {
      AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
        invokeAwareMethods(beanName, bean);
        return null;
      }, getAccessControlContext());
    }
    else {
      //若我们的bean实现了XXXAware接口进行方法的回调
      invokeAwareMethods(beanName, bean);
    }

    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
      //调用我们的bean的后置处理器的postProcessorsBeforeInitialization方法  @PostCust注解的方法
      wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }

    try {
      //调用初始化方法
      invokeInitMethods(beanName, wrappedBean, mbd);
    }
    catch (Throwable ex) {
      throw new BeanCreationException(
          (mbd != null ? mbd.getResourceDescription() : null),
          beanName, "Invocation of init method failed", ex);
    }
    if (mbd == null || !mbd.isSynthetic()) {
      //调用我们bean的后置处理器的PostProcessorsAfterInitialization方法
      wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    return wrappedBean;
  }

5.2.8第7⃣️次BeanPostProcessor#postProcessBeforeInitialization

  @Override
  public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
      throws BeansException {

    Object result = existingBean;
    //获取我们容器中的所有的bean的后置处理器
    for (BeanPostProcessor processor : getBeanPostProcessors()) {
      //挨个调用我们的bean的后置处理器的postProcessBeforeInitialization
      Object current = processor.postProcessBeforeInitialization(result, beanName);
      //若只有有一个返回null 那么直接返回原始的
      if (current == null) {
        return result;
      }
      result = current;
    }
    return result;
  }

5.2.8 第8⃣️次BeanPostProcessor#postProcessAfterInitialization

  @Override
  public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
      throws BeansException {

    Object result = existingBean;
    //获取我们容器中的所有的bean的后置处理器
    for (BeanPostProcessor processor : getBeanPostProcessors()) {
      /**
       * 在这里是后置处理器的【第九次调用】 aop和事务都会在这里生存代理对象
       *
       * 【很重要】
       * 我们AOP @EnableAspectJAutoProxy 为我们容器中导入了 AnnotationAwareAspectJAutoProxyCreator
       * 我们事务注解@EnableTransactionManagement 为我们的容器导入了 InfrastructureAdvisorAutoProxyCreator
       * 都是实现了我们的 BeanPostProcessor接口,InstantiationAwareBeanPostProcessor,
       * 在这里实现的是BeanPostProcessor接口的postProcessAfterInitialization来生成我们的代理对象
       */
      Object current = processor.postProcessAfterInitialization(result, beanName);
      //若只有有一个返回null 那么直接返回原始的
      if (current == null) {
        return result;
      }
      result = current;
    }
    return result;
  }

5.2.9 第9⃣️次调用 DestructionAwareBeanPostProcessor#requiresDestruction

  protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {
    AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);
    if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {
      if (mbd.isSingleton()) {
        // Register a DisposableBean implementation that performs all destruction
        // work for the given bean: DestructionAwareBeanPostProcessors,
        // DisposableBean interface, custom destroy method.
        registerDisposableBean(beanName,
            new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
      }
      else {
        // A bean with a custom scope...
        Scope scope = this.scopes.get(mbd.getScope());
        if (scope == null) {
          throw new IllegalStateException("No Scope registered for scope name '" + mbd.getScope() + "'");
        }
        scope.registerDestructionCallback(beanName,
            new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
      }
    }
  }
public DisposableBeanAdapter(Object bean, String beanName, RootBeanDefinition beanDefinition,
      List<BeanPostProcessor> postProcessors, @Nullable AccessControlContext acc) {

    Assert.notNull(bean, "Disposable bean must not be null");
    this.bean = bean;
    this.beanName = beanName;
    this.invokeDisposableBean =
        (this.bean instanceof DisposableBean && !beanDefinition.isExternallyManagedDestroyMethod("destroy"));
    this.nonPublicAccessAllowed = beanDefinition.isNonPublicAccessAllowed();
    this.acc = acc;
    String destroyMethodName = inferDestroyMethodIfNecessary(bean, beanDefinition);
    if (destroyMethodName != null && !(this.invokeDisposableBean && "destroy".equals(destroyMethodName)) &&
        !beanDefinition.isExternallyManagedDestroyMethod(destroyMethodName)) {
      this.destroyMethodName = destroyMethodName;
      this.destroyMethod = determineDestroyMethod(destroyMethodName);
      if (this.destroyMethod == null) {
        if (beanDefinition.isEnforceDestroyMethod()) {
          throw new BeanDefinitionValidationException("Could not find a destroy method named '" +
              destroyMethodName + "' on bean with name '" + beanName + "'");
        }
      }
      else {
        Class<?>[] paramTypes = this.destroyMethod.getParameterTypes();
        if (paramTypes.length > 1) {
          throw new BeanDefinitionValidationException("Method '" + destroyMethodName + "' of bean '" +
              beanName + "' has more than one parameter - not supported as destroy method");
        }
        else if (paramTypes.length == 1 && boolean.class != paramTypes[0]) {
          throw new BeanDefinitionValidationException("Method '" + destroyMethodName + "' of bean '" +
              beanName + "' has a non-boolean parameter - not supported as destroy method");
        }
      }
    }
    this.beanPostProcessors = filterPostProcessors(postProcessors, bean);
  }
class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {

  @Nullable
  private List<DestructionAwareBeanPostProcessor> filterPostProcessors(List<BeanPostProcessor> processors, Object bean) {
    List<DestructionAwareBeanPostProcessor> filteredPostProcessors = null;
    if (!CollectionUtils.isEmpty(processors)) {
      filteredPostProcessors = new ArrayList<>(processors.size());
      for (BeanPostProcessor processor : processors) {
        if (processor instanceof DestructionAwareBeanPostProcessor) {
          DestructionAwareBeanPostProcessor dabpp = (DestructionAwareBeanPostProcessor) processor;
          if (dabpp.requiresDestruction(bean)) {
            filteredPostProcessors.add(dabpp);
          }
        }
      }
    }
    return filteredPostProcessors;
  }
  
}

5.总结

未完待定

6.Links

这里使用无序列表放一些外部链接。