当前位置: 首页 > news >正文

静态代理 动态代理:实战运用 + 场景区别 + 怎么选

我不讲空话,直接讲什么时候用、怎么用、为什么用、项目里怎么写,让你彻底懂运用


一、先一句话分清:静态 vs 动态

静态代理:手写代理类 → 一个目标类配一个代理

动态代理:自动生成代理 → 一个通用代理,增强所有类


二、静态代理(运用场景 + 实战代码)

1.运用场景(什么时候用?)

  • 类很少、固定不变
  • 简单增强、不需要通用
  • 只想理解代理原理
  • 项目几乎不用,因为类会爆炸

2.实战运用:给业务方法加日志

① 接口

public interface UserService { void addUser(); }

② 目标类(真正业务)

public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("执行添加用户业务"); } }

③ 静态代理类(手动编写

public class UserServiceProxy implements UserService { private UserService target; public UserServiceProxy(UserService target) { this.target = target; } @Override public void addUser() { System.out.println("【日志】方法开始"); // 增强 target.addUser(); // 调用目标 System.out.println("【日志】方法结束"); // 增强 } }

④ 使用

public class Test { public static void main(String[] args) { UserService service = new UserServiceImpl(); UserService proxy = new UserServiceProxy(service); // 静态代理 proxy.addUser(); } }

3.静态代理的优点

  • 简单、直观、好理解
  • 不依赖反射

4.静态代理缺点(致命)

  • 一个类就要写一个代理类
  • 100 个业务类 → 100 个代理类 →类爆炸
  • 无法通用、无法统一增强

三、动态代理(项目 99% 都用它

1.运用场景(核心!背下来)

  • 统一日志
  • 统一权限校验
  • 事务管理(@Transactional)
  • 缓存增强(@Cacheable)
  • 异步执行(@Async)
  • 限流、熔断、监控
  • AOP 面向切面编程
  • RPC 远程调用

一句话:需要给很多方法统一加功能,又不想改源码 → 必须动态代理!


四、JDK 动态代理(必须有接口)实战运用

核心:一个工具类,增强所有接口实现类

public class JdkProxyFactory { public static Object getProxy(Object target) { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), (proxy, method, args) -> { // 前置增强 System.out.println("日志开始:" + method.getName()); // 执行目标方法 Object result = method.invoke(target, args); // 后置增强 System.out.println("日志结束"); return result; }); } }

使用:

UserService service = new UserServiceImpl(); UserService proxy = (UserService) JdkProxyFactory.getProxy(service); proxy.addUser();

优点:

  • 通用!所有接口都能用
  • 不写大量代理类
  • Spring AOP 底层就是它

五、CGLIB 动态代理(没有接口也能代理

运用场景:

  • 类没有实现接口
  • 要代理普通类
  • Spring 默认无接口时用它

核心代码:

public class CglibProxyFactory { public static Object getProxy(Class<?> clazz) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> { System.out.println("cglib 日志开始"); Object result = proxy.invokeSuper(obj, args); System.out.println("cglib 日志结束"); return result; }); return enhancer.create(); } }

六、最关键:静态 / 动态代理到底怎么运用?(项目实战指南)

1.静态代理运用场景

  • 教学、理解原理
  • 极简单、固定不变的小功能
  • 企业项目基本不用

2.动态代理运用场景(必须掌握)

  • 统一日志
  • 统一权限
  • 事务
  • 缓存
  • AOP
  • 限流、监控、分布式锁
  • 微服务网关、RPC

3.JDK 动态代理运用

  • 目标类有接口
  • 性能更好
  • Spring 首选

4.CGLIB 动态代理运用

  • 目标类没有接口
  • Spring 会自动用它

七、最强总结(面试 + 工作 直接背)

静态代理

  • 手写代理
  • 一对一
  • 简单但无法通用
  • 只用于学习

动态代理

  • 运行时自动生成
  • 一对多
  • 通用增强所有类
  • Spring AOP、事务、缓存、权限全靠它
  • 项目真正运用的技术

一句话终极运用口诀

简单固定用静态,通用增强用动态;有接口用 JDK,无接口用 CGLIB;日志事务缓存权,全靠动态代理实现

http://www.jsqmd.com/news/992358/

相关文章:

  • 全行业数字员工落地:2026企业级AI Agent非侵入式架构与微调方法论全解析
  • 期货多品种轮动标的池:天勤 query_quotes 筛品种写法
  • 深入解析P89LPC93x系列MCU的ADC模块:从原理到实战应用
  • 3个秘诀:用ZenTimings专业监控AMD内存性能的完整指南
  • 网盘直链下载助手:告别限速困扰,解锁九大网盘真实下载链接的实用技巧
  • 用Python和SymPy手把手推导汽车二自由度模型:从受力分析到微分方程求解
  • [写代码]vscode中接入codex 1.可以添加代码上下文 2.可以浏览代码 3.fork查看代码修改
  • 中国象棋AI助手Vin象棋:让你的棋艺快速提升的免费智能伙伴
  • Java Lambda + 空指针四种主流处理方案
  • 2026年对辊破碎机厂家实力推荐:徐州市恒力破碎机制造有限公司技术领先与服务保障 - 品牌推荐官
  • 2026年深度除氟剂生产厂家实力推荐:巩义永源技术领先与市场口碑双优之选 - 品牌推荐官
  • _Rust 无GC内存模型深度拆解:手写自定义Arena内存池
  • Android Studio中文界面终极配置指南:3步告别英文困扰
  • Yakit实战入门:从零构建你的第一个安全测试工作流
  • MTKClient终极指南:3步教你拯救变砖的联发科设备
  • PCA9575 I/O扩展芯片实战指南:电平转换、中断与混合电压系统设计
  • Sub-1 GHz射频接收器OL2311寄存器配置实战:从原理到调试
  • 如何用5分钟实现专业级图像分层:Layerdivider智能PSD生成终极指南
  • MPC8572E PowerQUICC III处理器硬件设计实战指南
  • Armadillo 3.4.0 C++线性代数库源码包,带Matlab式语法、跨平台构建脚本与完整示例
  • 2026年湖南职称申报服务推荐:湖南筑励咨询职称论文发表与学历提升全流程支持 - 品牌推荐官
  • PCA9553智能LED驱动芯片:I2C总线上的硬件PWM与GPIO扩展实战
  • 用Python和SymPy搞定汽车二自由度模型:从理论方程到代码仿真(保姆级教程)
  • 从文字到CAD的魔法:零基础5分钟变身机械设计师
  • 如何完整备份QQ空间历史记录:GetQzonehistory开源工具终极指南
  • Anthropic发布Claude Fable 5和Mythos 5:分层发售,能力与价格匹配几何?
  • 我用Claude Code写了2万行核心代码,然后亲手把它们全部删掉了
  • 医药企业花千万建系统,却卡在了这件最基础的事上
  • ViT架构解析:从Transformer到视觉识别的跨界革命
  • MPC8314E高速接口电气特性解析与硬件设计实战