Sping源码(七)— 后置处理器(自定义后置处理器)

news2024/9/25 11:21:25

上一篇中简单介绍了Spring中invokeBeanFactoryPostProcessors方法的执行流程,以及BFPP和BDRPP类的介绍,这篇文章我们来自定义实现一个类的后置处理器。

自定义PostProcessor
自定义PostProcessor的方式一共两种,都是根据invokeBeanFactoryPostProcessors()方法中的参数来实现的,其中一种是加到beanFactory,另一种是添加到参数List< BeanFactoryPostProcessor > 中。两种方法的实现相差不大。这篇文章会讲解添加到参数 List 中的方式。

还记得源码中会根据BDRPP类型多次获取PostProcessorNames么?我们在自定义实现的过程中,就会还原在执行postProcessBeanDefinitionRegistry() 方法时,创建BDRPP类,RegistryCustomerBDRPP 类就是要添加的。

public class RegistryCustomerBDRPP implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanDefinitionRegistry方法");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanFactory方法");
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

通过MyCustomerBeanDefinitionRegistryPostProcessor类中ppbdr方法的执行,创建RegistryCustomerBDRPP。

public class MyCustomerBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        BeanDefinitionBuilder customer = BeanDefinitionBuilder.rootBeanDefinition(RegistryCustomerBDRPP.class);
        System.out.println("在BDRPP中注册新的 BDRPP");
        registry.registerBeanDefinition("customer",customer.getBeanDefinition());
        System.out.println("自定义BDRPP------------调用方法MyCustomerBeanDefinitionRegistryPostProcessor");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("Customer -----------实现BDRPP中postProcessBeanFactory方法");
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

类已经创建完成,接下来就是如何添加到参数 List< BeanFactoryPostProcessor >中,看源码不难发现,获取List< BeanFactoryPostProcessor >时,是通过getBeanFactoryPostProcessors()方法来获取的。关于具体源码执行逻辑可看上一篇Sping源码(七)— 后置处理器有详细讲解。

源码部分

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {

		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
		//省略无用代码
		}
	}
	//具体调用方法
	public static void invokeBeanFactoryPostProcessors(
            ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
	//省略无用代码
}

在Spring源码中,有get方法,那一定会有对应的add()或set()方法进行值的填充。
通过点击可发现getBeanFactoryPostProcessors()方法是在AbstractApplicationContext中实现的,AbstractApplicationContext类关系图如下,可以看到,子类中有ClassPathXmlApplicationContext,所以,我们可以通过实现ClassPathXmlApplicationContext类重写addBeanFactoryPostProcessor()的方式将我们自定义的PostProcessor添加进去。

AbstractApplicationContext

public abstract class AbstractApplicationContext extends DefaultResourceLoader
		implements ConfigurableApplicationContext {
	public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {
			return this.beanFactoryPostProcessors;
		}
	
	@Override
		public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor) {
			this.beanFactoryPostProcessors.add(postProcessor);
		}
}		

类关系图
在这里插入图片描述

addBeanFactoryPostProcessor
通过这种方式,在invokeBeanFactoryPostProcessors方法执行时,就会在getBeanFactoryPostProcessors()方法中获取到我们添加的BDRPP。

public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {
	  	@Override
	    protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
	        super.addBeanFactoryPostProcessor(new MyCustomerBeanDefinitionRegistryPostProcessor());
	    }
}	    

而如果想要将自定义BDRPP添加到BeanFactory中就更简单了,自定义好BDRPP后,通过< bean >标签能够让Spring识别到你的BDRPP即可。在执行invokeBeanFactoryPostProcessors时,就会在BeanFactory中直接获取到。

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

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

相关文章

SM2(国密)非对称(公钥私钥)在线加密解密

SM2(国密)非对称(公钥私钥)在线加密/解密/生成密钥对

【mq】如何保证消息可靠性

文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下&#xff0c;kafka的结构和rocketmq的机构基本上一样&#xff0c;都需要一个注册…

2023 江苏省研究生数学建模 A 题思路

2023年江苏省研究生数学建模科研创新实践大赛A题新型抗癌药物研究模型探索靶向治疗是治疗肿瘤疾病的一种重要方法&#xff0c;它具有针对性强、疗效显著等特点。现有的靶向药物通常针对特定的基因突变靶点&#xff0c;容易出现耐药性。目前&#xff0c;一种由癌症诱发的血管新生…

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介…

Go 使用 Gorm 将操作信息集成到链路跟踪 Jaeger,进行增删改查使用举例,并做可视化UI界面展示(附源码)

Go 使用 Gorm 将操作信息集成到链路跟踪 Jaeger,进行增删改查使用举例(附源码)。 为了增强程序的可观测性,方便问题定位,在发起数据库操作请求时我们也可以调用代码统一集成链路跟踪的能力,Jaeger 是当今比较流行的选择。使用 Gorm 来将操作信息集成到 Jaeger 中。 全面…

Gazebo GPU加速【gzserver running in GPU】

文章目录 Gazebo GPU加速1. 问题2. 解决办法2.1 本机运行 2.2 headless3. 补充3.1 如何确定的Gazebo为OpenGL渲染3.2 显卡驱动--no-opengl-files3.3 nouveau Gazebo GPU加速 1. 问题 Gazebo仿真帧率极低&#xff0c;fps在10以下&#xff0c;同时显卡驱动已安装&#xff0c;但…

WebRTC之FEC前向纠错协议

