Spring源码解析3-beanFactoryPostProcessor的执行

2023-05-16

refresh()中的invokeBeanFactoryPostProcessors(beanFactory)

invokeBeanFactoryPostProcessors(),实例化并且调用所有已经注册了的beanFactoryPostProcessor,遵循指明的顺序

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(),获取到当前应用程序上下文的beanFactoryPostProcessors变量的值,并且实例化调用执行所有已经注册的beanFactoryPostProcessor,通过getBeanFactoryPostProcessors()来获取已经注册的BFPP

invokeBeanFactoryPostProcessors()执行流程:

外部集合: getBeanFactoryPostProcessors()获取已经注册的BFPP

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())

子类:BeanDefinitionRegistryPostProcessor增强的是BeanDefinition,自己有postProcessBeanDefinitionRegistry()方法,也有父类的postProcessBeanFactory()方法

父类:BeanFactoryPostProcessor增强的是BeanFactory里面所有的对象,postProcessBeanFactory()方法

先处理外部集合的BeanFactoryPostProcessor,就是入参中的beanFactoryPostProcessors

1、遍历所有的beanFactoryPostProcessors,将BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor区分开

2、如果是BeanDefinitionRegistryPostProcessor,直接执行BeanDefinitionRegistryPostProcessor接口中的postProcessBeanDefinitionRegistry方法,然后添加到registryProcessors,用于后续执行postProcessBeanFactory方法,

3、否则,只是普通的BeanFactoryPostProcessor,添加到regularPostProcessors,用于后续执行postProcessBeanFactory方法。

在调用所有实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类

1、找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName

2、遍历处理所有符合规则的postProcessorNames,检测是否实现了PriorityOrdered接口,获取名字对应的bean实例,添加到currentRegistryProcessors中,将要被执行的BFPP名称添加到processedBeans,避免后续重复执行

3、按照优先级进行排序操作,添加到registryProcessors中,用于最后执行postProcessBeanFactory方法,遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法

4、执行完毕之后,清空currentRegistryProcessors

调用所有实现Ordered接口的BeanDefinitionRegistryPostProcessor实现类

1、找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName,重复查找的原因在于上面的执行过程中可能会新增其他的BeanDefinitionRegistryPostProcessor

2、 检测是否实现了Ordered接口,并且还未执行过,获取名字对应的bean实例,添加到currentRegistryProcessors中,将要被执行的BFPP名称添加到processedBeans,避免后续重复执行

3、按照优先级进行排序操作, 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法,遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法

4、执行完毕之后,清空currentRegistryProcessors

然后调用所有剩下没有排序优先级的BeanDefinitionRegistryPostProcessors,逻辑跟上方差不多。

最后调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法以及调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法

以上代码入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕,下面开始处理容器中 所有的BeanFactoryPostProcessor,可能会包含一些实现类,只实现了BeanFactoryPostProcessor,并没有实现BeanDefinitionRegistryPostProcessor接口。

找到所有实现BeanFactoryPostProcessor接口的类,遍历postProcessorNames,将BeanFactoryPostProcessor按实现PriorityOrdered、实现Ordered接口、普通三种区分开

对实现了PriorityOrdered、Ordered接口以及没有排序普通的BeanFactoryPostProcessor进行排序,各自遍历BeanFactoryPostProcessor,执行postProcessBeanFactory方法

拓展1:

添加自定义BeanFactoryPostProcessor,让Spring识别的2种方式

1.在配置文件添加

2.在自定义的MyClassPathXmlApplicationContext,重写方法里面调用addBeanFactoryPostProcessor()

拓展2:

在BeanDefinitionRegistryPostProcessor执行过程中添加其他的BeanDefinitionRegistryPostProcessor

在MyBeanDefinitionRegistryPostProcessor执行过程中添加MySelfBeanDefinitionRegistryPostProcessor

1.MySelfBeanDefinitionRegistryPostProcessor

2.MyBeanDefinitionRegistryPostProcessor

3.applicationContext.xml

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring源码解析3-beanFactoryPostProcessor的执行 的相关文章

