静态代理 动态代理:实战运用 + 场景区别 + 怎么选
我不讲空话直接讲什么时候用、怎么用、为什么用、项目里怎么写让你彻底懂运用。一、先一句话分清静态 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限流、监控、分布式锁微服务网关、RPC3.JDK 动态代理运用目标类有接口性能更好Spring 首选4.CGLIB 动态代理运用目标类没有接口Spring 会自动用它七、最强总结面试 工作 直接背静态代理手写代理一对一简单但无法通用只用于学习动态代理运行时自动生成一对多通用增强所有类Spring AOP、事务、缓存、权限全靠它项目真正运用的技术一句话终极运用口诀简单固定用静态通用增强用动态有接口用 JDK无接口用 CGLIB日志事务缓存权全靠动态代理实现