Spring Boot 1.5.10.RELEASE日志切面含2个Pointcut重复执行4次求助
嘿,这个问题我之前在处理Spring Boot 1.5.x版本的时候碰到过,结合相关背景,咱们来一步步拆解解决:
问题根源
Spring Boot 1.5.x版本的AOP模块有个小坑:默认情况下会为Web请求相关的Bean生成两种不同的代理——JDK动态代理和CGLIB代理。而你的切面里刚好定义了两个切点,每个代理都会触发这两个切点的逻辑,2×2就导致了每次请求切面执行4次的情况。
可行的解决方案
强制使用单一代理类型
在项目的application.properties配置文件中添加以下配置:spring.aop.proxy-target-class=true这个配置会让Spring只生成CGLIB代理,避免同时存在两种代理实例,这样你的两个切点就只会各执行一次,总共2次,符合预期。
检查并优化切点表达式
有时候可能你的两个切点表达式存在范围重叠的情况,比如一个切点匹配@RestController下的所有方法,另一个又匹配了同一个包下的所有接口方法,导致同一个请求被两个切点同时命中。可以仔细核对切点的表达式,确保它们的匹配范围是明确且不重复的,或者根据业务需求合并重复的切点逻辑。升级Spring Boot版本(如果项目允许)
这个重复代理的问题在Spring Boot 2.x及以上版本已经被官方修复了,新版本的AOP代理逻辑做了优化,不会再出现这种重复触发的情况。如果项目没有强依赖1.5.x的特性,直接升级到更高版本是一劳永逸的解决办法。
验证方法
修改配置或调整切点后,重启项目并发起接口请求,观察切面的执行日志。如果一切正常,应该只会看到对应两个切点各执行一次的记录。如果还是有问题,可以在切面的方法里打印代理实例的类名(比如System.out.println(this.getClass())),确认是否还有多个代理在触发切面逻辑。
内容的提问来源于stack exchange,提问作者Sober Li

