JAVA问题记录-利用Spring AOP来拦截特定方法上的注解并根据业务修改注解字段值

Spring AOP拦截Controller日志记录实战 切点(Pointcut)是Spring AOP中最为关键的概念之一,它决定了在哪些方法上应用切面逻辑。简单来说,切点是一种表达式语言,用于匹配程序中的连接点(Joinpoint)。通过定义切点,我们可以精确地控制AOP逻辑在哪些执行点被触发,例如方法调用、字段访问等。在本章中,我们将深入探讨切点的基本概念、表达式语法、实现方式,并结合实际案例展示如何在Controller层定义切点以实现特定功能。在Spring AOP中, 阅读详情

问题起因:

    首先有块业务,需要添加埋点内容,但是此处埋点在入参值中有一个字段值,这个字段值的不同,会发送不同的打点信息(这个是在接口返回正确的情况下调用的),奔着解耦原业务和埋点的出发点,于是选择利用注解和SpringAOP来实现,其实这个实现还有其他的方式。但是此次就我实现的方式解释下,并把遇到的问题记录下。

   二话不说,先上代码

@AfterReturning(value = "interceptorMethod(reqModel,request)", returning = "responseModel")
    public void afterReturningAdvice(JoinPoint joinPoint, ReqPublishDynamicModelXX reqModel, HttpServletRequest request, ResponseModel responseModel) {
        if (responseModel.getError() == ErrorCodes.OK){
	Signature signature = joinPoint.getSignature();
        if (signature instanceof MethodSignature) {
            MethodSignature methodSignature = (MethodSignature) signature;
            PointResource pointResource = methodSignature.getMethod().getAnnotation(PointResource.class);
            if (null != pointResource) {
                InvocationHandler handler = Proxy.getInvocationHandler(pointResource);
                Field sourceField;
                try {
                    sourceField = handler.getClass().getDeclaredField("memberValues");
                    sourceField.setAccessible(true);
                    Map<String, Object> memberValues = (Map<String, Object>) sourceField.get(handler);
                    if (reqModel.getTopicId() <= 0) {                       
                        memberValues.put("source", 7);
                    } else {    
                        memberValues.put("source", 5);
                    }
                } catch (Exception e) {
                    //省略.....
                }
                userPointService.handleUserPointResource(userModel.getUid(), pointResource.source(), pointResource.type(), pointResource.plus(), UUID.randomUUID().toString());
            }
        }
	}
    }

接下来针对代码中的部分内容进行解

1、释@AfterReturning这个是在方法执行返回后织入的,因为要根据业务的调用结果来判断是否需要执行,这点很简单。

2、PointResource pointResource = methodSignature.getMethod().getAnnotation(PointResource.class);这句是获取方法上的注释类,InvocationHandler handler = Proxy.getInvocationHandler(pointResource);这一句是利用代理来获取注解类的InvocationHandler,其实对应注解类的具体InvocationHandler接口实现类是AnnotationInvocationHandler,但是这个类不是public的,所以无法直接使用,知道具体的实现类之后,我们会从AnnotationInvocationHandler的源码类中发现所有的注解类的字段都维护在一个叫做Map<String, Object> memberValues这么个字段中,所有才有sourceField = handler.getClass().getDeclaredField("memberValues");这么一句,在执行完这一句之后,我们会获取到Map<String, Object> memberValues字段,并且通过   memberValues.put("source", 7);这样类似的语句来实现控制注解的字段值内容。

到这里所有的业务实现都已经完成了,接下来说说遇到的坑点.....

===================================华丽的分界线================================

坑点描述:加在方法上的注释类,由于当前类是由Spring托管的,所以对于该类的默认对象实例是单例类,那么对于加在该类方法上的注解类也是单例的(可能对于注解类描述不恰当,但是是为了表达对于该方法每次调用都是同一个注解类),那么在通过代理模式修改了注解类的字段值之后,那么对于该字段值影响是永久的。但是我错误的认为该注解类是原型的(即每次访问都算是一个全新的注解类)这就导致我业务代码书写错误了。

简单的SpringMVC加注解AOP,改变传进的值 里面使用Spring3.0 MVC,简单的注解和AOP,AOP改变了传进来的值,写了一个自定义注解,可在任意类中使用,不过自定义注解要结合反射才有效果 立即下载

