Spring的AOP失效场景

首先要知道Spring AOP的原理,是通过动态代理实现的,那什么是动态代理呢。静态代理就是直接编写代理类,这样不侵入原有的代码逻辑,让原有代码不改动好维护。但是代码逻辑不好复用,不灵活,可能要手写多个代理类。

动态代理就是在运行时,程序帮我们生成代理对象。这里需要了解字节码原理和类加载和虚拟机执行机制。

jdk代理通过实现接口的方式 在启动运行类加载的阶段,用反射生成字节码。 适合多例对象 频繁创建

cglib https://zhuanlan.zhihu.com/p/689956685 可以代理类和接口, 轻量的字节码处理框架ASM,动态生成字节码,创建其子类的方式,二者都不支持final类型的代理。 性能比反射好 但是创建花的时间多

那么spring的AOP失效,无法实现拦截都有什么场景呢:

  1. 非Public方法

  2. final的 静态的

    因为不能被代理所以动态代理的拦截会失效

  3. 不受spring管理的 直接new的

  4. 内部调用不会走代理 走的是自身的对象

    解决:AopContext.getCurrentProxy() 是通过静态的threadlocal拿到当前代理对象

    比如

    如果切面里配置了所有这个类的方法增强,add方法却不会再次执行切面的增强逻辑

  5. @Async异步方法AOP拦截器无法跟踪到这些新线程中的方法调用。

延伸:

@Transcational失效的场景

1.加在非public方法上了

2.非事务方法调用事务方法 内部调用绕过了代理对象

3.异常被捕获了没抛出

  1. 异常类型不匹配 抛出checked exception 不rollback for Exception class

只有RuntimeException和Error会触发回滚。如果是检查型异常,Spring认为这是业务层面的正常流程,不应该回滚事务。

  1. requires_new传播机制时,外层的回滚不回影响本来的事务,被挂起的
    面试问题视频
相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~4 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8294 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
candyTong5 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
GetcharZp6 小时前
GitHub 2.4 万 Star!D2 正在重新定义程序员画图方式
后端
阿维的博客日记6 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI6 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding7 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构