Spring后置处理器(PostProcessor)

文章目录

      • 引言
      • BeanFactoryPostProcessor
        • 常见用法
        • 创建自定义后置处理器
        • 注册后置处理器
        • 执行后置处理器
      • BeanPostProcessor
        • 常见用法
        • 创建自定义后置处理器
        • 注册后置处理器
        • 执行后置处理器
      • 实际需求
        • 验证配置文件的正确性
          • 检验逻辑

引言

在Spring框架中,后置处理器为我们提供了一种机制,可以在Spring容器实例化、配置Bean之后,以及在Bean初始化方法(如使用@PostConstruct注解的方法)执行前后,插入自定义的逻辑。这种机制在处理跨多个Bean的通用逻辑时特别有用,如属性修改、依赖注入增强、代理模式应用等。

BeanFactoryPostProcessor

BeanFactoryPostProcessor 是 Spring 框架中另一个重要的后置处理器接口,与 BeanPostProcessor 不同,BeanFactoryPostProcessor 是在 Spring 容器加载了所有的 Bean 定义之后,但在任何 Bean 实例化之前调用的。这使得 BeanFactoryPostProcessor 能够在容器上下文中修改 Bean 定义或添加额外的属性。

常见用法
  1. 修改 Bean 定义:你可以使用 BeanFactoryPostProcessor 来修改容器中 Bean 的定义,比如改变 Bean 的作用域、添加或修改 Bean 的属性等。
  2. 添加自定义的 Bean:在容器启动过程中动态地添加额外的 Bean 定义。
  3. 环境相关的配置:根据应用运行的环境(如开发、测试、生产)来动态调整配置。
  4. 注册自定义的 BeanPostProcessor:虽然 BeanPostProcessor 可以通过 @Component 或 XML 配置来注册,但有时你可能想要在运行时根据条件动态地注册它们。
创建自定义后置处理器
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {System.out.println("执行了后置处理器");// 自定义逻辑}
}
注册后置处理器

创建完自定义后置处理器后,我们需要在Spring容器中注册它。这可以通过在配置类上使用@Bean注解或者在XML配置文件中声明来实现。

如果你使用Java配置,可以这样做:

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  @Configuration  
public class AppConfig {  @Bean  public CustomBeanFactoryPostProcessor customBeanPostProcessor() {  return new CustomBeanFactoryPostProcessor();  }  
}

如果你使用XML配置,可以这样做:

<beans xmlns="http://www.springframework.org/schema/beans">  <!-- 其他Bean配置 -->  <bean class="com.example.CustomBeanFactoryPostProcessor"/>  
</beans>
执行后置处理器

当你启动Spring应用时,Spring容器会自动检测并调用所有注册的后置处理器。

你不需要显式地调用后置处理器的方法;这一切都是自动发生的。只需确保你的后置处理器被正确地注册到了Spring容器中。

执行结果:

这里可以看到是执行了我们的后置处理器的

在这里插入图片描述


BeanPostProcessor

BeanPostProcessor 是 Spring 框架中的一个重要接口,它允许在 Spring 容器创建 Bean 对象并执行初始化方法(如 InitializingBean.afterPropertiesSet 或自定义的 init 方法)的前后进行额外的处理。这个接口定义了两个主要的回调方法:postProcessBeforeInitializationpostProcessAfterInitialization

常见用法
  • postProcessBeforeInitialization:在 Bean 实例化、属性注入后,但在执行任何初始化方法(如 afterPropertiesSet)之前调用。这个方法允许我们对 Bean 进行一些预处理,比如检查标记接口、修改 Bean 的属性或者用代理包装 Bean。
  • postProcessAfterInitialization:在 Bean 实例化、属性注入以及初始化方法执行完成后调用。这个方法允许我们对已经初始化完成的 Bean 进行后处理,比如进行一些资源的清理、性能的监测等。
创建自定义后置处理器
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 在Bean初始化之前执行的逻辑System.out.println("Before Initialization : " + beanName);return bean;  // 可以返回原Bean,或者返回一个包装后的Bean}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 在Bean初始化之后执行的逻辑System.out.println("After Initialization : " + beanName);return bean;  // 可以返回原Bean,或者执行一些额外操作后的Bean}
}
注册后置处理器

注册后置处理器的方式和前面的一样,要么通过xml文件的方式进行注入,或者使用bean对象的方式进行注入。

执行后置处理器

