Spring源码阅读(五)registerBeanPostProcessors

直接上源码

public static void registerBeanPostProcessors(
      ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
   // 根据类型获取bean中所有的BeanPostProcessor		
   String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

   // 计算BPP的目标数量
   int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
   // 添加BeanPostProcessorChecker,用来检查BPP
   beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

   // 存放实现PriorityOrdered的BPP容器
   List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
   // 存放Spring内部的BPP容器
   List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
   // 存放实现Ordered的BPP名称容器
   List<String> orderedPostProcessorNames = new ArrayList<String>();
   // 存放其他的BPP名称容器
   List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
   // 遍历所有的BPP
   for (String ppName : postProcessorNames) {
      // 如果BPP实现PriorityOrdered,则实例化BPP并添加到priorityOrderedPostProcessors中
      if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
         BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
         priorityOrderedPostProcessors.add(pp);
         // 如果同时实现了MergedBeanDefinitionPostProcessor,则添加到internalPostProcessors中
         if (pp instanceof MergedBeanDefinitionPostProcessor) {
            internalPostProcessors.add(pp);
         }
      }
      // 如果BPP实现ordered,则将BPP名称添加到orderedPostProcessorNames中
      else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
         orderedPostProcessorNames.add(ppName);
      }
      // 其他的BPP名称添加到nonOrderedPostProcessorNames中
      else {
         nonOrderedPostProcessorNames中.add(ppName);
      }
   }

   // 排序
   sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
   // 注册实现了PriorityOrdered的BPP
   registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

   // 遍历实现了Ordered的BPP名称,根据名称进行实例化,并添加到orderedPostProcessors中。
   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);
      }
   }
   // 排序并注册实现了Ordered的BPP
   sortPostProcessors(beanFactory, orderedPostProcessors);
   registerBeanPostProcessors(beanFactory, orderedPostProcessors);

   // 注册其他的BPP,过程与实现Ordered的BPP过程相同,但是不需要排序
   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);

   // 注册所有的内部BPP
   sortPostProcessors(beanFactory, internalPostProcessors);
   registerBeanPostProcessors(beanFactory, internalPostProcessors);
   // 重新注册ApplicationListenerDetector
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

代码块分析

  1. 代码registerBeanPostProcessors

    private static void registerBeanPostProcessors(
    			ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {
    		// 遍历所有的BPp
    		for (BeanPostProcessor postProcessor : postProcessors) {
                // 将BPP注册到beanFactory中
    			beanFactory.addBeanPostProcessor(postProcessor);
    		}
    	}
    
    1. 代码addBeanPostProcessor

      public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
         Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
         // 移除原有的BPP
         this.beanPostProcessors.remove(beanPostProcessor);
         // 将BPP添加到beanPostProcessors缓存中
         this.beanPostProcessors.add(beanPostProcessor);
         // 如果实现了InstantiationAwareBeanPostProcessor,则将属性hasInstantiationAwareBeanPostProcessors设置为true
         if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
            this.hasInstantiationAwareBeanPostProcessors = true;
         }
         // 如果实现了DestructionAwareBeanPostProcessor,则将属性hasDestructionAwareBeanPostProcessors设置为true
         if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
            this.hasDestructionAwareBeanPostProcessors = true;
         }
      }
      

    总结

这一步是将BPP添加到容器中的beanPostProcessors缓存中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值