Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

  • 前言
  • 应用场景
  • 开始实战
    • ❶ 初始化项目
    • ❷ 创建自定义注解
    • ❸ 定义配置管理类
    • ❹ 定义切面类
    • ❺ 使用切面
    • ❻ 创建测试Controller
    • ❼ 测试效果
  • 总结

前言

本文对应代码下载地址:https://download.csdn.net/download/lhmyy521125/89504659 无需积分!

AOP(面向切面编程)是一种强大的编程范式,可以用于日志记录性能监控安全检查等跨越多个模块的通用功能。实现 AOP 的动态热插拔可以让我们在不重启应用的情况下启用禁用特定的切面,提高系统的灵活性和可维护性。

我们以一个例子来说明一下为什么需要 AOP 动态热插拔:我们系统有一个 AOP 切面,它负责了记录用户传递参数、执行时间、接口返回结果,默认是不开启的,现在因为某些原因需要检测某个接口参数接收情况 + 耗时 + 返回数据,那么我们就需要在不重启应用的情况下,动态开启关闭AOP切面来达到我们想要的效果。

本文就跟着博主一起来学习在 Spring Boot 中实现 AOP 的动态热插拔功能。


应用场景

动态热插拔功能适用的场景有很多,这里简单举例几个场景:

  • 1、调试和排查问题:在生产环境中临时启用日志或性能监控切面,以便快速定位问题。例如,当发现某个服务的响应时间突然增加时,可以动态启用性能监控切面,记录每个方法的执行时间,从而找出性能瓶颈。

  • 2、动态功能开关:根据业务需求动态启用或禁用某些功能,如限流鉴权等。例如,在高流量的促销活动期间,可以临时启用限流切面,防止服务器过载。在活动结束后,可以动态关闭限流切面,恢复正常流量处理。

  • 3、性能优化:在高负载时关闭一些耗性能的切面以提高系统吞吐量。例如,在系统的非高峰期,可以启用详细的日志记录和审计切面,以便收集用户行为数据和系统操作日志。而在系统高峰期,可以临时关闭这些切面,以减少日志记录带来的性能开销。

  • 4、安全审计:在面对安全审计或合规检查时,可以临时启用安全检查切面,记录所有的安全相关操作。例如,在接到安全审计通知时,可以动态启用安全检查切面,记录所有用户的登录和数据访问行为,确保审计数据的完整性。

  • 5、实验和AB测试:在进行新功能的实验和AB测试时,可以动态控制某些功能的启用。例如,在推出新功能时,可以动态启用或禁用相关切面,控制新功能的实验组和对照组,从而评估新功能的效果和性能影响。


开始实战

废话了那么多,我们还是以代码样例来进行演示讲解

❶ 初始化项目

首先,创建一个新的 Spring Boot 项目,在在 pom.xml 文件中添加相关依赖

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter AOP --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
</dependencies>

❷ 创建自定义注解

package com.toher.project.dynamic;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
}

❸ 定义配置管理类

定义一个配置管理类,主要作用是控制AOP开关

package com.toher.project.dynamic;import org.springframework.stereotype.Component;@Component
public class AspectConfig {private boolean loggingEnabled = true;public boolean isLoggingEnabled() {return loggingEnabled;}public void setLoggingEnabled(boolean loggingEnabled) {this.loggingEnabled = loggingEnabled;}
}

❹ 定义切面类

定义一个切面类,模拟业务耗时打印的功能

package com.toher.project.dynamic;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {@Autowiredprivate AspectConfig aspectConfig;@Around("@annotation(com.toher.project.dynamic.Loggable)")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {if (!aspectConfig.isLoggingEnabled()) {return joinPoint.proceed();}long start = System.currentTimeMillis();Object proceed = joinPoint.proceed();long executionTime = System.currentTimeMillis() - start;System.out.println(joinPoint.getSignature() + " 方法执行时间 " + executionTime + "ms");return proceed;}
}

❺ 使用切面

编写一个 service,在需要记录日志的方法上使用 @Loggable 注解