这里将我们的上面的后置处理器和这个处理器都注入进去,然后我们可以看到执行的顺序就是先执行**beanFactoryPostProcessor**后置处理器,后面才执行bean对象的后置处理器。

在这里插入图片描述

实际需求

验证配置文件的正确性

自己自定义了一个jar包依赖,那么其他人进行导入的时候,配置可能是会出错的。这里我们可以使用**beanFactoryPostProcessor**进行检查,检查提取占位符以后的文件格式是否有问题,有问题则直接报错。

检验逻辑
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("A");PropertyValue name = beanDefinition.getPropertyValues().getPropertyValue("name");System.out.println("name.getValue().toString() = " + name.getValue().toString());if (name.getOriginalPropertyValue() != null) { // 检验提取的占位符的格式是否正确throw new BeanCreationException(" name error !");}}
}

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

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

相关文章

鸿蒙开发第一节

一.开发准备-工具安装 1.鸿蒙开发官网&#xff1a;华为开发者联盟-智能终端能力开放,共建开发者生态 (huawei.com) 2.DevEco Studio3.1下载链接HUAWEI DevEco Studio和SDK下载和升级 | 华为开发者联盟 点击下载按钮进行下载2.1解压文件2.2双击运行此程序 2.3安装软件 点击N…

【JavaSE】java刷题——基础语法熟练应用

前言 通过本篇题目&#xff0c;可以让初学Java的小伙伴们更加熟练Java的基础语法~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 题1&#xff1a;数字9 出现的次数 题述&#xff1a;编写程序数一下 1到 100 的所有整数中…

fastapi学习记录

今天看了点fastap&#xff0c;简单记录下&#xff0c;fastapi是一个python下的后端框架。 参考学习网站菜鸟教程 安装 pip install fastapi pip install "uvicorn[standard]"安装好了以后就可以直接使用&#xff0c;最主要的使用方式就是写接口嘛&#xff0c;get&a…

状态压缩dp[详解 + 例题]

1 . 题目 2 . 分析 可以发现 : 横放的方案数 总方案数 ; 剩下的都是竖放去填补空缺 ; 关于状态定义 : 考虑按列拜访 &#xff0c; 某列的隔行用0/1表示摆放状态 ; 某行为1 : 表示横放 , 0 : 表示竖放 ; 状态表示 : f[i][j] : 表示拜访第i列&#xff0c;状态为j的方案数…

【八大排序】一篇文章搞定所有排序

文章目录 1.排序的概念2.常见排序算法的实现2.1 插入排序2.1.1直接插入排序2.1.2希尔排序 2.2选择排序2.2.1直接选择排序:2.2.2堆排序 2.3交换排序2.3.1冒泡排序2.3.2快速排序Hoare法前后指针法挖坑法非递归版本 2.4归并排序递归版本非递归版本 2.5计数排序3.排序的比较 1.排序…

报错 /core/library/think/cache/driver/File.php 第 126 行左右(已解决)

报错 /core/library/think/cache/driver/File.php 第 126 行左右 解决方法&#xff1a; 网站后台版本低于v1.5.2出现的缓存问题&#xff0c;如果无法登录后台了&#xff0c;就通过FTP&#xff0c;把 /data/runtime 里的都删掉&#xff0c;然后进后台升级到最新版 一、进入宝…

基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析+爬虫+机器学习)

这里写目录标题 基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析爬虫机器学习)一、项目概述二、微博热词统计析三、微博文章分析四、微博评论分析五、微博舆情分析六、项目展示七、结语 基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析爬虫机器学习) 一、项目概…

疯狂数字直角三角形

上一篇文章的输出的数字直角三角形有个限制&#xff0c;就是边长n最大值为13&#xff0c;因为超过13最后就会输出3位数&#xff0c;这样斜边就不成一条直线了。 如果去掉这个限制呢&#xff1f;随便输入一个正整数&#xff08;int型&#xff09;&#xff0c;还能否输出这样的数…

【管理咨询宝藏59】某大型汽车物流战略咨询报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏59】某大型汽车物流战略咨询报告 【格式】PDF 【关键词】HR调研、商业分析、管理咨询 【核心观点】 - 重新评估和调整商业模式&#xff0c;开拓…

记一次 .NET某防伪验证系统 崩溃分析