随机推荐

  • MyBatis框架知识点总结

    一 引言 1 1 什么是框架 xff1f 框架 xff1a 框架使用你的 xff0c 而不是你在使用框架的 框架让我们提供什么信息 xff0c 配置信息 xff0c 数据库连接用户名密码等 xff0c 你必须提供 xff0c 还得按照框架要
  • AndroidStudio Unresolved reference

    在学习Kotlin过程中 xff0c 出现了两次在activity main xml中已注册id xff0c 但是在MainActivity kt中无法找到该Button的情况 后面发现是没有在build gradle中导入 39 koti
  • Spring学习(全)

    本文目录 1 Spring概述2 IOC 控制反转2 1 简单介绍2 2 Spring的第一个程序2 3 DI入门2 3 1 XML之set注入简单类型的set注入引用类型的set注入引用类型的自动注入autowire 2 3 2 XML之
  • Python3读写dbf文本

    Python3读写dbf文本 安装环境 pip install dbf 关于dbf的文档可以在一下网址了解dbf文档 https pythonhosted org dbf 还有github的地址 https github com ethan
  • minicom的usb串口的驱动以及识别

    fire 64 fire test lsmod grep usb usbserial 49152 1 pl2303 fire 64 fire test dmesg 383 172363 usb 2 1 4 new full speed US
  • ubuntu搭建http文件服务器

    搭建的过程 sudo apt install apache2 sudo apt install apache2 sudo apt install php sudo apt get install libapache2 mod php sud
  • ubuntu搭建http文件服务器

    搭建的过程 sudo apt install apache2 sudo apt install apache2 sudo apt install php sudo apt get install libapache2 mod php sud
  • 元胞自动机-森林火灾模拟

    引入 xff1a 元胞自动机 xff0c 英文名及缩写 xff1a cellular automata xff0c CA 最初是由冯诺依曼在二十世纪五十年代为模拟生物自保的自我复制而提出的 xff0c 但是当时并未受到重视 后来才逐渐发展起
  • wsl,Ubuntu,关于解决 mysql-server : 依赖: mysql-server-5.7 但是它将不会被安装 问题

    出现问题 xff1a 安装mysql时 xff0c sudo apt span class token operator span get install mysql span class token operator span serve
  • vue3 + vite + ts + setup , 第十练 自定义hooks的使用

    Vue3 自定义Hook 主要用来处理复用代码逻辑的一些封装 这个在vue2 就已经有一个东西是Mixins mixins就是将这些多个相同的逻辑抽离出来 xff0c 各个组件只需要引入mixins xff0c 就能实现一次写代码 xff0
  • 完全去中心化的学习(Fully Decentralized Learning)

    完全去中心化的学习是一种使用区块链技术实现的机器学习方法 xff0c 其中参与者可以在不需要信任中心的情况下共同训练模型 相比于传统的集中式学习方法 xff0c 完全去中心化的学习有以下几个优点 xff1a 数据隐私性更好 xff1a 传统
  • 【Ubuntu】Ubuntu出现一直登录界面循环状况

    问题描述 xff1a 在Ubuntu中登录密码输入正确但却无法登录 xff0c 闪动以后再次回到登录界面 ubuntu版本 xff1a ubuntu 16 04 7 问题原因 xff1a 可能是 etc profile文件中PATH配置不正
  • FTPclient简单使用

    1 下载jar包 1 new一个项目 xff1a 2 进去 http mvnrepository com 3 搜说commons net 3 点进去选择版本 3 3 xff0c 复制 xff1a 第一行不要 4 新建标签复制 5 新建一个T
  • 每天一道算法练习题--Day21&& 第一章 --算法专题 --- ----------位运算

    我这里总结了几道位运算的题目分享给大家 xff0c 分别是 136 和 137 xff0c 260 和 645 xff0c 总共加起来四道题 四道题全部都是位运算的套路 xff0c 如果你想练习位运算的话 xff0c 不要错过哦 xff5e
  • 第八章 常用类

    文章目录 8 1 1包装类基本知识对于包装类来说 xff0c 这些类的用途主要包含两种 xff1a 8 1 3自动装箱和拆箱八种包装类和基本数据类型的对应关系8 1 4包装类的缓存问题String类可变的字符序列 xff1a StringB
  • Activit、Fragment的生命周期 及横竖屏切换的一些问题 及解决方案

    Activity 的生命周期 xff1a 1 onCreate 表示Activity 正在被创建 第一个方法 加载一些界面布局文件 xff0c 初始化Activity 2 onRestart 重新启动 3 onStart 当前Activit
  • 对比学习MoCo损失函数infoNCE理解(附代码)

    MoCo loss计算采用的损失函数是InfoNCE xff1a 下面是MoCo的伪代码 xff0c MoCo这个loss的实现就是基于cross entropy loss 将k作为q的正样本 xff0c 因为k与q是来自同一张图像的不同视
  • 无人机飞控三大算法:捷联式惯性导航系统、卡尔曼滤波算法、飞行控制PID算法

    无人机飞控三大算法 xff1a 捷联式惯性导航系统 卡尔曼滤波算法 飞行控制PID算法 一 捷联式惯性导航系统 说到导航 xff0c 不得不说GPS xff0c 他是接受卫星发送的信号计算出自身位置的 xff0c 但是当GPS设备上方被遮挡
  • linux下设定自动关机

    linux下设定自动关机 在linux下创建自动关机脚本 脚本名称改为shutdown1 脚本命令 xff1a bin bash echo 123456 sudo S shutdown h now 123456即为用户密码 先在终端运行脚本
  • Spring源码解析3-beanFactoryPostProcessor的执行

    refresh 中的invokeBeanFactoryPostProcessors beanFactory invokeBeanFactoryPostProcessors xff0c 实例化并且调用所有已经注册了的beanFactoryPo