【Java】【系列篇】【Spring源码解析】【三】【体系】【PostProcessors体系】

news2024/10/6 1:43:59
PostProcessor英文翻译为后置处理器,在Spring体系里面主要针对的对象为Bean和BeanFactory.有着收尾或完善的作用。

一、BeanPostProcessor分支

image-20230116144807899

1.1、作用

在Bean对象在实例化和依赖注入完毕后,在显示调用初始化方法的前后添加我们自己的逻辑。注意是Bean实例化完毕后及依赖注入完成后触发的。

1.2、注册时机

refresh方法中在调用工厂后置处理器后注册

image-20230116142131562

1.3、调用时机

调用路径:

AbstractApplicationContext#refresh()
	finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
DefaultListableBeanFactory#preInstantiateSingletons()
AbstractBeanFactory#getBean(String name)
    doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
AbstractAutowireCapableBeanFactory#createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd)

image-20230116144512663

image-20230116142924308

二、BeanFactoryPostProcessor分支

2.1、整体结构图

image-20221213100935386

2.2、类解析

2.2.1、BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

做任何事情都要有目的,如果没有,则事倍功半,所以,在去理解这几个类的作用之前我们需要先确定我们的目标

  1. 这两个后置处理器的作用是什么?
  2. 他们在spring里面哪里起着怎样的作用?

我们首先需要了解BeanFactoryPostProcessor 和BeanDefinitionRegistryPostProcessor为Spring在容器初始化时对外对外暴露的扩展点,方便我们开发人员开发。两者侧重点不同,BeanDefinitionRegistryPostProcessor 侧重于注册BeanDefinition ,BeanFactoryPostProcessor 侧重于修改BeanDefinition。他们起作用的时机在于容器加载注册BeanDefinition完成之后

2.2.1.1、两个后置处理器的作用

  • BeanFactoryPostProcessor的作用原理——为什么BeanFactoryPostProcessor可以修改BeanDefinition?

    如下图,这个是BeanFactoryPostProcessor接口,里面只有一个方法,Spring就是通过这个方法来实现修改BeanDefinition。

    image-20221213141053605

    这个方法只有一个参数,即父类为ConfigurableListableBeanFactory的bean工厂类,这个类有一个方法,如下图:

    image-20221213140550366

    它可以获取指定bean的bean定义,并修改bean对应的定义信息(BeanDefinition)。

image-20221213141608455

  • BeanDefinitionRegistryPostProcessor的作用原理——为什么BeanDefinitionRegistryPostProcessor可以注册BeanDefinition?

    同BeanFactoryPostProcessor一样,BeanDefinitionRegistryPostProcessor同样也是通过一个方法来起到注册BeanDefinition的作用,如下图:

image-20221213142502194

​ 通过BeanDefinitionRegistry类来修改、注册、删除等操作,不过一般来说都是用来注册。如下图:

image-20221213142745915

2.2.1.2、他们在spring里面哪里起着怎样的作用

要想明白这两个后置处理器的执行位置,起着怎样的作用,我们就要了解一个方法——PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors,我们从头来看。

这是刷新工厂12大步,是spring框架的主要流程,其中我们需要看的方法就是下图(删除了多余的注释)圈中的方法,bean工厂的后置处理器就在这里调用:

image-20221213143848353

执行PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors方法:

image-20221213144312578

2.2.1.2.1、整体执行流程

这个方法主要分为两大步:

第一步,先执行BeanDefinitionRegistryPostProcessor后置处理器;第二步,再执行BeanFactoryPostProcessor后置处理器。每一步里面又细分三小步,先处理实现PriorityOrdered接口的,再执行Ordered接口的,最后执行一个排序接口都没实现的后置处理器。所以如果想要先执行,可以添加PriorityOrdered或者Ordered接口。

第一大步:

image-20221213151008907

第二大步:

image-20221213152001624

2.2.1.2.2、执行流程详解
1、registryProcessors集合和regularPostProcessors集合的作用

image-20221213161826518

2、for循环里执行postProcessBeanDefinitionRegistry()方法的意义

