Spring:AOP 与事务失效场景
掌握 AOP 的两种代理方式、自调用导致注解失效的根因,以及 Spring 事务常见的失效情形。
本节你将能
区分 JDK 动态代理与 CGLIB,解释同类方法自调用为何让 @Transactional/@Async 失效,并列举事务失效场景。
核心要点
- 有接口默认 JDK 动态代理(基于接口),无接口用 CGLIB(基于继承,final 不可代理)。
- 同类 A 调 B 用 this 调用原始对象,绕过代理,故 B 上的事务/异步/缓存注解不生效;解决:自注入、拆 Bean、AopContext.currentProxy()。
- 事务失效:非 public、异常被 catch、抛出非 RuntimeException 且未配 rollbackFor、数据库引擎不支持事务等。
面试连招
追问:@Transactional(readOnly=true) 有什么用?REQUIRED 与 REQUIRES_NEW 的区别?