开头一段不堪回首的“CV 往事”各位码农道友不知你是否经历过这样的绝望项目里有 20 个 Service 类每个类有 10 个方法老板一拍大腿“每个方法执行前打印开始时间执行后打印结束时间”于是你开启了疯狂 CV复制粘贴模式代码冗余到像“牛皮癣”改个日志格式要改 40 个地方简直是“代码界的搬砖工”直到遇见AOP面向切面编程才终于从“重复代码地狱”中解脱——今天咱们就来聊聊 AOP 的底层逻辑一、什么是 AOP用“快递驿站”给你讲明白AOPAspect Oriented Programming直译是“面向切面编程”通俗说就是把重复代码抽出来用“动态代理”技术在不修改源代码的情况下增强程序举个生活化的例子你是个“剁手党”每天要收 10 个快递。以前你每个快递都要自己下楼取重复代码后来你把“取快递”这件事交给“快递驿站”AOP驿站帮你取件、发短信增强逻辑你只需要在家拆快递专注业务逻辑就行在代码里重复代码打印日志、开启事务、权限校验快递驿站AOP 容器你业务代码只需要关注 addUser、deleteUser。二、AOP 的底层魔法代理模式的“三重境界”AOP 的核心是“动态代理”而代理模式分为三个阶段咱们用“周杰伦和经纪人”的故事来讲1. 静态代理“宋吉吉”的局限角色定义抽象角色Star定义“唱歌”方法的接口真实角色RealStar周杰伦本人负责唱歌代理角色ProxyStar宋吉吉负责安排行程、收钱客户类Client邀请周杰伦演出的主办方。代码示例静态代理的问题① 真实角色如果有 10 个方法唱歌、跳舞、拍电影代理角色也要重复写 10 次“安排行程”的代码② 代理角色只能代理Star接口的子类如果周杰伦想接广告新接口得重新写代理类——太麻烦2. JDK 动态代理“自动生成经纪人”JDK 动态代理不需要手动写代理类而是通过 Java 反射机制动态生成代理对象解决了静态代理的冗余问题。代码示例JDK 动态代理的优势不管真实角色有多少方法代理逻辑只写一次可以代理任意接口的实现类——“一个经纪人代理所有明星”3. CGLIB 动态代理“没有接口也能代理”JDK 动态代理要求真实角色必须实现接口如果某个类没有接口呢这时候就需要CGLIB 动态代理了CGLIB 通过继承真实角色生成代理对象子类继承父类所以不需要接口。JDK 和 CGLIB 的区别代理方式要求实现原理JDK 动态代理真实角色必须实现接口接口实现CGLIB 动态代理真实角色不需要接口子类继承结尾预告今天咱们搞懂了“为什么学 AOP”和“代理模式的三重境界”下一篇咱们将进入AOP 实战环节什么是切点、通知、切面怎么用 XML 配置 AOP怎么用注解“一键开启”AOP点赞收藏不迷路下一篇咱们继续“通关”