在spring生命周期中对bean方法进行增强

概述

开发中有时候需要对某个bean进行整体的加强,但是当前代码中有很多地方使用这个bean的不同方法;又不想同时修改这些地方留下修改记录
所以我的想法是在spring初始化bean过程中用自己的增强bean进行增强,不侵入业务代码;

整体想法是定义一个装饰器类,对指定bean的需要增强的方法进行增强;
然后通过BeanPostProcessor.postProcessAfterInitialization方法,使用增强bean替换原始bean

捞一张bean的生命周期图;可以看到在postProcessAfterInitialization方法中进行增强比较合适,因为此时原始bean已经是可用状态了
在这里插入图片描述

demo

流程简单的说就是装饰器模式增强,然后通过BeanPostProcessor.postProcessAfterInitialization替换原始bean

package com.xxx.xxx.service.complex;import com.xxx.xxx.dto.WhTailFeeCalBaseInfoDTO;
import com.xxx.xxx.dto.WhTailFeeCalDTO;
import com.xxx.xxx.dto.WhTailFeeCalResultDTO;import java.util.List;public abstract class CalResolveComplexDecorate implements CalResolveComplex {protected CalResolveComplex calResolveComplex;public CalResolveComplexDecorate(CalResolveComplex calResolveComplex) {this.calResolveComplex = calResolveComplex;}@Overridepublic abstract WhTailFeeCalBaseInfoDTO buildFeeBaseInfo(WhTailFeeCalDTO dto);@Overridepublic List<WhTailFeeCalResultDTO> calTailFee(WhTailFeeCalDTO dto) {//默认实现return calResolveComplex.calTailFee(dto);}
}package com.xxx.xxx.service.complex;import com.xxx.xxx.dto.WhTailFeeCalBaseInfoDTO;
import com.xxx.xxx.dto.WhTailFeeCalDTO;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class CalResolveComplexDecorateBuildFeeBaseInfo extends CalResolveComplexDecorate {public CalResolveComplexDecorateBuildFeeBaseInfo(CalResolveComplex calResolveComplex) {super(calResolveComplex);}//增强@Overridepublic WhTailFeeCalBaseInfoDTO buildFeeBaseInfo(WhTailFeeCalDTO dto) {log.info("开始增强buildFeeBaseInfo---------------------");WhTailFeeCalBaseInfoDTO whTailFeeCalBaseInfoDTO = calResolveComplex.buildFeeBaseInfo(dto);log.info("结束增强buildFeeBaseInfo---------------------");return whTailFeeCalBaseInfoDTO;}}package com.xxx.xxx.service.complex;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;import javax.annotation.Resource;@Component
@Slf4j
public class CalResolveComplexPostProcess implements BeanPostProcessor, ApplicationListener<ApplicationReadyEvent> {@Resourceprivate ApplicationContext applicationContext;@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if(bean instanceof CalResolveComplex){//此时原始bean已经经过了spring的bean初始化和依赖注入等过程是一个完全可用的beanlog.info("原始bean替换为增强实例");bean = new CalResolveComplexDecorateBuildFeeBaseInfo((CalResolveComplex)bean);}return bean;}@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {log.info("容器启动完成");CalResolveComplex bean = applicationContext.getBean(CalResolveComplex.class);System.out.println(bean);}
}

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

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

相关文章

基于SpringBoot+Vue+Uniapp微信小程序的电子竞技信息交流平台设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…

模版进阶 非类型模版参数

一.模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使用。 #i…

机器学习项目——运用机器学习洞察青年消费趋势

1. 项目背景 在21世纪的第三个十年&#xff0c;全球经济和技术的飞速发展正深刻影响着各个领域&#xff0c;尤其是青年消费市场。随着数字化进程的加速&#xff0c;尤其是移动互联网的广泛普及&#xff0c;青年的消费行为和生活方式发生了前所未有的转变。 然而&#xff0c;面对…

VMware vCenter Server 8.0U3c 发布下载,修复 U3b 更新停止响应的问题

VMware vCenter Server 8.0U3c 发布下载 - 集中式管理 vSphere 环境 Server Management Software | vCenter 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-8-u3/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMw…

如何在全平台启用 IPv6 网络?(路由器、Windows、Linux、Docker)

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 如今 IPv6 网络越来越普及&#xff0c;也是时候开启 IPv6 网络了&#xff0c;特别是对于 NAS 玩家&#xff0c;开启 IPv6 后&#xff0c;NAS 可以获取到公网 IPv6 用于外网访问&#xff0c;通过 ZeroTier …

利用Matlab处理回声信号(利用卷积运算产生一个带回声的信号)

一、.首先调用一个声音信号&#xff0c;以下是各种MATLAB自带的声音&#xff1b; 1. 鸟叫声 load chirp sound(y,Fs) 2. 敲锣声 load gong sound(y,Fs) 3. 哈利路亚 load handel sound(y,Fs) 4. 欢笑声 load laughter sound(y,Fs) 5. 啪哒声 load splat sound(y,Fs) 6. 火车声 …

seL4 Faults(八)

Faults 学习什么是线程错误理解线程错误和处理器硬件错误是不同的理解什么是错误处理器理解内核对于一个有错误的线程做了什么了解如何设置内核将在其上传递故障消息的端点&#xff08;master与 MCS&#xff09;。在错误故障后学习如何恢复线程。 Background: What is a faul…

SROP验证

文章目录 SROPsignal机制 SROP的利用原理&#xff1a;获取shellsystem call chains条件&#xff1a;sigreturn 测试 例题&#xff1a; SROP signal机制 signal 机制是类 unix 系统中进程之间相互传递信息的一种方法。一般&#xff0c;我们也称其为软中断信号&#xff0c;或者软…

【onnx模型转kmodel】记录和踩坑——nncase-v1.9使用

最近几天一直在找相关资料&#xff0c;坑太多&#xff0c;也可能我菜的成分更多一点吧&#xff01;记录下来&#xff0c;以观后用&#xff1b; 背景 我手里有一个正点原子的K210的开发板&#xff1b; 刚刚安装了wsl2下的ubuntu22.04 我手里有正点原子的源码&#xff0c;但是…

项目管理监控难题解析:为何监控至关重要

项目管理中的监控环节常常被视为一项艰巨的任务&#xff0c;但它却是确保项目成功的关键所在。为何监控在项目管理中如此重要呢&#xff1f;让我们一同深入解析这个难题。 一、目前项目管理监控存在的问题 在项目管理的实践中&#xff0c;监控环节常常暴露出一系列问题&#x…

西门子S7-SMART运动控制向导

打开“运动控制”向导&#xff0c;“工具”->“向导”->“运动控制” 图 1.打开“运动控制”向导 选择需要配置的轴 图 2.选择需要配置的轴 为所选择的轴命名 图 3.为所选择的轴命名 输入系统的测量系统&#xff08;“工程量”或者“脉冲数/转”&#xff…

u_boot内核编译-生成uImage

内核编译 顶层目录&#xff0c;都在这个目录下进行操作 这是我们芯片的默认配置文件 第一步 拷贝一个默认的配置 以下两张是def文件内容 第二步 &#xff1a;打开可视化界面&#xff0c;前面的* 需要用空格点击两下&#xff0c;不改变原设置&#xff0c;大那是需要进行编辑操…

PDF全能免费转换 3.15 | 多功能PDF处理工具

主打就是免费好用&#xff01;1. PDF转Word/PPT/Excel/txt、图片等&#xff1b;2. PDF压缩、合并&#xff1b;3. 多图合并成长图、合并成PDF&#xff1b;4. 身份证扫描、文件扫描、证件扫描等&#xff1b;5. 证件照换底色&#xff1b;6. 热门tab页&#xff1b;7. 美化照片。 大…

【LLM论文日更】| BGE-M3E embedding模型

论文&#xff1a;https://arxiv.org/pdf/2402.03216代码&#xff1a;GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构&#xff1a;BAAI领域&#xff1a;embedding model发表&#xff1a; ​ 研究背景 研究问题&#xff1a;这篇文章要解决的问…

(JAVA)熟悉队列的进阶结构 - 优先队列

1. 优先队列 ​ 普通队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。 ​ 在某些情况下&#xff0c;我们可能需要找出队列中的最大值或者最小值&#xff0c;例如使用一个队列保存计算机的任务&#xff0c;一般情况下计算机的任务都是有…

pytest框架之fixture测试夹具详解

前言 大家下午好呀&#xff0c;今天呢来和大家唠唠pytest中的fixtures夹具的详解&#xff0c;废话就不多说了咱们直接进入主题哈。 一、fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown&#xff0c;但相对之下它的功能更加强大和灵活。 …

谁说电商选品找货源没有捷径,只要你用对工具!

最近跟很多同行聊&#xff0c;都在抱怨选品难的问题&#xff0c;都说7分靠选品&#xff0c;3分靠运营&#xff0c;对于选品来说&#xff0c;并没有捷径可走&#xff0c;但其实是有很多不同的角度的。 现在市面上大部分开发做的选品&#xff0c;“选品方法”或“产品分析方法”…

【含文档】基于Springboot+Android的校园论坛系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

前端省市区组件

官网 Element UI 级联 中国省市区数据. Latest version: 5.0.2, last published: 2 years ago. Start using element-china-area-data in your project by running npm i element-china-area-data. There are 114 other projects in the npm registry using element-china-are…

SpringBoot开发——SpringSecurity安全框架17个业务场景案例(三)

文章目录 一、Spring Security 常用应用场景介绍二、Spring Security场景案例12 表达式支持(Expression-Based)12.1 Spring Security 配置12.2 业务逻辑代码12.3 控制器13、安全上下文(Security Context)13.1 Spring Security 配置13.2 业务逻辑代码13.3 控制器14、安全过滤…