Spring源码解析<五> refresh() 阶段二

515 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

public void refresh() throws BeansException, IllegalStateException {
    synchronized(this.startupShutdownMonitor) {
     
        try {
            .....
            // 5. 执行BeanFactory后置处理器
            this.invokeBeanFactoryPostProcessors(beanFactory);
            .....
        }

    }
}

五、执行BeanFactory后置处理器(invokeBeanFactoryPostProcessors)

先获取所有Bean工厂后处理器再执行

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
   beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
   beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}

image.png

5.1~5.4 执行DefinitionRegistryPostProcessor(执行注册表后置处理器)

Set<String> processedBeans = new HashSet<>();
//如果beanFactory是注册器
if (beanFactory instanceof BeanDefinitionRegistry) {
   BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
   List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
   List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
   //5.1遍历所有beanFactory后置处理器,找出BeanDefinition后置处理器
   for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
      if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
         BeanDefinitionRegistryPostProcessor registryProcessor =
               (BeanDefinitionRegistryPostProcessor) postProcessor;
         //5.1.1执行BeanDefinition后置处理器方法      
         registryProcessor.postProcessBeanDefinitionRegistry(registry);
         registryProcessors.add(registryProcessor);
      }
      else {
         regularPostProcessors.add(postProcessor);
      }
   }

   // Do not initialize FactoryBeans here: We need to leave all regular beans
   // uninitialized to let the bean factory post-processors apply to them!
   // Separate between BeanDefinitionRegistryPostProcessors that implement
   // PriorityOrdered, Ordered, and the rest.
   List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

   // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
   //5.2从注册表中获取所有BeanDefinition后置处理器
   String[] postProcessorNames =
         beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
   for (String ppName : postProcessorNames) {
       //5.2.1找出实现了PriorityOrdered接口的BeanDefinition后置处理器
      if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
         //5.2.2实例化实现了PriorityOrdered接口的BeanDefinition后置处理器
         currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
         processedBeans.add(ppName);
      }
   }
   //5.2.3 对实现了PriorityOrdered接口的BeanDefinition后置处理器进行排序
   sortPostProcessors(currentRegistryProcessors, beanFactory);
   //5.2.4 添加进待执行列表中
   registryProcessors.addAll(currentRegistryProcessors);
   //5.2.5 执行BeanDefinition后置处理器方法 
   invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
   //5.2.6 清空待执行列表 
   currentRegistryProcessors.clear();

   // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
   //5.3从注册表中获取所有BeanDefinition后置处理器
   postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
   for (String ppName : postProcessorNames) {
       //5.3.1找出实现了Ordered接口的BeanDefinition后置处理器
      if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
         //5.3.2实例化实现了Ordered接口的BeanDefinition后置处理器
         currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
         processedBeans.add(ppName);
      }
   }
   //5.3.3 对实现了Ordered接口的BeanDefinition后置处理器进行排序
   sortPostProcessors(currentRegistryProcessors, beanFactory);
   //5.3.4 添加进待执行列表中
   registryProcessors.addAll(currentRegistryProcessors);
   //5.3.5 执行BeanDefinition后置处理器方法
   invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
   //5.3.6 清空待执行列表 
   currentRegistryProcessors.clear();

   // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
   boolean reiterate = true;
   while (reiterate) {
      reiterate = false;
      //5.4从注册表中获取所有BeanDefinition后置处理器
      postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      //5.4.1找出没有执行过的(没有实现PriorityOrdered和Ordered接口)BeanDefinition后置处理器
      for (String ppName : postProcessorNames) {
         if (!processedBeans.contains(ppName)) {
            //5.4.2实例化没有执行过的的BeanDefinition后置处理器
            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
            processedBeans.add(ppName);
            reiterate = true;
         }
      }
      //5.4.3 对没有执行过的BeanDefinition后置处理器进行排序
      sortPostProcessors(currentRegistryProcessors, beanFactory);
      //5.4.4 添加进待执行列表中
      registryProcessors.addAll(currentRegistryProcessors);
      //5.4.5 执行BeanDefinition后置处理器方法 
      invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
      //5.4.6 清空待执行列表 
      currentRegistryProcessors.clear();
   }

   // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
   //5.5执行BeanFactory后置处理器(实现了BeanDefinition后置处理器)
   invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
   //5.5执行BeanFactory后置处理器(没有实现BeanDefinition后置处理器)
   invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}else {
   //5.5执行BeanFactory后置处理器
   invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}

5.1.1 【重要组件】ConfigurationClassPostProcessor

详细解析地址: juejin.cn/post/720401…

5.1.1.1 创建时机

AnnotatedBeanDefinitionReader在AnnotationConfigServletWebServerApplicationContext的构造器中被创建

ConfigurationClassPostProcessor的BeanDefinition是在AnnotatedBeanDefinitionReader的构造器中被放入注册表中的,并且在5.2.2时被创建

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
   Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
   Assert.notNull(environment, "Environment must not be null");
   this.registry = registry;
   this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
   //注册ConfigurationClassPostProcessor
   AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}

5.1.1.2 执行时机

ConfigurationClassPostProcessor在5.2.5时会执行postProcessBeanDefinitionRegistry会加载包下所有配置类

5.4~5.9 执行BeanFactoryPostProcessor(执行BeanFactory后置处理器)

//5.6获取注册表中BeanFactoryPostProcessor后置处理器
String[] postProcessorNames =
      beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
    //如果processedBeans中有说明已经执行过了(在5.5中)
   if (processedBeans.contains(ppName)) {
     
   }//如果PriorityOrdered接口
   else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
      //5.7创建Bean
      priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
   }//如果Ordered接口
   else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
      orderedPostProcessorNames.add(ppName);
   }//不需要排序的接口
   else {
      nonOrderedPostProcessorNames.add(ppName);
   }
}

//5.7.1对PriorityOrdered接口的进行排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//5.7.2执行BeanFactoryPostProcessors后置处理器
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String postProcessorName : orderedPostProcessorNames) {
    //5.8创建Bean
   orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
//5.8.1对Ordered接口的进行排序
sortPostProcessors(orderedPostProcessors, beanFactory);
//5.8.2执行BeanFactoryPostProcessors后置处理器
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);


List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String postProcessorName : nonOrderedPostProcessorNames) {
   //5.9创建Bean
   nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
//5.9.1执行BeanFactoryPostProcessors后置处理器
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

//5.10 清除缓存
beanFactory.clearMetadataCache();

image.png

总结:

  1. 所有的BeanDefinitionRegistryPostProcessor被执行,接着会执行所有的BeanFactoryPostProcessor
  2. ConfigurationClassPostProcessor在这里会被创建,然后会加载包下所有配置类(@ComponentScan)