我们知道BeanDefinitionRegistryPostProcessor是继承了BeanFactoryPostProcessor的;所以,BeanDefinitionRegistryPostProcessor除了需要执行它自身的postProcessBeanDefinitionRegistry()方法,还需要执行BeanFactoryPostProcessor的postProcessBeanFactory()方法,且BeanDefinitionRegistryPostProcessor是支持注册BeanDefinition,这也包括BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,所以,在方法的一开始,遍历的时候就执行了postProcessBeanDefinitionRegistry()方法,以防内部存在需要注册的后置处理器。如图:

image-20221213160407129

3、选取相似的一段流程讲解

image-20221213162427289

4、if判断的必要性

image-20221213162838773

3、选取相似的一段流程讲解

image-20221213162427289

4、if判断的必要性

image-20221213162838773

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】【Pytorch】十六、模型训练套路

【学习笔记】【Pytorch】十六、模型训练套路一、内容概述二、模型训练套路1.代码实现&#xff1a;CPU版本2.代码实现&#xff1a;优先GPU版本a3.代码实现&#xff1a;优先GPU版本b4.计算测试集上的正确率三、使用免费GPU训练模型一、内容概述 本内容主要是介绍一个完整的模型训…

信用评分分卡简介

背景 随着金融科技初创企业的兴起&#xff0c;过去 5 年中出现了许多新的消费信贷机构&#xff0c;与传统银行展开竞争。他们通常瞄准银行认为规模太小或因金融危机期间发生的后期损失而不得不削减贷款的细分市场。通俗的讲就是消费金融公司瞄准了银行的次贷市场。 这些新的消…

【C语言】文件操作修改通讯录(升级版本)可以存储数据

文件操作的内容&#xff0c;我们在上文已经学习了&#xff0c;那么如果有不明白的小伙伴请看这篇文章 【C语言】小王带您实现文件操作&#xff08;简单图示讲解&#xff09;_小王学代码的博客-CSDN博客 通讯录我们在之前也学习实现了静态、动态通讯录 【C语言】使用C语言实现静…

分享80个PHP源码,总有一款适合您

PHP源码 分享80个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 80个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1yJ1aR6vt2kDjiVyqj0gPuw?pwdlfl9 提取码&#xff…

深信服EDR任意用户登录与命令执行漏洞

深信服EDR任意用户登录与命令执行漏洞1.深信服EDR简介2.深信服EDR漏洞2.1.后台任意用户登录漏洞2.1.1.漏洞描述2.1.2.影响版本2.1.3.漏洞复现2.2.任意命令执行漏洞2.2.1.漏洞描述2.2.2.影响版本2.2.3.漏洞复现2.2.3.1.构建URL2.2.3.2.效果1.深信服EDR简介 终端检测响应平台&…

C生万物 | 使用宏将一个整数的二进制位的奇数位和偶数位交换

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;万物之源——C 淋漓尽致——位运算✒题目分析 && 实现思路[位运算]1、获取这个整数的奇数位和偶数位2、使用移位运算使【奇变偶】【偶变奇…

如何通过限流算法防止系统过载

限流算法&#xff0c;顾名思义&#xff0c;就是指对流量进行控制的算法&#xff0c;因此也常被称为流控算法。 我们在日常生活中&#xff0c;就有很多限流的例子&#xff0c;比如地铁站在早高峰的时候&#xff0c;会利用围栏让乘客们有序排队&#xff0c;限制队伍行进的速度&am…

扫雷——“C”

各位uu们我又来啦&#xff0c;今天&#xff0c;小雅兰给大家介绍的又是一个小游戏&#xff0c;就是扫雷这款游戏&#xff0c;这个游戏和我昨天给大家介绍的三子棋游戏有异曲同工之妙&#xff0c;相信很多人都玩过&#xff0c;话不多说&#xff0c;我们进入正题吧. 《扫雷》是一…

【学习笔记】【Pytorch】十七、模型测试套路

【学习笔记】【Pytorch】十七、模型测试套路一、内容概述二、模型测试套路代码实现一、内容概述 利用已经训练好的模型&#xff0c;然后给它提供输入&#xff0c;判断输出是否正确&#xff0c;即模型的应用测试。 在模型测试也会有一些坑&#xff1a; 神经网络的输入一般是4…