package com.toher.project.dynamic;import org.springframework.stereotype.Service;@Service
public class UserService {@Loggablepublic void performOperation() {// 业务逻辑System.out.println("执行相关操作...");}
}

❻ 创建测试Controller

接下来编写一个Controller主要用于测试,开关AOP的日志时间打印功能

package com.toher.project.dynamic;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/config")
public class ConfigController {@Autowiredprivate AspectConfig aspectConfig;@Autowiredprivate UserService userService;/*** 测试AOP执行* @return*/@GetMapping("/logging")public String isLoggingEnabled() {userService.performOperation();return "SUCCESS 当前loggingEnabled为 " + aspectConfig.isLoggingEnabled();}/*** 开关AOP日志耗时记录功能* @param enabled*/@PostMapping("/logging")public String setLoggingEnabled(@RequestParam boolean enabled) {aspectConfig.setLoggingEnabled(enabled);return "更新成功当前loggingEnabled为 " + aspectConfig.isLoggingEnabled();}
}

❼ 测试效果

运行Spring Boot项目,博主使用 Apifox 访问 http://localhost:端口号/api/config/logging
在这里插入图片描述
观察控制台输出

在这里插入图片描述

修改我们的loggingEnabled
在这里插入图片描述
修改后再次观察控制台,发现当 loggingEnabled = false 本次并没有执行耗时打印功能

在这里插入图片描述


总结

通过上述简单的DEMO相信大家已经初步了解了实现 AOP 动态热插拔功能,DEMO代码仅仅为了演示,实际上我们项目中还可以考虑以下几点:

