在 Java 中,Proxy(动态代理)失效是一个常见问题,通常并不是“代理不存在”,而是调用没有走到代理对象。下面按常见原因 → 原理 → 解决方式系统说明。
@Service
public class UserService {
public void a() {
b(); // ❌ this.b()
}
@Transactional
public void b() {
// 事务不会生效
}
}
原因
this.b() 是目标对象自身调用,不经过代理✅ 解决方式
@Autowired
private UserService self;
AopContext.currentProxy()(需开启暴露代理)public class UserService {
public void test() {}
}
✅ 解决
spring:
aop:
proxy-target-class: true
或
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Transactional
private void test() {} // ❌
原因
public 方法✅ 解决
publicUserService service = new UserService();
service.test(); // ❌
✅ 解决
例如:
@Transactional(rollbackFor = Exception.class)
但抛出的是 Error
或:
@Cacheable(key = "#id")
但方法返回 void
✅ 检查:
public final void test() {}
✅ 解决
UserService proxy = context.getBean(UserService.class);
UserService wrap = new Wrapper(proxy);
如果后续调用的是 wrap,可能内部没走代理
@Around("execution(* com.x..*.*(..))")
但类在 com.y
✅ 用:
@Around("within(com.y..*)")
Method.invoke(target)✅ 是否通过 Spring Bean 调用
✅ 是否是 public 方法
✅ 是否是自调用(this)
✅ 是否接口 + JDK Proxy
✅ 是否 final
✅ AOP 切点是否匹配
✅ 是否开启了代理
Java Proxy 失效,99% 是因为:调用没有经过代理对象。
如果你有具体场景(Spring / MyBatis / RPC / 自定义 Proxy),我可以给你针对性分析。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。