【错误记录】Kotlin 代码编译时报错 ( Variable ‘name‘ must be initialized | 初始化块定义在所有属性之后 )

文章目录一、报错信息二、问题分析三、解决方案 ( 初始化块定义在所有属性之后 )一、报错信息 在 Kotlin 中 , init 初始化块 要 定义在所有成员属性之后 ; 如果在 init 初始化块 中 , 使用到了 成员属性 , 有可能出现 编译时报错信息 ; 报错代码示例 : class Hello{init {va…

seata安装及配置

1.下载 下载地址&#xff1a;https://github.com/seata/seata/tags 本文选用seata-1.4.2版 2.解压 tar -zxvf seata-server-1.4.2.tar.gz 3. 初始化数据库 登录mysql&#xff0c;然后创建数据库和数据表&#xff1a; -- -------------------------------- The script used…

【Java】【系列篇】【Spring源码解析】【三】【体系】【Environment体系】

整体结构图 本篇文章仅作简单了解&#xff0c;详细还等到Springboot系列里面详解PropertyResolver 作用 用于针对任何基础源解析属性(Property)的接口 方法解析 // 查看规定指定的key是否有对应的value 对应key的值是null的话也算是不能解析 boolean containsProperty(Stri…

持续丰富营销玩法 东风标致408X引领品牌向上焕新

1月5日&#xff0c;东风标致408X首秀——XSHOW开演&#xff0c;标致全球战略车型408X正式在中国亮相&#xff0c;定位为“新法式无界座驾”&#xff0c;它是东风标致全面向电动化、智能化、网联化的发展的一款汽车&#xff0c;也是引领东风标致向上焕新的一款全新车型。作为东风…

十五天学会Autodesk Inventor,看完这一系列就够了(终章),答疑

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

python SciPy 优化器

SciPy 优化器SciPy 的 optimize 模块提供了常用的最优化算法函数实现&#xff0c;我们可以直接调用这些函数完成我们的优化问题&#xff0c;比如查找函数的最小值或方程的根等。NumPy 能够找到多项式和线性方程的根&#xff0c;但它无法找到非线性方程的根&#xff0c;如下所示…

工具类库 Hutool介绍与使用(请记得收藏)

工具类库 Hutool介绍 Hutool是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xff0c;使Java拥有函数式语言般的优雅&#xff0c;让Java语言也可以“甜甜的”。Hutool中的工具方法来自于每个用户的精雕…

VMware vCenter上用OVF模板部署虚拟机

前言 在我们项目操作过程中&#xff0c;使用VMware vCenter系统&#xff0c;经常会出现使用原有部署环境来部署虚拟机&#xff0c;供项目组使用&#xff0c;此时我们克隆虚拟机就要用到OVF模板来克隆操作&#xff0c;这是一个非常实用的功能。 一、打开Vcenter&#xff0c;选定…

Redis学习笔记2_数据结构

Redis数据结构Redis数据结构二、数据结构2.1Redis核心对象2.2底层数据结构2.2.1 SDS-simple dynamic stringsds内存布局sds的操作为什么使用SDS&#xff0c;SDS的优势&#xff1f;2.2.2 listlist内存布局2.2.3 dictdict内存布局2.2.4 zskiplistzskiplist内存布局2.2.5 intsetin…

前端实现登录拼图验证

前言 不知各位朋友现在在 web 端进行登录的时候有没有注意一个变化&#xff0c;以前登录的时候是直接账号密码通过就可以直接登录&#xff0c;再后来图形验证码&#xff0c;数字结果运算验证&#xff0c;到现在的拼图验证。这一系列的转变都是为了防止机器操作&#xff0c;但对…

Python 第六章 函数

6.1函数的定义和调用6.1.1定义函数格式&#xff1a;def 函数名 ([参数列表]):["""文档字符串"""]函数体[return 语句]6.1.2函数调用格式&#xff1a;函数名([参数列表])python中函数可以嵌套定义例如&#xff1a;def add_modify(a,b):resultabpr…