java动态代理(Dynamic Proxy)
动态代理是运行时动态生成代理对象,由代理对象代替真实对象执行方法,并在调用前后增加额外逻辑。
核心:不修改目标对象,通过代理增强功能。
作用
常用于:
- 日志
- 权限控制
- 事务管理
- 缓存
- 性能监控
- AOP
静态代理 vs 动态代理
| 静态代理 | 动态代理 | |
|---|---|---|
| 代理类 | 提前编写 | 运行时生成 |
| 灵活性 | 低 | 高 |
| 代码量 | 多 | 少 |
| 适用 | 简单场景 | 框架级开发 |
Java动态代理类型
1.JDK动态代理
特点:
- 基于接口
- 使用反射实现
- 核心:
ProxyInvocationHandler
流程:
调用代理对象
↓
InvocationHandler.invoke()
↓
调用真实对象方法
2.CGLIB动态代理
特点:
- 基于继承生成子类
- 不要求接口
- 不能代理 final 类和 final 方法
动态代理核心流程
客户端
|
v
代理对象 Proxy
|
v
InvocationHandler
|
v
真实对象 Target
与Spring AOP关系
Spring AOP底层主要依赖:
- JDK动态代理(有接口)
- CGLIB代理(无接口)
例如:
@Transactional@Cacheable@Async
本质都是通过代理增强方法。