在 Java 中,Proxy(代理)主要出现在两个层面:JDK 动态代理(java.lang.reflect.Proxy) 和 CGLIB / 字节码增强代理,以及更广义的代理模式(Proxy Pattern)。下面从适用场景角度系统说明。
最典型场景
public class LogProxy implements InvocationHandler {
private Object target;
// invoke 中加日志
}
✅ 适用于:
例如:
UserService userService = (UserService) Proxy.newProxyInstance(...);
userService.getUser(); // 实际是远程调用
当:
✅ 非常适合 JDK Proxy
Proxy.newProxyInstance(...)
只有在真正调用方法时才创建真实对象。
JDK Proxy 只能代理接口
❌ 不行:
class UserService {}
✅ CGLIB 可以
class UserServiceProxy implements UserService {
private UserService target;
}
✅ 适合:
❌ 不适合:
| 场景 | 说明 |
|---|---|
| 安全代理 | 控制访问权限 |
| 虚拟代理 | 延迟创建大对象 |
| 保护代理 | 不同用户不同权限 |
| 缓存代理 | 方法结果缓存 |
| 智能引用 | 引用计数、资源释放 |
❌ 方法不是 public
❌ 类是 final(CGLIB 不行)
❌ 对性能极度敏感(代理有开销)
❌ 逻辑极其简单(直接用代码更清晰)
| 条件 | 使用 |
|---|---|
| 有接口 | JDK 动态代理 |
| 无接口 | CGLIB |
| 强制 CGLIB | @EnableAspectJAutoProxy(proxyTargetClass = true) |
如果你愿意,我可以:
你更想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。