java动态代理(Dynamic Proxy)

动态代理是运行时动态生成代理对象,由代理对象代替真实对象执行方法,并在调用前后增加额外逻辑。

核心:不修改目标对象,通过代理增强功能


作用

常用于:

  • 日志
  • 权限控制
  • 事务管理
  • 缓存
  • 性能监控
  • AOP

静态代理 vs 动态代理

静态代理 动态代理
代理类 提前编写 运行时生成
灵活性
代码量
适用 简单场景 框架级开发

Java动态代理类型

1.JDK动态代理

特点:

  • 基于接口
  • 使用反射实现
  • 核心:
    • Proxy
    • InvocationHandler

流程:

调用代理对象
      ↓
InvocationHandler.invoke()
      ↓
调用真实对象方法

2.CGLIB动态代理

特点:

  • 基于继承生成子类
  • 不要求接口
  • 不能代理 final 类和 final 方法

动态代理核心流程

客户端
  |
  v
代理对象 Proxy
  |
  v
InvocationHandler
  |
  v
真实对象 Target

与Spring AOP关系

Spring AOP底层主要依赖:

  • JDK动态代理(有接口)
  • CGLIB代理(无接口)

例如:

  • @Transactional
  • @Cacheable
  • @Async

本质都是通过代理增强方法。