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

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

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

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

public class RegistryCustomerBDRPP implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanDefinitionRegistry方法");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanFactory方法");}@Overridepublic int getOrder() {return 0;}
}

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

public class MyCustomerBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {@Overridepublic 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");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("Customer -----------实现BDRPP中postProcessBeanFactory方法");}@Overridepublic 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 DefaultResourceLoaderimplements ConfigurableApplicationContext {public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {return this.beanFactoryPostProcessors;}@Overridepublic void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor) {this.beanFactoryPostProcessors.add(postProcessor);}
}		

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

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

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

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

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

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

相关文章

openCV实战-系列教程8:直方图与均衡化(直方图定义/mask操作/均衡化原理/均衡化效果/自适应均衡化)、原理解析、源码解读

打印图像直接用这个函数&#xff1a; import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()1、直方图 1.1 基本定义…

EXCEL的VBA宏密码破解

在Excel 文档中使用AltF11可以打开查看宏代码。而部分VBA宏使用了密码保护&#xff0c;如下图&#xff1a; 在不知道密码的情况下则无法查看到宏代码。 对策 用Emeditor以二进制方式打开文件&#xff0c;搜索[43 4D 47]&#xff0c;对应字符为CMG&#xff0c;将找到CMG后的3…

EXCEL密码破解/破解工作表保护密码(详细图文教程)

EXCEL密码破解/破解工作表保护密码(详细图文教程) 网上有很多这个代码&#xff0c;但很多朋友并不太了解如何运用在此做了一些整理&#xff0c;希望对大家有所帮助&#xff01; 注&#xff1a;很多时候会因为忘记密码丢失重要EXCEL文件而烦恼&#xff0c;这份代码就能帮你找回&…

Excel宏(VBA)密码破解

最近在研究一个Excel宏&#xff0c;想查看VBA代码但是有密码&#xff0c;于是想着能不能移除密码。网上查找一番资料后进行了尝试。 一&#xff0c;准备工具 ExcelHex Editor Neo 二&#xff0c;开始实践 首先将.xlsm后缀名的文件改为.zip文件 然后双击zip文件(不用解压文件…

excel密码破解软件Excel Password Unlocker下载和使用技巧(亲测有效!)

Excel Password Unlocker 5.0 汉化版是专为恢复丢失的 Microsoft Excel 密码设计的一个易于使用的工具。每秒可尝试2万多个密码。 软件授权&#xff1a;免费软件 软件语言&#xff1a;简体中文 软件大小&#xff1a;1.5 MB 系统支持&#xff1a;Winxp / vi…

关于 Camera 预览和录像画质不一样的问题分析

1、问题背景 基于之前安卓平台的一个项目&#xff0c;客户有反馈过一个 Camera app 预览的效果&#xff0c;和录像效果不一致的问题。 这里的预览是指打开 Camera app 后直接出图的效果&#xff1b;录像的效果则是指打开 Camera app 开启录像功能&#xff0c;录制一段视频&…

基于SpringBoot实现MySQL与Redis的数据最终一致性

问题场景 在并发场景下&#xff0c;MySQL和Redis之间的数据不一致性可能成为一个突出问题。这种不一致性可能由网络延迟、并发写入冲突以及异常情况处理等因素引起&#xff0c;导致MySQL和Redis中的数据在某些时间点不同步或出现不一致的情况。数据一致性问题的级别可以分为三…

数据分析基础(1)——超实用‼️Excel 常用函数和实用技巧

学习教程&#xff1a;☑️ 懒人Excel - Excel 函数公式、操作技巧、数据分析、图表模板、VBA、数据透视表教程 目录 一、Excel知识体系✨ 二、Excel 常用函数&#x1f4a1; 三、Excel 技巧 &#x1f914; 补充&#xff1a; 1、自学数据分析学习路线 2、数据查询网站 一、…

1.Redis 5 环境搭建

一、环境搭建 如果是Centos8&#xff0c;yum 仓库中默认的 Redis版本就是5&#xff0c;直接yum install即可。如果是Centos7&#xff0c;yum 仓库中默认的 Redis版本是3系列&#xff0c;比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…

AD常用快捷键记录

