Spring 容器原理 注册BeanPostProcessor

314 阅读1分钟

registerBeanPostProcessors(beanFactory)

Spring 会在实例化Bean之前注册BeanPostProcessor

Instantiate and register all BeanPostProcessor beans, respecting explicit order if given.
Must be called before any instantiation of application beans.

实例化并注册所有BeanPostProcessor Bean,并遵循显式顺序(如果有的话)。
必须在任何实例化应用程序Bean之前调用它。

源码分析

PostProcessorRegistrationDelegate

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

	// 1、获取所有注入的 BeanPostProcessor 实现类的类名
      String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

      // Register BeanPostProcessorChecker that logs an info message when
      // a bean is created during BeanPostProcessor instantiation, i.e. when
      // a bean is not eligible for getting processed by all BeanPostProcessors.
      int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
      beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

	// 2、根据是否实现优先级接口PriorityOrdered 和 Ordered接口进行分类
      // Separate between BeanPostProcessors that implement PriorityOrdered,
      // Ordered, and the rest.
      List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
      List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
      List<String> orderedPostProcessorNames = new ArrayList<>();
      List<String> nonOrderedPostProcessorNames = new ArrayList<>();
      for (String ppName : postProcessorNames) {
          if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
              BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
              priorityOrderedPostProcessors.add(pp);
              if (pp instanceof MergedBeanDefinitionPostProcessor) {
                  internalPostProcessors.add(pp);
              }
          }
          else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
              orderedPostProcessorNames.add(ppName);
          }
          else {
              nonOrderedPostProcessorNames.add(ppName);
          }
      }

	// 3、注册实现 PriorityOrdered 接口的 BeanPostProcessors
      // First, register the BeanPostProcessors that implement PriorityOrdered.
      sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
      registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
	// 4、注册实现 Ordered 接口的 BeanPostProcessors
      // Next, register the BeanPostProcessors that implement Ordered.
      List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
      for (String ppName : orderedPostProcessorNames) {
          BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
          orderedPostProcessors.add(pp);
          if (pp instanceof MergedBeanDefinitionPostProcessor) {
              internalPostProcessors.add(pp);
          }
      }
      sortPostProcessors(orderedPostProcessors, beanFactory);
      registerBeanPostProcessors(beanFactory, orderedPostProcessors);

	// 5、注册未实现排序接口的 BeanPostProcessors
      // Now, register all regular BeanPostProcessors.
      List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
      for (String ppName : nonOrderedPostProcessorNames) {
          BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
          nonOrderedPostProcessors.add(pp);
          if (pp instanceof MergedBeanDefinitionPostProcessor) {
              internalPostProcessors.add(pp);
          }
      }
      registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
	// 6、再次注册内部的 BeanPostProcessors 即 MergedBeanDefinitionPostProcessor
      // Finally, re-register all internal BeanPostProcessors.
      sortPostProcessors(internalPostProcessors, beanFactory);
      registerBeanPostProcessors(beanFactory, internalPostProcessors);
	// 7、注册 ApplicationListenerDetector 事件监听器检查器,其作用是在Bean 初始化完成后判断Bean 是否未事件监听器,并对事件监听器进行注册。
      // Re-register post-processor for detecting inner beans as ApplicationListeners,
      // moving it to the end of the processor chain (for picking up proxies etc).
      beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
  }