前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring 后置处理器回调

spring 后置处理器回调

作者头像
平凡的学生族
发布2019-05-25 09:20:19
7600
发布2019-05-25 09:20:19
举报
文章被收录于专栏:后端技术后端技术后端技术

工厂后置处理器 BeanFactoryPostProcessor

阅读BeanFactoryPostProcessor详解

  • BeanFactoryPostProcessor接口与 BeanPostProcessor接口类似,可以对bean的定义(配置元数据)进行处理。也就是说,BeanFactoryPostProcessor调用的时候,bean的定义已经被解析成BeanDefinition,并保存在一个ConcurrentMap内(通过xml或注解的方式)。此时,一切Bean还没被初始化,仅仅只是有BeanDefinition
  • BeanFactoryPostProcessor的实现类,通过”order”控制执行次序(要实现Ordered接口)。

后置处理器回调

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 代码太长就不贴出来了,请读者自行对着源码看吧。这个函数的作用,顾名思义,就是调用BeanFactoryPostProcessors(BeanFactory的后置处理器)。 首先我们思考,这个函数应该怎么写:

  1. BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类,且自己也有一个需要被回调的方法。
  • BeanFactoryPostProcessors需要回调postProcessBeanFactory
  • BeanDefinitionRegistryPostProcessor除了要回调父类的postProcessBeanFactory,还要回调postProcessBeanDefinitionRegistry
  1. 有的BeanFactoryPostProcessor是系统定义的,有的则是用户定义的。
  2. 按照约定,所有BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry都要在所有BeanFactoryPostProcessors.postProcessBeanFactory之前被回调

然后分析代码:

  1. 在调用该函数时,传入的getBeanFactoryPostProcessors()应该是spring内部设置的,也就是spring设置的BeanFactoryPostProcessor。
  2. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostPr ocessor.class, true, false); 得到的名字,应该是用户定义的BeanFactoryPostProcessor的bean名字(正因如此,在之后的 for循环中,要判断if (processedBeans.contains(ppName))排除掉第一个阶 段调用的BeanDefinitionRegistryPostProcessor)。

代码中,当if (beanFactory instanceof BeanDefinitionRegistry)成立时,会有1次for循环调用registryProcessor.postProcessBeanDefinitionRegistry(registry);,3次invokeBeanDefinitionRegistryPostProcessors调用(2个单次调用和1个循环调用),然后是5次invokeBeanFactoryPostProcessors调用。它们的含义如下(以下BeanDefinitionRegistryPostProcessor简称注册注册后置器,非BeanDefinitionRegistryPostProcessor的BeanFactoryPostProcessor,简称工厂后置器):

  1. for循环,循环调用spring设置的BeanDefinitionRegistryPostProcessor的回调函数postProcessBeanDefinitionRegistry
  2. 对于用户设置的,且继承了PriorityOrdered.class的BeanDefinitionRegistryPostProcessor,按优先级顺序调用其回调函数
  3. 对于用户设置的,且继承了Ordered.class的BeanDefinitionRegistryPostProcessor,按优先级顺序调用其回调函数
  4. 收集BeanDefinitionRegistryPostProcessor,对于没调用回调函数的那些,进行调用。持续4.直到所有BeanDefinitionRegistryPostProcessor都被调用。 循环4.是因为有的BeanDefinitionRegistryPostProcessor会添加新的BeanDefinitionRegistryPostProcessor,从而需要重新收集并调用。
  5. 对4.递归收集的BeanDefinitionRegistryPostProcessor,调用其父类的回调函数
  6. 对于系统设置的普通BeanFactoryPostProcessor,调用其回调函数。 至此,所有注册后置器、系统设置的工厂后置器的所有回调函数都已调用。接下来还要把用户设置的工厂后置器进行调用。
  7. 调用用户设置、实现了PriorityOrdered.class的BeanFactoryPostProcessor
  8. 调用用户设置、实现了Ordered.class的BeanFactoryPostProcessor
  9. 调用用户设置的所有没定义顺序的BeanFactoryPostProcessor

1-4会调用BeanDefinitionRegistryPostProcessor的回调 5-9会调用关于BeanFactoryPostProcessor的回调

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工厂后置处理器 BeanFactoryPostProcessor
  • 后置处理器回调
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档