spring系列12:registerBeanPostProcessors

前言

执行了 BeanFactory 后置处理器后,Spring 开始准备实例化 Bean。在这之前,Spring 先添加 Bean 后置处理器 BeanPostProcessor,因为 BeanPostProcessor 会在实例化 Bean 使用,所以在这之前实例化,不管是 Spring 内置的,还是程序员提供的,都会在这一步添加到 BeanFactory

registerBeanPostProcessors

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
   PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

又是这个类 PostProcessorRegistrationDelegate,前面 BeanFactory 后置处理器注册也是由这个类完成。

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

   // 找出所有的实现了 BeanPostProcessor 接口的 BeanDefinition
   String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);


   int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
   beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

   // 保存同时实现了 PriorityOrdered 接口的 BeanPostProcessor
   List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
   // 同时实现 MergedBeanDefinitionPostProcessor 接口 BeanPostProcessor 标记为内部 BeanPostProcessor
   List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
   // 保存同时实现了 Ordered 接口的 BeanPostProcessor
   List<String> orderedPostProcessorNames = new ArrayList<>();
   // 保存没有实现 Ordered 或 PriorityOrdered 接口的 BeanPostProcessor
   List<String> nonOrderedPostProcessorNames = new ArrayList<>();
   // 对找出的 BeanPostProcessor 分类,并实例化实现了 PriorityOrdered 接口的 BeanPostProcessor
   for (String ppName : postProcessorNames) {
      if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
         // 实例化 BeanPostProcessor
         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);
      }
   }


   // 排序
   sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
   // 注册到 BeanFactory
   registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

   // 实例化实现了 Ordered 接口的 BeanPostProcessor
   List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
   for (String ppName : orderedPostProcessorNames) {
      BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
      orderedPostProcessors.add(pp);
      if (pp instanceof MergedBeanDefinitionPostProcessor) {
         internalPostProcessors.add(pp);
      }
   }
   // 排序
   sortPostProcessors(orderedPostProcessors, beanFactory);
   // 注册到 BeanFactory
   registerBeanPostProcessors(beanFactory, orderedPostProcessors);

   // 实例化普通的 BeanPostProcessor
   List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
   for (String ppName : nonOrderedPostProcessorNames) {
      BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
      nonOrderedPostProcessors.add(pp);
      if (pp instanceof MergedBeanDefinitionPostProcessor) {
         internalPostProcessors.add(pp);
      }
   }
   // 注册到 BeanFactory
   registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);


   // 最后对内置的 BeanPostProcessor 排序
   sortPostProcessors(internalPostProcessors, beanFactory);
   // 注册到 BeanFactory
   registerBeanPostProcessors(beanFactory, internalPostProcessors);

   // 注册一个监听器
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

如果你仔细看过前面注册 BeanFactory 后置处理器逻辑,在这里一定不会陌生,几乎一模一样。不过这里并不会执行 Bean 后置处理器,就行方法的名字一样,只是注册到 BeanFactory.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值