温馨提示×

温馨提示×

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

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

java Proxy代理为什么要用

发布时间:2026-09-19 12:06:27 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 里“Proxy(代理)”之所以要用,本质上是为了在不修改原有类代码的前提下,对目标对象的行为进行统一控制和增强。下面从「为什么需要」「解决了什么问题」「常见使用场景」三个层面说明。


一、为什么要用 Proxy(核心原因)

1️⃣ 不改动原有代码(开闭原则)

真实业务类(被代理类)通常已经写好并且稳定运行,你不想也不敢去改它。

Proxy 允许你在外面套一层,对方法调用做“拦截”。

// 原有业务类,不动
class UserService {
    void save() {}
}
// 代理增强
Proxy -> 前置日志 -> 调用 UserService.save() -> 后置处理

✅ 符合 开闭原则(对扩展开放,对修改关闭)


2️⃣ 统一处理“横切逻辑”(AOP 思想)

很多功能不属于业务本身,但几乎所有方法都要:

  • 日志记录
  • 权限校验
  • 事务管理
  • 性能监控
  • 异常处理

如果写在每个方法里:

log();
checkPermission();
beginTx();
doBusiness();
commit();

➡️ 代码极度重复、难以维护

用 Proxy:

proxy.save(); // 自动完成日志、权限、事务

✅ 实现 AOP(面向切面编程)


3️⃣ 控制对象的访问(安全 & 资源)

Proxy 可以控制:

  • 是否允许调用
  • 是否懒加载
  • 是否限制频率

例如:

  • 远程对象(RMI)
  • 大对象延迟加载
  • 权限受限对象

二、Java 中 Proxy 的两种主要形式

1️⃣ JDK 动态代理(基于接口)

Proxy.newProxyInstance(
    classLoader,
    interfaces,
    invocationHandler
);

✅ 要求:

  • 目标类 必须实现接口

✅ 典型场景:

  • Spring AOP(默认)
  • RPC 框架
  • 事务代理

2️⃣ CGLIB 代理(基于继承)

Enhancer.create(Target.class, methodInterceptor);

✅ 特点:

  • 不需要接口
  • 通过继承实现
  • 不能代理 final 类 / final 方法

✅ Spring 在“无接口类”时使用


三、Proxy 的典型使用场景

场景 说明
Spring AOP 事务、日志、鉴权
RPC 框架 远程调用像本地调用
MyBatis Mapper 接口 → SQL 执行
延迟加载 用时才创建真实对象
权限控制 控制方法是否可执行

四、一句话总结

Java Proxy 的存在,是为了在不侵入业务代码的前提下,对方法调用进行统一拦截、增强和控制。

如果你愿意,我也可以:

  • 用 JDK Proxy 写一个最小示例
  • 对比 Proxy vs 装饰器模式
  • 解释 Spring 为什么默认用 JDK Proxy
向AI问一下细节

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

AI
助
手