在 Java 里“Proxy(代理)”之所以要用,本质上是为了在不修改原有类代码的前提下,对目标对象的行为进行统一控制和增强。下面从「为什么需要」「解决了什么问题」「常见使用场景」三个层面说明。
真实业务类(被代理类)通常已经写好并且稳定运行,你不想也不敢去改它。
Proxy 允许你在外面套一层,对方法调用做“拦截”。
// 原有业务类,不动
class UserService {
void save() {}
}
// 代理增强
Proxy -> 前置日志 -> 调用 UserService.save() -> 后置处理
✅ 符合 开闭原则(对扩展开放,对修改关闭)
很多功能不属于业务本身,但几乎所有方法都要:
如果写在每个方法里:
log();
checkPermission();
beginTx();
doBusiness();
commit();
➡️ 代码极度重复、难以维护
用 Proxy:
proxy.save(); // 自动完成日志、权限、事务
✅ 实现 AOP(面向切面编程)
Proxy 可以控制:
例如:
Proxy.newProxyInstance(
classLoader,
interfaces,
invocationHandler
);
✅ 要求:
✅ 典型场景:
Enhancer.create(Target.class, methodInterceptor);
✅ 特点:
✅ Spring 在“无接口类”时使用
| 场景 | 说明 |
|---|---|
| Spring AOP | 事务、日志、鉴权 |
| RPC 框架 | 远程调用像本地调用 |
| MyBatis Mapper | 接口 → SQL 执行 |
| 延迟加载 | 用时才创建真实对象 |
| 权限控制 | 控制方法是否可执行 |
Java Proxy 的存在,是为了在不侵入业务代码的前提下,对方法调用进行统一拦截、增强和控制。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。