一、代理模式的核心本质
无论静态代理还是动态代理,本质都是 "解耦核心业务与非核心功能":
- 目标对象:专注核心业务(如房东出租房子、支付系统扣款);
- 代理对象:负责非核心功能(如身份验证、日志记录、事务控制);
- 用户视角:只与代理对象交互,感知不到目标对象的存在,但能享受到 "非核心功能 + 核心业务" 的完整服务。
二、静态代理:提前定制的 "专属中间人"
1. 核心逻辑
静态代理是编译期绑定特定目标对象与专属代理逻辑,代理类提前编写完成,调用时按 "固定路径" 执行的一对一代理模式。简单来说,就是为某个特定业务定制一个专属代理,代理逻辑和目标对象强绑定,无法复用。
2. 执行流程(逻辑层面)
- 预设绑定:提前确定 "代理对象 - 目标对象 - 专属代理逻辑" 的固定组合(如为 "租房业务" 定制 "中介代理",绑定 "身份验证 + 签合同" 的专属逻辑);
- 调用执行:用户调用代理对象 → 代理执行专属前置逻辑 → 代理调用目标对象核心逻辑 → 代理执行专属后置逻辑 → 返回结果;
- 扩展限制:新增业务需重新编写对应的代理类和代理逻辑,无法复用已有规则。
3. 适用场景
适合业务场景简单、目标对象固定且无需频繁扩展的场景,比如小型系统的单一业务增强(如仅为 "订单查询" 添加权限校验)。
4. 核心特点
- 优点:逻辑简单、直观易懂,开发和维护成本低;
- 缺点:耦合度高、代码冗余,新增业务需重复编写代理逻辑。
三、动态代理:灵活适配的 "通用模板人"
1. 核心逻辑
动态代理是先定义通用代理规则,运行时为任意符合条件的目标对象动态生成代理类,调用时按统一规则执行的一对多代理模式。简单来说,就是先制定一套通用的增强规则,后续所有业务只需绑定该规则,即可自动生成代理,无需重复编写逻辑。
2. 执行流程(逻辑层面)
- 制定规则:定义一套与具体业务无关的通用代理规则(如 "所有业务都先做身份验证,后记录操作日志");
- 动态匹配:需要代理某个业务时,将目标对象与通用规则绑定,运行时自动生成临时代理对象;
- 调用执行:用户调用临时代理对象 → 代理执行通用前置逻辑 → 代理调用当前绑定目标对象的核心逻辑 → 代理执行通用后置逻辑 → 返回结果;
- 扩展优势:新增业务只需实现统一接口,绑定已有通用规则即可,无需修改代理逻辑。
3. 适用场景
适合多业务统一管控、需频繁扩展的复杂场景,比如电商系统的 "支付 / 退款 / 充值" 统一加日志、Spring AOP 的切面增强等。
4. 核心特点
- 优点:耦合度低、逻辑复用性强,扩展灵活;
- 缺点:逻辑稍抽象,需理解 "运行时动态生成代理" 的底层思路。
四、静态代理 vs 动态代理:核心对比
| 维度 | 静态代理 | 动态代理 |
|---|---|---|
| 代理类创建时机 | 编译期(提前编写) | 运行期(动态生成) |
| 规则与对象关系 | 一对一(专属规则绑定特定对象) | 一对多(通用规则适配任意对象) |
| 调用逻辑流转 | 固定路径(专属逻辑 + 固定核心逻辑) | 动态路径(通用逻辑 + 当前核心逻辑) |
| 扩展成本 | 新增业务需新增代理类 / 规则 | 新增业务仅需绑定已有规则 |