FEC前向纠错用于丢包恢复&#xff0c;对媒体包进行异或或其他算法生成冗余包进行发送。如果接收端出现丢包&#xff0c;可以通过冗余包恢复出原始的媒体包。FEC的代价是增加码率带宽&#xff0c;所以一般会根据网络状况、丢包率来动态调整FEC冗余系数&#xff0c;也会结合NACK/…

mtk8175添加一款camera(GC5035)流程

说明&#xff1a; 在MTK平台添加一款新的Camera IC 需要如下三个步骤&#xff1a; device目录下面添加相关宏定义。 kernel目录下面添加dts配置&#xff0c;即硬件管脚、时钟、电源、I2C等的配置和 添加相关的驱动。 vendor 目录下面添加相关的效果文件。 下面是自己在MTK…

在Java8的forEach()中使用break/continue

今天在开发中&#xff0c;使用forEach()来遍历元素执行业务操作&#xff0c;发现如果判断不符合某个条件时就要continue&#xff0c;不能继续向后执行了。但是在forEach()中不能使用for循环中的continue和break&#xff0c;那改如何退出呢&#xff1f; 答案是&#xff1a;使用…

利用open_cv在图像上进行点标记,文字注记,画圆、多边形、椭圆

&#xff08;1&#xff09;CV2中的绘图函数&#xff1a; cv2.line() 绘制线条cv2.circle() 绘制圆cv2.rectangle() 绘制矩形cv2.ellipse() 绘制椭圆cv2.putText() 添加注记 &#xff08;2&#xff09;注释 img表示需要绘制的图像color表示线条的颜色&#xff0c;采用颜色矩阵…

Python基础学习第一天:关于Python的简单介绍

前言 最近一批批大一新生都要开始踏入校园了&#xff0c;计算机专业 emmm…如果有需要学习python的&#xff0c;尤其是还没开学的&#xff0c;确实可以开始找找资料看看python了&#xff0c;如果是自己本来就对python感兴趣&#xff0c;更应该需要看看了&#xff0c;毕竟学校到…

【五】sql 语言 -- 概览

SQL 语言概述SQL 语言提出和发展SQL 语言的功能概述利用 SQL 语言建立数据库学生选课数据库 SCT1. 定义数据库和表 SQL-DDL创建数据库的语句—Create Database创建关系/表的语句—Create Table 2. 向表中追加元组 SQL-DML 利用 SQL 语言进行简单查询单表查询 - SELECT-FROM-WHE…

工地安全帽识别闸机联动开关 yolov7

工地安全帽识别闸机联动开关系统通过yolov7系列网络模型深度学习算法&#xff0c;工地安全帽识别闸机联动开关算法对施工人员的人脸、安全帽和反光衣进行识别&#xff0c;判断是否符合安全要求。只有当人脸识别成功且安全帽、反光衣齐全时&#xff0c;闸机才会打开允许施工人员…

FFmpeg支持多线程编码并保存mp4文件示例

之前介绍的示例&#xff1a; (1).https://blog.csdn.net/fengbingchun/article/details/132129988 中对编码后数据保存成mp4 (2).https://blog.csdn.net/fengbingchun/article/details/132128885 中通过AVIOContext实现从内存读取数据 (3).https://blog.csdn.net/fengbingchun/…

基于XGBoots预测A股大盘《上证指数》(代码+数据+一键可运行)

对AI炒股感兴趣的小伙伴可加WX&#xff1a;caihaihua057200&#xff08;备注&#xff1a;学校/公司名字方向&#xff09; 另外我还有些AI的应用可以一起研究&#xff08;我一直开源代码&#xff09; 1、引言 在这期内容中&#xff0c;我们回到AI预测股票&#xff0c;转而探索…

知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用25-基于py2neo的超市商品的图谱构建与商品推荐系统的实现,本篇文章,我将指导大家如何使用py2neo和Neo4j构建一个实用的超市商品知识图谱和推荐系统。该系统可以帮助用户快速找到感兴趣的商品,并提供个性化的推荐服务…

【mysql】MySQL服务无法启动 NET HELPMSG 3534

MySQL服务无法启动 NET HELPMSG 3534 错误描述寻找原因解决方法 错误描述 mysql版本&#xff1a;8.1.0 mysql安装成功之后&#xff0c;使用net start mysql来启动mysql&#xff0c;然后出现了报错 MySQL服务无法启动 NET HELPMSG 3534 寻找原因 1、在cmd中&#xff0c;进入…

【论文笔记】最近看的时空数据挖掘综述整理8.27

Deep Learning for Spatio-Temporal Data Mining: A Survey 被引用次数&#xff1a;392 [Submitted on 11 Jun 2019 (v1), last revised 24 Jun 2019 (this version, v2)] 主要内容&#xff1a; 该论文是一篇关于深度学习在时空数据挖掘中的应用的综述。论文首先介绍了时空数…

css background实现四角边框

2023.8.27今天我学习了如何使用css制作一个四角边框&#xff0c;效果如下&#xff1a; .style{background: linear-gradient(#33cdfa, #33cdfa) left top,linear-gradient(#33cdfa, #33cdfa) left top,linear-gradient(#33cdfa, #33cdfa) right top,linear-gradient(#33cdfa, #…

阿里云 Serverless 应用引擎 2.0,正式公测!

阿里云 Serverless 应用引擎 SAE2.0 正式公测上线&#xff01;全面升级后的 SAE2.0 具备极简体验、标准开放、极致弹性三大优势&#xff0c;应用冷启动全面提效&#xff0c;秒级完成创建发布应用&#xff0c;应用成本下降 40% 以上。 此外&#xff0c;阿里云还带来容器服务 Se…