温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Proxy代理失效原因

发布时间:2026-10-31 08:26:18 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

在 Java 中,Proxy(动态代理)失效是一个常见问题,通常并不是“代理不存在”,而是调用没有走到代理对象。下面按常见原因 → 原理 → 解决方式系统说明。


一、最核心原因:方法不是通过代理对象调用的

1️⃣ 自调用(this 调用)导致代理失效(最常见)

@Service
public class UserService {
    public void a() {
        b(); // ❌ this.b()
    }

    @Transactional
    public void b() {
        // 事务不会生效
    }
}

原因

  • Spring AOP / JDK Proxy 是基于代理对象的
  • this.b() 是目标对象自身调用,不经过代理

✅ 解决方式

  • 注入自己(不推荐但可用)
@Autowired
private UserService self;
  • 拆类
  • 使用 AopContext.currentProxy()(需开启暴露代理)

二、代理类型不匹配(JDK vs CGLIB)

2️⃣ 类没有接口,却使用 JDK 动态代理

public class UserService {
    public void test() {}
}
  • JDK 动态代理 只能代理接口
  • 如果没接口 → 必须用 CGLIB

✅ 解决

spring:
  aop:
    proxy-target-class: true

或

@EnableAspectJAutoProxy(proxyTargetClass = true)

三、方法不是 public(AOP 限制)

3️⃣ private / protected 方法代理失效

@Transactional
private void test() {} // ❌

原因

  • Spring AOP 默认只拦截 public 方法
  • CGLIB 也无法覆盖 private 方法

✅ 解决

  • 改为 public
  • 或使用 AspectJ 编译期织入(非 Spring Proxy)

四、对象不是 Spring 管理的 Bean

4️⃣ new 出来的对象不会被代理

UserService service = new UserService();
service.test(); // ❌

✅ 解决

  • 必须通过容器获取 Bean

五、注解/代理条件不满足

5️⃣ 注解条件未命中

例如:

@Transactional(rollbackFor = Exception.class)

但抛出的是 Error

或:

@Cacheable(key = "#id")

但方法返回 void

✅ 检查:

  • 注解属性
  • 异常类型
  • 返回值

六、final 方法 / final 类(CGLIB 限制)

public final void test() {}
  • CGLIB 无法重写 final 方法
  • JDK Proxy 不支持类

✅ 解决

  • 去掉 final

七、代理被“包了一层”

7️⃣ 装饰器 / 手动包装导致代理丢失

UserService proxy = context.getBean(UserService.class);
UserService wrap = new Wrapper(proxy);

如果后续调用的是 wrap,可能内部没走代理


八、切点表达式写错(AOP 不生效)

@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),我可以给你针对性分析。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手