专栏首页后端技术spring 后置处理器回调

spring 后置处理器回调

工厂后置处理器 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的回调

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • android studio device monitor (DDMS) 无法打开 an error has occured

    平凡的学生族
  • 从零开始搭建hadoop3集群

    https://blog.csdn.net/dream_an/article/details/80258283

    平凡的学生族
  • kafka 源码 debug环境搭建

    添加启动项。Edit Configurations->点击+号->Application添加一个启动项,然后填写如下内容

    平凡的学生族
  • AI匹配患者的初级保健医生,以提供更好的个性化建议

    由于ZocDoc,SimplyBook和Doodle等服务,寻找初级保健医生比过去更简单。但是,找到符合你(或家人)个性的临床医生是另一回事。

    AiTechYun
  • javaSE(九)之泛型(Generics)

    前言 这几天分享了怎么搭建集群,这一篇给大家介绍的是泛型,在我们的很多java底层的源代码都是有很多复杂的泛型的!那什么是泛型呢?  泛型是Java SE 1....

    用户1195962
  • 5亿百度地图大数据:揭秘北上广深真相

    作为一线城市,北上广深人口吸引力分列前四,虽然最近逃离北上广的呼声很高,但大城市毕竟拥有更多的机遇和空间,安放得下年轻人的梦想和野心。紧随其后的是东莞、苏州、成...

    钱塘数据
  • python的内置函数(六)、getattr()

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    于小勇
  • 一次讲清移动端适配解决方案—rem和vw

    Ewall
  • python技巧分享(五)

    songleo
  • 如何在Kerberos环境的CDH集群部署Livy

    在前面的文章Fayson介绍了《Livy,基于Apache Spark的开源REST服务,加入Cloudera Labs》、《如何编译Livy并在非Kerber...

    Fayson

扫码关注云+社区

领取腾讯云代金券