相关推荐

CST毫米波雷达ADAS仿真:从直角反射器到距离多普勒(RD图)的实战解析

本文通过CST Studio Suite实战解析毫米波汽车雷达ADAS仿真,详细演示了从构建直角反射器目标、参数化定义速度、进行参数扫描到生成距离多普勒图(RD图)的全过程。文章深入探讨了雷达关键参数(如距离分辨率、速度分辨率)的设计权衡与工程逻辑,并提供了单位统一、速度范围设定等实用避坑指南,帮助工程师高效完成雷达系统性能的前期验证与优化。

weixin_29292535的博客 502

java aop注解拦截_Spring AOP 拦截指定注解标识的类或方法

代码Demo@Aspect@Component@Order(10)public class BidAuthorityProxy {/*** 扫描指定包下的类中使用@EnableRoleAuthority注解修饰的类*/@Around("@within(com.core.annotation.EnableRoleAuthority) && within(com.bid..*)")pu...

weixin_39951295的博客 1537

docker配置国内镜像源

【代码】docker配置国内镜像源。

愿听风成曲 9614

SpringBoot项目中使用AOP对指定接口参数进行校验.通过自定义注解修饰接口进行拦截,操作接口数据.

/ 定义注解的保留策略为运行时,这样在运行时可以通过反射读取注解信息// 定义注解可以作用的目标,这里定义在方法上// 标记注解// 还可以定义其他属性,根据校验需求来扩展// ...// 其他方法...

m0_51148270的博客 562

浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog

ArcMap:是集空间数据显示、矢量数据编辑、冲突数据检查(拓扑检查)、查询检索(地理编码)、统计(字段属性表)、报表生成、空间分析(ArcGIS Spatial Analyst)和高级制图(制图表达)等众多功能干一体的桌面应用平台软件。而且提供所见即所得的符号编辑器,令用户可以随心所欲地生成任意复杂的点、线、面符号。所支持的空间数据格式包括Arclnfo coverages、ESRI shapefiles、ArcSDE lavers、DXF、DWG、DGN、常见的图像格式、GRIDs、TINs等。

lxlmycsdnfree的博客 6563

Neo4j Desktop新手必看:3分钟搞定CSV数据导入(附常见报错解决方案)

本文详细介绍了在Neo4j Desktop中高效导入CSV数据的三种主流方法,包括图形化界面操作、命令行批量导入和Python驱动编程导入,并提供了常见报错解决方案和性能优化技巧,帮助新手快速构建知识图谱。

lambda的博客 648

AOP方法拦截获取方法上的注解和参数前的注解

【代码】AOP方法拦截获取方法上的注解和参数前的注解。

weixin_55061723的博客 999

LoFTR训练避坑指南:从零到一复现论文训练流程

本文是一份详细的LoFTR模型训练避坑指南,旨在帮助开发者从零开始复现论文训练流程。文章系统性地讲解了环境配置、数据准备、代码调试与显存优化等关键步骤,并针对常见的训练错误提供了解决方案,确保训练过程顺利进行。

weixin_29091837的博客 204

针对某个自定义注解进行aop拦截

@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface AvoidResubmit { /** * 失效时间 * * @return s */ long expireTime() default 5 * 1000L; } @Component @Aspect @Slf4j public c..

IT的鱼 336

GIS应用技巧之三招搞定重叠区域数据提取

在很多分析过程中,常常需要分析判断哪些图形发生了重叠,该重叠情况的发生在对应分析环境下具有特定意义。例如在缓冲区分析中,若两个受灾点周边的受灾面积(即缓冲区)有所重叠,分析重叠区域的受灾影响时,就需要考虑相互影响的因素。本例中先用【要素转面】工具提取出发生重叠的区域,其次用【空间连接】工具将原始图层信息连接到重叠数据的图层,分析重叠数据的属性表,即可得到发生重叠的原始图层数据。 Step1 提取重叠区属数据。打开【数据管理工具】|【要素】|【要素转面】工具,输入要素设置为“circles”,输出要素类设置为

端木宛白的博客家园 6万+

图解说明JLink驱动与目标板电源匹配的关键细节

深入讲解JLink驱动安装及使用过程中,如何正确匹配目标板电源,避免常见通信故障。通过图解方式清晰展示关键连接细节,确保调试稳定可靠,是嵌入式开发中不可或缺的实战经验分享。

weixin_42173218的博客 431

SpringAOP之AspectJ+拦截自定义注解

一、AOP基本概念 假设现在我们要对一个Test类进行事务代码织入,那么我们需要知道这个类有哪些方法,然后需要知道这个类的哪些方法需要织入事务代码。 1.目标类:需要织入日志代码的类,也就是Test类。 2.连接点:目标类的所有方法,都叫做连接点。 3.切点:切点就是具体织入日志代码的方法。 4.增强:织入的日志代码,就是增强部分。 5.织入:将增强和目标类的切点方法结合在一起,形成一...

tanglihai的博客 1421

YOLOv11改进-上采样 | EUCB高效上卷积块,实现特征图尺度匹配和高效上采样

本文介绍了一种在YOLOv11目标检测模型中引入高效解码器模块EMCAD的创新方法,以提升模型在资源受限场景下的性能与效率。EMCAD由多个模块构成,其中核心的EUCB(高效上卷积块)通过上采样、深度可分离卷积、激活归一化和通道调整等操作,兼顾了特征质量与计算成本。实验结果显示,该模块在显著减少参数与FLOPs的同时仍具备优异性能。文章还提供了完整的YOLOv11模型集成流程、配置和训练实战。

魔改工程师的博客 1540

Spring Boot AOP 切面注解

AOP,即面向切面编程,是一种编程范式,旨在处理程序中那些分散在各处的“横切关注点”。横切关注点通常是那些贯穿多个模块的功能,比如日志记录、性能监控、事务管理、安全检查等。AOP 的核心思想是通过“切面”将这些关注点与业务逻辑分离,使得代码更为简洁且易于维护。在 Spring 中,AOP 是通过动态代理实现的。Spring 使用 AOP 来在运行时动态织入一些逻辑,如方法执行前后插入代码、捕获异常等,而无需改变原始的业务代码。自定义注解是 Java 提供的一种灵活机制,用于创建可自定义的元数据。

lenyan~的博客 1895

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring AOP原理详解及实例

Spring AOP原理详解及实例 1.Spring AOP简介 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻...

weixin_43611145的博客 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SpringBoot自定义注解实现(配合AOP、反射机制、拦截器使用)

SpringBoot自定义注解实,配合AOP实现日志记录、配置反射机制判断是否存在注解、配合拦截器严重Token

一恍过去 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring AOP与自定义注解

摘要:本文介绍如何利用Spring AOP和自定义注解实现业务逻辑与横切关注点(如日志、耗时统计)的解耦。通过定义@Time统计注解标记需拦截的方法,结合切面类(@Aspect)实现环绕通知,动态注入耗时统计逻辑。核心优势包括:业务代码零侵入、共性逻辑统一管理、注解精准拦截提升性能。文章详细演示了从注解定义、切面实现到业务集成的完整流程,并通过用户管理模块案例验证了方案的实用性。适用于日志记录、权限校验等需解耦的通用场景,显著提升代码可维护性。

没事学AI的博客 1330

Spring AOP控制日志管理对修改字段比较提取插入

本程序代码是基于ssh的   1 。 基于接口编程创建一个日志接口 package com.osnt.dao.recordLog; import java.io.Serializable; import com.osnt.dao.BaseDAO;//这里面包含了很多操作数据库的方法比如update,insert,select,delete import com.osnt.entit

alongshow的专栏 2365

自定义注解实现 AOP 指定 interfice 日志记录功能

工作需求:在已有的项目中 增加操作日志功能, 要求 操作记录详细到 具体字段的修改,可指定具体需要记录的字段。 工作分三步走: 第一,增加自定义注解,确定拦截数据的格式。 第二:增加aop拦截器。 第三:业务代码。 第一,增加自定义注解,确定拦截数据的格式。 1.声明@interface 类 。 2.:声明 注解应用于方法级别 @Target({ElementType.METHOD,ElementType.PARAMETER}) 3.声明 注解 运行时可用 @Reten...

shaochong047的博客 645

Spring 注解+AOP实现日志记录功能

注解类上的三个注解称为元注解(),其分别代表的含义如下: @Documented:注解信息会被添加到Java文档中 @Retention:注解的生命周期,表示注解会被保留到什么阶段,可以选择编译阶段、类加载阶段,或运行阶段(). @Target:注解作用的位置,表示该注解仅能作用于方法上 目前注解可以加到方法上,但是并没有任何作用。因为仅仅是声明了注解,下面通过Spring AOP去完善注解的作用。 Spring AOP的基础知识 AOP 术语Spring切面可以应用5种类型的通知 日志记录演示

Carroll的博客 1353

基于Spring AOP自动填充字段

Spring AOP(Aspect-Oriented Programming)是 Spring 框架中的一个核心模块,用于实现面向切面编程。它提供了一种将横切关注点(cross-cutting concerns)与核心业务逻辑分离的机制。在传统的面向对象编程中,我们通常按照功能模块对代码进行划分,比如将业务逻辑、数据访问、日志记录等功能分别封装在不同的类中。然而,某些功能可能会跨越多个模块,比如日志记录、事务管理、权限控制等,这就是所谓的横切关注点。横切关注点的存在会导致代码的重复性。

分享技术,分享经验 1385

【注解+aop 记录日志】关于如何使用自定义 @Log 注解实现 Spring AOP 操作日志记录功能的详细教程

📝【SpringAOP+注解实现操作日志教程】 通过自定义@Log注解结合SpringAOP,实现低侵入式操作日志记录。只需在方法上添加注解(如@Log(title="新增用户", businessType=INSERT)),即可自动记录方法参数、返回值、异常等信息,无需手动编码。 🔧 核心实现: 定义@Log注解配置模块名、操作类型等 编写切面类LogAspect,通过@AfterReturning和@AfterThrowing拦截目标方法 利用JoinPoint获取上下文信息(类

alan0721的博客 1068

spring记录系统中修改操作前后的记录

spring记录系统中修改操作前后的记录

beckham 5563

终极指南:Spring Boot AOP日志拦截实战方案,3步实现请求全记录

Spring Boot是当今企业级开发的主流框架之一,而AOP(面向切面编程)则是实现横切关注点的强大工具。本文将带你通过Spring Boot Demo项目中的AOP日志拦截方案,学习如何轻松实现请求日志的全面记录,为你的项目监控和调试提供有力支持。 ## 为什么需要AOP日志拦截? 在Web应用开发中,请求日志记录是一项基础而重要的功能。它可以帮助开发者: - 快速定位问题 - 分析用户行

gitblog_02461的博客 1036

Spring Aop 和 自定义注解的使用的详解

什么是AOP AOP,Spring框架的两大核心之一,又称面向切面编程,通过代理模式,对原有的类进行增强。在Spring框架中,AOP有两种动态代理方式,其一是基于JDK的动态代理,需要代理的类实现某一个接口;其二是基于CGLIB的方式,该方式不需要类实现接口就能进行代理。AOP的应用场景,常见的就是事务的处理和日志的记录,还有权限的认证。(笔者使用AOP的场景:保存所有用户对数据进行的增删改内容等,比如,张三修改了一个表格数据的值,就需要记录谁,什么时候,修改or添加or删除,哪项数据,...

m0_57764322的博客 2846

自定义注解+AOP实现自定义日志

自定义注解是开发者根据特定需求创建的特殊标记,用于为代码元素(如类、方法、字段等)添加元数据信息。这些注解本身不直接改变程序行为,但可以通过反射机制或编译时处理工具来读取并实现特定功能。@Retention:指定注解保留策略● SOURCE:仅保留在源码中(编译时丢弃)● CLASS:保留在class文件中(默认,运行时不可见)● RUNTIME:运行时可通过反射获取@Target:指定注解可应用的目标● ElementType.TYPE:类、接口、枚举。

justsosojump的博客 909
上一篇: MetaQ 安装
下一篇: Mysql加锁过程详解(1)-基本知识
轻鸿飘羽
博客等级 码龄16年 124粉丝 74原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值