Spring AOP 面向切面编程 一句话Spring AOP 把日志、事务、权限等横切逻辑从业务代码抽出来通过动态代理在运行时织入不改动业务代码就给方法加功能。1. 为什么需要 AOP没有 AOP 每个 Service 方法都要手动写日志、权限校验、事务管理 100 个方法 100 份重复代码 有 AOP 日志、事务、权限各写一个切面类 业务方法干净只写业务逻辑2. 核心术语术语含义举例切面 Aspect增强逻辑类Aspect 标注的日志切面切入点 Pointcut哪些方法被增强execution(* com.xx.service.*.*(..))通知 Advice增强的时机和内容Before / After / Around / AfterReturning / AfterThrowing织入 Weaving把增强逻辑应用到目标Spring 在运行时通过动态代理实现连接点 JoinPoint可以被增强的点方法调用Spring AOP 只支持方法级别3. 实现原理动态代理有接口 → JDK 动态代理Proxy.newProxyInstance基于接口生成代理类 无接口 → CGLIB 代理Enhancer.create生成目标类的子类 Spring Boot 2.x 起默认 CGLIBproxyTargetClasstrueJDK 代理只能代理接口CGLIB 可以代理类通过继承生成子类不能代理 final 类。4. AOP 在 Bean 生命周期中的位置Bean 生命周期 实例化 → 属性赋值 → 初始化 → 销毁 AOP 的入口在初始化阶段之后 BeanPostProcessor#postProcessAfterInitialization → AbstractAutoProxyCreator#wrapIfNecessary → 判断当前 Bean 是否匹配某个切面 → 匹配就生成代理对象 → 代理对象替换原始 Bean 放进容器容器里最终存的是​代理对象​不是原始对象。调用方法时走代理对象代理按责任链执行各个 Advice。5. 执行顺序Around 的 proceed() 前半段 → Before → 目标方法执行 → AfterReturning正常或 AfterThrowing异常 → After无论是否异常都执行 → Around 的 proceed() 后半段面试回答模板Spring AOP 是基于动态代理实现的运行时织入。 如果目标类实现了接口用 JDK 动态代理生成接口的代理类 没有接口就用 CGLIB 生成子类Spring Boot 2.x 之后默认走 CGLIB。 AOP 在 Bean 生命周期中的入口是 BeanPostProcessor 的 postProcessAfterInitialization 具体是 AbstractAutoProxyCreator 的 wrapIfNecessary 方法 它会判断当前 Bean 是否匹配某个切面匹配就生成代理对象替换原始 Bean 放进容器。 调用方法时代理对象按责任链执行各个 Advice。 Spring AOP 只能拦截方法不能拦截字段需要更细粒度织入用 AspectJ。参考来源Day11-Spring 与 SpringBoot01_Raw【原始素材】/notion 资料/Notion/任务/Spring之AOP底层源码解析.md