一&#xff1a;背景 1. 讲故事 昨晚给训练营里面的一位朋友分析了一个程序崩溃的故障&#xff0c;因为看小伙子昨天在群里问了一天也没搞定&#xff0c;干脆自己亲自上阵吧&#xff0c;抓取的dump也是我极力推荐的用 procdump 注册 AEDebug 的方式&#xff0c;省去了很多沟通…

Linux离线安装mysql,node,forever

PS:本文是基于centos7实现的,要求系统能够查看ifconfig和unzip解压命令, 实现无网络可安装运行 首先现在百度网盘的离线文件包****安装Xftp 和 Xshell 把机房压缩包传到 home目录下****解压unzip 包名.zip 获取IP先获取到 linux 主机的ip ifconfig Xftp 连接输入IP,然后按照…

Nginx-记

Nginx是一个高性能的web服务器和反向代理服务器&#xff0c;用于HTTP、HTTPS、SMTP、POP3和IMAP协议。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。 &#xff08;1&#xff09;更快 这表现在两个方面&#xff1a;一方面&#xff0c;在正常情况下&…

Go的数据结构与实现【Stack】

介绍 栈是存放值的一种特殊容器&#xff0c;在插入与删除值时&#xff0c;这种结构遵循后进先出&#xff08;Last-in-first-out&#xff0c;LIFO&#xff09;的原则&#xff0c;也就是说&#xff0c;值可以任意插入栈中&#xff0c;但每次取出的都是此前插入的最后一个值。 实…

STM32第十节(中级篇):EXTI(第一节)——EXTI功能框图及初始化结构体讲解(包括STM32中断应用总结)

目录 前言 STM32第十节&#xff08;中级篇&#xff09;&#xff1a;EXTI&#xff08;第一节&#xff09;——EXTI功能框图及初始化结构体讲解&#xff08;包括STM32中断应用总结&#xff09; EXTI功能框图 EXTI初始化结构体讲解 STM32中断应用总结 NVIC介绍 优先级 优先…

安卓Activity上滑关闭效果实现

最近在做一个屏保功能&#xff0c;需要支持如图的上滑关闭功能。 因为屏保是可以左右滑动切换的&#xff0c;内部是一个viewpager 做这个效果的时候&#xff0c;关键就是要注意外层拦截触摸事件时&#xff0c;需要有条件的拦截&#xff0c;不能影响到内部viewpager的滑动处理…

数据结构:静态链表(编程技巧)

文章目录 一、理解二、静态链表2.1、结构定义2.2、静态链表的初始化2.3、操作2.4、示例2.5、优点2.6、缺点 三、例题 ​ 链表的元素用数组存储&#xff0c; 用数组的下标模拟指针。 一、理解 如果有些程序设计语言没有指针类型&#xff0c;如何实现链表&#xff1f;   在使用…

电气识图基础

1 电气系统组成 电气系统分为强电系统和弱电系统。 强电系统有变配电系统,照明系统,动力系统,接地系统。弱电系统有消防报警系统,安全防范系统,楼宇自控系统等等。强电和弱电的区别? 在非电力工程领域。强电和弱电是以电压分界的,工作在交流220伏以上为强电,以下为弱电…

【目标跟踪】红绿灯跟踪

文章目录 一、前言二、结果三、跟踪3.1、检测输入3.2、预测与运动补偿3.3、第一次匹配3.4、第二次匹配3.5、第三次匹配3.6、航迹的起始与信息的发布 四、后记 一、前言 红绿灯场景对当前无人驾驶来说是个灾难性的挑战。暂且不说复杂的十字路口&#xff0c;譬如简单的人行道红绿…

马上蓝桥杯了,干货总结动态规划专题,祝你考场爆杀(拔高篇)最佳课题选择 书本整理 打鼹鼠 吃吃吃 非零字段划分

目录 最佳课题选择 思路&#xff1a; 书本整理 思路&#xff1a; 打鼹鼠 思路&#xff1a; 吃吃吃 思路&#xff1a; 非零字段划分 最佳课题选择 思路&#xff1a; 根本还是论文的分配&#xff0c;每个课题分配多少个论文是不确定的&#xff0c;这个也是很影响转…

天梯算法Day3整理

浮点数解析 炸鱼题掠过 冲突值 题面 解析 方法一 —— 并查集 按照边值排序&#xff0c;然后按边值从大到小遍历&#xff0c;通过并查集判断能否将所有点无冲突地归于两个集合。在判断时&#xff0c;若有两个点不得不产生冲突&#xff0c;则输出这两个点之间的边值并结束。…