Spring Boot中Spring AOP无法拦截Model类setter方法问题排查
问题根本原因
Spring AOP 基于代理模式实现,仅对 Spring IoC 容器托管的 Bean 对象生效。你代码中的 ModelRequest 是接口请求时由 Jackson 反序列化生成的普通 POJO 实例,不受 Spring 容器管理,不会生成代理对象,因此定义的 setter 切入点无法触发,@EnableAspectJAutoProxy 配置也不会作用于这类非托管的普通对象。
可行解决方式
方案1:改用 AspectJ 编译时织入
放弃 Spring AOP 的代理模式,使用 AspectJ 编译时织入能力,在编译阶段直接把切面逻辑植入目标类的字节码中,不管对象是否受 Spring 托管,方法调用都会触发切面。
操作参考:
- 在 Maven 配置中引入
aspectj-maven-plugin编译插件 - 配置插件指定你的切面类、要织入的目标类范围
- 重新编译项目后运行即可,无需修改现有切面逻辑
方案2:调整切入点位置
如果不想引入额外的编译配置,可以调整切面的触发逻辑,避开对普通 POJO 方法的切入:
- 可以选择切上层的 Spring 托管 Bean 方法,比如 Controller 接口方法、参数解析器方法
- 或者把
ModelRequest字段的自定义处理逻辑抽成公共方法,放到 Spring 托管的工具类中,切入这个工具类的对应方法即可
方案3:运行时织入(不推荐)
也可以配置 AspectJ 加载时织入,在 JVM 加载类的时候植入切面逻辑,不过需要修改 JVM 启动参数,复杂度高于编译时织入。
内容的提问来源于stack exchange,提问作者Snehasis Rout
相关产品推荐
相关产品推荐

