spring IOC 源码阅读(四)之registerBeanPostProcessors(beanFactory)

6 篇文章 0 订阅
6 篇文章 0 订阅

执行完BeanFactoryPostProcessors之后,就要向容器中注册BeanPostProcessor了

  1. 首先获取到所有BeanPostProcessor的名称
  2. 遍历这些BeanPostProcessor
    1. 如果是PriorityOrdered级别的,那就创建这个bean并添加到priorityOrderedPostProcessors 集合中区
    2. 如果是Ordered级别的,则将beanName添加到orderedPostProcessorNames 集合中
    3. 如果既不是PriorityOrdered级别又不是Ordered级别,则将beanName添加到nonOrderedPostProcessorNames 集合中
  3. 将priorityOrderedPostProcessors 集合中的BeanPostProcessor注册到spring容器中
  4. 将orderedPostProcessorNames 集合中的beanName创建对应的bean对象,然后再注册到spring容器中
  5. 最后将nonOrderedPostProcessorNames 集合中的beanName创建对应的bean对象,然后再注册到spring容器中
public static void registerBeanPostProcessors(
      ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
   //从beanFactory中获取所有BeanPostProcessor.class类型的bean的名称
   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));

   //将BeanPostProcessor进行分类
   //用于存放有PriorityOrdered级别的BeanPostProcessor的bean对象
   List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
   List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
   //用于存放Ordered级别的BeanPostProcessor的bean的名称
   List<String> orderedPostProcessorNames = new ArrayList<String>();
   //用于存放既没有PriorityOrdered.class又没有Ordered.class注解的bean的名称
   List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
   for (String ppName : postProcessorNames) {
      if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
          //如果bean名称为ppName的bean是PriorityOrdered级别的
          //则通过beanFactory获取当前ppName的bean,并添加到priorityOrderedPostProcessors集合中区
         BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
         priorityOrderedPostProcessors.add(pp);
         if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
         }
      }
      else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
          //如果如果bean名称为ppName的bean是Ordered级别
          //则添加到orderedPostProcessorNames集合中
         orderedPostProcessorNames.add(ppName);
      }
      else {
          //将既不是PriorityOrdered又不是Ordered级别的添加到nonOrderedPostProcessorNames集合中
         nonOrderedPostProcessorNames.add(ppName);
      }
   }

    //首先将priorityOrderedPostProcessors集合中的BeanPostProcessor注册到容器中
   //对priorityOrderedPostProcessors集合的bean进行排序
   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
   //对排序后的priorityOrderedPostProcessors注册到beanFactory
   registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

   // 然后创建并注册order级别的BeanPostProcessor.
   List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
   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);

   // 最后创建并注册剩余的BeanPostProcessor
   List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
   for (String ppName : nonOrderedPostProcessorNames) {
      BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
      nonOrderedPostProcessors.add(pp);
      if (pp instanceof MergedBeanDefinitionPostProcessor) {
         internalPostProcessors.add(pp);
      }
   }
   registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

   // Finally, re-register all internal BeanPostProcessors.
   sortPostProcessors(internalPostProcessors, beanFactory);
   registerBeanPostProcessors(beanFactory, internalPostProcessors);

   // 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));
}

spring IOC 源码阅读(五)之初始化传播器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值