什么是动态代理
先聊聊动态代理的概念,以及它和静态代理到底有什么不同。虽然两者在角色属性上相似,但代理类的实现方式截然不同。静态代理是我们提前写好代理类,而动态代理的代理类是在运行时动态生成的。
理解代理模式,得先搞清楚几个关键角色:
- 抽象角色:通常由接口或抽象类定义。
- 真实角色:被代理的实际对象。
- 真实角色:被代理的实际对象。
- 代理角色:负责代理真实角色,并在前后执行附属操作。
- 客户:访问代理对象的调用方。
动态代理的分类
常见的实现方式主要有三类:
- 基于接口的动态代理:JDK 原生支持。
- 基于类的动态代理:如 CGLIB。
- 字节码实现:如 Javassist。
这里我们聚焦于 JDK 原生提供的动态代理机制,这也是 Spring AOP 默认使用的方案。
JDK 动态代理核心组件
要玩转 JDK 动态代理,主要涉及两个核心部分:
Proxy 类
这是动态代理类的超类,提供了创建代理实例的静态方法。所有的动态代理类都继承自它。
InvocationHandler 接口
这是代理实例的调用处理程序接口。当你调用代理对象的方法时,实际会触发这个接口中的 invoke 方法。
实战演示
为了更直观地理解,我们来看一个完整的 Demo 流程。
1. 定义接口与实现
首先需要一个业务接口和对应的实现类。注意命名规范,避免拼写错误。
package com.example.demo;
public interface UserService {
void add();
void delete(); // 修正了原文 delate 拼写
void update();
void query();
}
package com.example.demo;
public class UserServiceImpl implements UserService {
@Override
public {
System.out.println();
}
{
System.out.println();
}
{
System.out.println();
}
{
System.out.println();
}
}


