Spring IOC容器初始化原理分析 (第二节)

405 阅读3分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

1.前言

本篇文章是续接上篇文章Spring IOC容器初始化原理分析 (第一节)的,如有疑惑可先看下上篇,或者找我探讨都可以。

2.refresh() 源码续讲

这里就贴张图吧,如果需要复制代码,可前往Spring IOC容器初始化原理分析 (第一节)

refresh.jpg

3. 方法 2.4 postProcessBeanFactory 详解

这个方法官方的定义是:在应用程序上下文的标准初始化之后修改其内部bean工厂。将加载所有bean定义,但还没有实例化bean。这允许在特定的ApplicationContext实现中注册特殊的BeanPostProcessors等

它在 org.springframework.context.support.AbstractApplicationContext 中默认是一个空实现,源码如下

图片.png 这个类主要是spring官方交给我们自定义去扩展的,可以实现一些自定义的功能,这里我们就不自定义了,看一下通常web项目下即(AbstractRefreshableWebApplicationContext)默认实现

图片.png

protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    //添加ServletContextAwareProcessor后置处理器
    //实现ServletContextAwareProcessor即可 取得servletContext
    beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext, this.servletConfig));
    //忽略自动注入,对于自动装配,忽略给定的依赖接口。
    beanFactory.ignoreDependencyInterface(ServletContextAware.class);
    beanFactory.ignoreDependencyInterface(ServletConfigAware.class);
    //注册web
    WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
    //注册和上下文环境相关的bean
    WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);
}

4. 方法( 2.5 invokeBeanFactoryPostProcessors) 详解

这个方法主要的作用就是:实例化和调用所有已注册的BeanFactoryPostProcessor ,按照指定的顺序(即BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类,在执行时,会比BeanFactoryPostProcessor先执行。)

BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在单例bean实例化之前,读取它的配置信息,并可以修改它。

源代码如下:

图片.png

  • 它的核心方法就是 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()) ,在讲他之前 我们先讲一下 getBeanFactoryPostProcessors()
  • 后面的if代码块: 判断如果当前beanFactory的临时类加载器为null且beanFactory包含loadTimeWeaver这个bean 就给它添加一个LoadTimeWeaverAwareProcessor处理器,设置一下默认的临时类加载器
  1. 首先先讲一下 getBeanFactoryPostProcessors() 方法

图片.png 这个方法的作用主要是:获取自定义的beanFactoryPostProcessor。何为自定义? 即不通过注解(如 @Autowired)形式扫描获取,而是通过手动context.addBeanFactoryPostProcessor(beanFactoryPostProcessor)完成自定义,默认该列表为null

  1. 然后我们再来着重分析下 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()) 这个方法

当前的beanFactory 默认是 DefaultListableBeanFactory 至于为啥是这个,上一讲我已经讲过了,这里看一下它的继承关系图,方便下面我们源码分析用。 图一如下:

图片.png

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

   Set<String> processedBeans = new HashSet<>();

   //判断是否含有BeanDefinitionRegistry这个类型的,如过是则进入,默认情况下是DefaultListableBeanFactory 
   //如图一可知,它实现了BeanDefinitionRegistry
   if (beanFactory instanceof BeanDefinitionRegistry) {
       //转成BeanDefinitionRegistry类型
      BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      // 记录通过硬编码方式注册的BeanFactoryPostProcessor 类型的处理器
      List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
      // 记录通过硬编码方式注册的BeanDefinitionRegistryPostProcessor  类型的处理器
      List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

      //遍历beanFactoryPostProcessors 
      for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
          //判断是否属于BeanDefinitionRegistryPostProcessor
         if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
            BeanDefinitionRegistryPostProcessor registryProcessor =
                  (BeanDefinitionRegistryPostProcessor) postProcessor;
               // 在应用程序上下文的标准初始化之后修改其内部bean定义注册表。将加载所有常规bean定义,但还没有实例化bean。
               //仅对 BeanDefinitionRegistry 子类的BeanFactory 起作用
            registryProcessor.postProcessBeanDefinitionRegistry(registry);
            registryProcessors.add(registryProcessor);
         }
         else {
            regularPostProcessors.add(postProcessor);
         }
      }

      // Do not initialize FactoryBeans here: We need to leave all regular beans
      //不要在这里初始化FactoryBeans:我们需要保留所有常规Bean
      // uninitialized to let the bean factory post-processors apply to them!
      //未初始化以让bean工厂后处理器应用于它们
      // Separate between BeanDefinitionRegistryPostProcessors that implement
      // PriorityOrdered, Ordered, and the rest.
      // 记录通过配置方式注册的 BeanDefinitionRegistryPostProcessor  类型的处理器
      List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

        // 首先,调用实现PriorityOrdered的BeanDefinitionRegistryPostProcessor。
      // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
      
      //获取所有 属于BeanDefinitionRegistryPostProcessor该类型的 beanName
      String[] postProcessorNames =
            beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      for (String ppName : postProcessorNames) {
      //判断它是否实现了PriorityOrdered
         if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
             // 记录到currentRegistryProcessors中
            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
            processedBeans.add(ppName);
         }
      }
      // 对currentRegistryProcessors里面的元素进行排序
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      registryProcessors.addAll(currentRegistryProcessors);
     
    //registryProcessors中保存了所有执行过 postProcessBeanDefinitionRegistry方法的bean,
    //现在再来执行这些currentRegistryProcessors 中所有bean 的 postProcessBeanDefinitionRegistry 方法
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      //清空 currentRegistryProcessors
      currentRegistryProcessors.clear();

        
      // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
      
      //这个和上面的一样只不过把 PriorityOrdered.class换成了Ordered.class这样就保证了 他们的执行顺序 PriorityOrdered, Ordered, and the rest.(ps:最先执行的是BeanDefinitionRegistryPostProcessor,然后在是它们)
      postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      for (String ppName : postProcessorNames) {
         if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
            processedBeans.add(ppName);
         }
      }
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      registryProcessors.addAll(currentRegistryProcessors);
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      currentRegistryProcessors.clear();

      // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
      //最后,调用所有其他的BeanDefinitionRegistryPostProcessors,直到没有调用为止
      
      boolean reiterate = true;
      while (reiterate) {
         reiterate = false;
         //这里获取所有没有实现排序的 BeanDefinitionRegistryPostProcessor 调用它们的 postProcessBeanDefinitionRegistry 方法 进行激活
         postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
         for (String ppName : postProcessorNames) {
            if (!processedBeans.contains(ppName)) {
               currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
               processedBeans.add(ppName);
               reiterate = true;
            }
         }
         sortPostProcessors(currentRegistryProcessors, beanFactory);
         registryProcessors.addAll(currentRegistryProcessors);
         invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
         currentRegistryProcessors.clear();
      }

      // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
      
        // 到这里,所有的 BeanDefinitionRegistryPostProcessor 的postProcessBeanDefinitionRegistry 都已经激活结束,开始激活 postProcessBeanFactory 方法
      invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
      // registryProcessors 记录的是硬编码注入的BeanDefinitionRegistryPostProcessor,这里激活的是 postProcessBeanFactory 方法
      invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
      // 至此处理完beanFactory是这种类型BeanDefinitionRegistry
   }

   else {
      // Invoke factory processors registered with the context instance.
      //调用注册到上下文实例的工厂处理程序。
      //当 beanFactory instanceof BeanDefinitionRegistry = false,即
     BeanDefinitionRegistryPostProcessor.的postProcessBeanDefinitionRegistry 并不生效,就直接激活postProcessBeanFactory方法即可。
      invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
   }

   // Do not initialize FactoryBeans here: We need to leave all regular beans
   // uninitialized to let the bean factory post-processors apply to them!
   
   //获取所有的后置处理器的beanName
   String[] postProcessorNames =
         beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

   // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
   // Ordered, and the rest.
   
   //创建不同的排序集合,按照PriorityOrdered、Ordered、默认 这样的顺序调用
   List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
   List<String> orderedPostProcessorNames = new ArrayList<>();
   List<String> nonOrderedPostProcessorNames = new ArrayList<>();
   for (String ppName : postProcessorNames) {
      if (processedBeans.contains(ppName)) {
         // skip - already processed in first phase above
         // 如果processedBeans包含这个ppName,说明已经处理过了  此处跳过即可
      }
      // 否则判断它们实现的排序类型,分别加到对应的list中去
      else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
         priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
      }
      else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
         orderedPostProcessorNames.add(ppName);
      }
      else {
         nonOrderedPostProcessorNames.add(ppName);
      }
   }

   // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
   
   // 这里是先排序,然后先执行实现了PriorityOrdered的BeanFactoryPostProcess
   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
   invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

   // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
   
   //处理实现了 Ordered接口的BeanFactoryPostProcess
   List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
   for (String postProcessorName : orderedPostProcessorNames) {
      orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
   }
   sortPostProcessors(orderedPostProcessors, beanFactory);
   invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

   // Finally, invoke all other BeanFactoryPostProcessors.
   // 最后处理默认的
   List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
   for (String postProcessorName : nonOrderedPostProcessorNames) {
      nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
   }
   invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

   // Clear cached merged bean definitions since the post-processors might have
   // modified the original metadata, e.g. replacing placeholders in values...
   
   // 清除缓存
   beanFactory.clearMetadataCache();
}

5 小结

  1. BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor 区别:
  • 它们都属于Spring的后置处理器,可以实现它们以达到动态注册bean定义,动态修改bean定义,以及动态修改bean。

  • BeanDefinitionRegistryPostProcessor 的postProcessBeanDefinitionRegistry 方法针对是BeanDefinitionRegistry类型的ConfigurableListableBeanFactory,可以实现对BeanDefinition的增删改查等操作,但是对于非 ConfigurableListableBeanFactory 类型的BeanFactory,并不起作用。

  • BeanFactoryPostProcessor .postProcessBeanFactory 针对的是所有的BeanFactory。

  • postProcessBeanDefinitionRegistry 的调用时机在postProcessBeanFactory 之前。

  1. 心理小得 刚开始看这个方法,确实挺长的,吓我一跳,后面慢慢花时间,一点一点去啃,最终也算是把它大概弄懂了,其中有不对的地方,欢迎大家指出来。下一篇将着重讲解 2.6 registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) 方法