一、通用快捷键 1、放大缩小&#xff1a;常用方法&#xff0c;ctrl鼠标滚轮&#xff0c;鼠标中键移动鼠标&#xff0c;pgup、pgup。 2、切换不同的布线层&#xff1a;ctrlshift鼠标滚轮 3、在SCH或者PCB 同一平面内左右翻转&#xff1a;ctrlX 4、在SCH或者PCB 同一平面内上下…

AD9361常用配置概述

ENSM控制 AD9361的状态控制有两种方式&#xff0c;分别为SPI接口控制和引脚控制&#xff0c;也可以通过SPI接口控制使能状态机跳转。在AD9361的正常工作过程中&#xff0c;包括多种不同状态&#xff0c;分别为&#xff1a;SLEEP&#xff08;休眠状态&#xff09;、WAIT&#x…

史上最全的Altium Designer 20安装教程

首先我们下载AD20&#xff0c;下载的链接我放在下面了&#xff01; AD20.2.3下载链接 下载好了之后&#xff0c;得到下面的镜像文件&#xff01; 右击镜像文件&#xff0c;解压&#xff01; 解压后得到如下文件夹&#xff1a; 打开文件夹&#xff0c;右键单击以管理员身份运行…

解决报错: Could not initialize class com.platform.cache.J2CacheUtils

今天运行一个比较久远的SSM项目&#xff0c;访问接口时报错&#xff1a; Could not initialize class com.platform.cache.J2CacheUtils 找了半天也没有发现问题所在&#xff0c;突然发现报错里面有ShiroFilter字样&#xff0c;然后想起以前shiro好像是要跟redis对接&#xff0…

瑞友天翼应用虚拟化系统RCE漏洞复现+利用

1、产品简介 瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权&#xff0c;基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上&#xff0c;客户端通过WEB即可快速安全的访问经服务器上授权的应用软件&…

Autosar存储入门系列03_NVM状态机及读写存储调用逻辑

本文框架 0.前言1. NVM状态机介绍2. NVM读/写基本逻辑2.1 NVM读操作2.2 NVM写操作2.2.1 实时写2.2.2 下电写 2.3 NVM写入注意事项 0.前言 本系列是Autosar存储入门系列&#xff0c;希望能从学习者的角度把存储相关的知识点梳理一遍&#xff0c;这个过程中如果大家觉得有讲得不…

PC天翼云盘v6.3.4精简版

介绍&#xff1a; 由于天翼云盘网页端不能上传大文件了&#xff0c;需要客户端&#xff0c;于是制作了绿色版&#xff0c;直接打开就能用&#xff0c;装到u盘&#xff0c;走到哪用到哪。 下载不限速&#xff0c;上传文件大小无限制&#xff0c;支持识别MD5秒传。 这是天翼云盘…

如何外网登录访问瑞友天翼应用虚拟化系统?——快解析内网端口映射方案

瑞友天翼应用虚拟化系统&#xff08;GWT System&#xff09;是国内具有自主知识产权的应用虚拟化平台&#xff0c;是基于服务器计算&#xff08;Server-based Computing&#xff09;的应用虚拟化平台。如何将内网平台提供到互联网上外网访问&#xff0c;是我们比较关注的问题。…

Goby 漏洞更新 | 瑞友天翼应用虚拟化系统 index.php 文件远程代码执行漏洞

漏洞名称&#xff1a; 瑞友天翼应用虚拟化系统 index.php 文件远程代码执行漏洞 English Name&#xff1a;Ruiyou Tianyi Application Virtualization System Index.php File Remote Code Execution Vulnerability CVSS core: 9.3 影响资产数&#xff1a;61711 漏洞描述&am…

[maven]关于pom文件中的<relativePath>标签

关于pom文件中的<relativePath>标签 为什么子工程要使用relativePath准确的找到父工程pom.xml.因为本质继承就是pom的继承。父工程pom文件被子工程复用了标签。&#xff08;可以说只要我在父工程定义了标签&#xff0c;子工程就可以没有&#xff0c;因为他继承过来了&…

IO模型和NGINX安装升级

IO模型和NGINX安装升级 IO模型 IO概念 I/O在计算机中指Input/Output&#xff0c; IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)&#xff0c;是衡量磁盘性能的主要指标之一。 Linux的IO类型 磁盘I/O 磁盘I/O是进程向内核发起系统调用&#xff0c;请求磁…