  • 配置持久化:可以将配置状态存储在数据库或其他持久化存储中,确保应用重启后配置不丢失。
  • 丰富的控制接口:根据实际需求,可以扩展 REST 接口,增加对多个切面和更多配置项的管理。
  • 细粒度控制:在切面逻辑中可以根据更多条件(如请求参数、用户角色等)进行更细粒度的控制。

本篇文章我们实现了 Spring Boot 项目中 AOP 切面的动态热插拔功能。关键点在于通过配置管理类动态控制切面的启用状态,并在切面逻辑中根据状态决定是否执行切面代码。这样可以在不重启应用的情况下动态调整应用行为,提高系统的灵活性和可维护性。

如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!


在这里插入图片描述

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

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

相关文章

python中的包和模块

目录 一、包与模块 二、第三方包的安装 2.1 pip install 2.2使用 curl 管道 2.3其他安装方法 三、导入单元的构成 3.1pip的使用 四、模块的缓存 一、包与模块 Python 中除了函数库以外&#xff0c;还有非常多且优秀的第三方库、包、模块。 模块Module&#xff1a;以…

【linux网络(七)】数据链路层详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 认识MAC…

【计算机毕业设计】061互助学习微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

北京网站建设怎么开始做

北京作为中国的首都&#xff0c;拥有众多的企业和机构&#xff0c;网站建设不仅是一种宣传和推广的手段&#xff0c;更是企业发展的必备工具。但是对于很多企业来说&#xff0c;网站建设是一个相对陌生的领域&#xff0c;不知道从哪里开始。今天我们就来谈一谈北京网站建设的步…

Dockerhub无法拉取镜像配置阿里镜像加速器

打开阿里镜像加速地址&#xff1a; https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 根据平台类型按照对应方式进行配置&#xff1a;Dokcer Desktop是在右上角点开配置 找到Docker Engine 进行设置JSON结构&#xff1a; 记得要重启Docker服务才会生效&#xff01…

深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 预测系统的分类指标(精确率、召回率和 F1 值) 简介 让我们来谈谈预测系统的分类指标以及对精确率、召回…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

数据资产的价值变现及管理规划(AMT企源)

从数据资源到数据资产之数据资产的价值变现及管理规划 题记 本文旨在探讨数据资产发展途径、数据产权及价值变现的服务流程和路径&#xff0c;并对数据资产管理平台框架、数据资产管理实施规划做出初步解读&#xff0c;以期为数据资产管理提供有益的思路和方案。 本次推出《从…

09 - Python图形用户界面和游戏开发

图形用户界面和游戏开发 基于tkinter模块的GUI GUI是图形用户界面的缩写&#xff0c;图形化的用户界面对使用过计算机的人来说应该都不陌生&#xff0c;在此也无需进行赘述。Python默认的GUI开发模块是tkinter&#xff08;在Python 3以前的版本中名为Tkinter&#xff09;&…

【linux】虚拟机安装 BCLinux-R8-U4-Server-x86_64

目录 一、概述 1.1移动云Linux系统订阅服务 CLS 1.2 大云天元操作系统BC-Linux 二、安装 一、概述 1.1移动云Linux系统订阅服务 CLS 移动云Linux系统订阅服务 CLS &#xff08;Cloud Linux Service&#xff09;为使用BC-Linux操作系统的用户提供标准维保服务以及高级技术支…

mysql-5.6.26-winx64免安装版本

mysql为什么要使用免安装 MySQL 提供免安装版本主要有以下几个原因和优势&#xff1a; 便捷性&#xff1a;用户无需经历安装过程&#xff0c;直接解压即可使用。这对于需要快速部署环境或者在不支持安装权限的系统上使用MySQL非常有用。灵活性&#xff1a;免安装版允许用户将…

Optional类方法

Optional类 简介方法empty()方法of(T value)ofNullable(T value)filter(Predicate<? super T> predicate)get()ifPresent(Consumer<? super T> consumer)isPresent()map(Function<? super T,? extends U> mapper)orElse(T other)orElseGet(Supplier<?…

LeetCode 子集

原题链接78. 子集 - 力扣&#xff08;LeetCode&#xff09; 这是一道暴力搜索问题参考大佬们的题解&#xff0c;对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择&#xff0c;递归调用进入下一层 4.回溯&#xff0c;返回到递归前的状态 要完成前面这…

最新扣子(Coze)实战案例:图像流工具之创建一个精美的LOGO,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 关注斜杠君&#xff0c;可获取完整版教程。&#x1f44d;&#x1f3f…

商家团购app微信小程序模板

手机微信商家团购小程序页面&#xff0c;商家订餐外卖小程序前端模板下载。包含&#xff1a;团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板

linux-内存映射MMAP-lseek-dup-fifo-通信-IO多路复用

1、内存映射MMap&#xff1a; DMA&#xff1a; 可以用*/[]取代read和write&#xff1b; 限制&#xff1a; 1、文件大小固定不能改变&#xff1b;&#xff08;ftruncate&#xff09; 2、只能是磁盘文件&#xff1b; 3、建立映射之前先open mmap函数&#xff1a; mmap第一个…

生产环境 CentOS 7 k8s v1.28.0离线部署

背景描述&#xff1a;CentOS 7 Kubernetes 离线部署 随着云计算和微服务架构的普及&#xff0c;Kubernetes&#xff08;K8s&#xff09;已经成为容器编排的标准工具。它能够自动化应用的部署、扩展和管理&#xff0c;使得开发和运维的工作更加高效和可靠。然而&#xff0c;在一…

腾讯开源高质量人类运动视频的框架;通过音频指令修改图像;利用YOLO分析网球视频;Gemma-2中文微调模型

✨ 1: MimicMotion MimicMotion 腾讯开源的通过姿态指导生成高质量任意长度人类运动视频的框架 MimicMotion 是一种可控视频生成框架&#xff0c;旨在生成高质量的任意长度人物动作视频&#xff0c;采用带有置信度的姿态引导&#xff0c;并通过区域损失放大来缓解图像失真。其…

C++视觉开发 三.缺陷检测

一.距离变换 1.概念和功能 距离变换是一种图像处理技术&#xff0c;用于计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距…

苍穹外卖--sky-take-out(五)前端

大部分笔记都是写在语雀的&#xff0c;这是一次性从本人语雀复制过来的&#xff0c;可能结构有些错乱 基础创建 环境要求 node.js npm Vue CLI 创建前端工程 使用vue ui命令创建 项目结构 启动项目 打开命令行窗口 快捷键ctrlj 或者 运行 输入&#xff1a;npm run ser…