spring boot

spring boot AOP「面向切面编程」

  • AspectJ是一种更强大的AOP实现,它通过编译时和加载时织入,提供了比Spring AOP更丰富的增强选项。
  • @EnableAspectJAutoProxy(exposeProxy = true) 开启AspectJ
    • exposeProxy = true 的特殊作用
      1. 暴露当前代理对象:将当前的代理对象暴露到 AopContext 中,可以通过 AopContext.currentProxy() 方法获取。
      2. 解决自调用问题:主要为了解决同一个类中方法调用时切面不生效的问题。
      @Service
      public class MyService {
          public void methodA() {
              ((MyService) AopContext.currentProxy()).methodB();
          }
          
          public void methodB() {
              // 现在methodB的切面会正常触发
          }
      }
      
  • CGLIB 和 java 动态代理的对比
    • JDK 动态代理
      • 基于接口的代理机制
      • Java 原生支持 (java.lang.reflect.Proxy)
      • 运行时动态生成接口的实现类
    • CGLIB (Code Generation Library)
      • 基于继承的代理机制
      • 第三方库 (属于 ASM 字节码操作库的一部分)
      • 运行时动态生成目标类的子类
    • Spring AspectJ中的选择策略
      1. 如果目标对象实现了接口 → 使用 JDK 动态代理
      2. 如果目标对象没有接口 → 自动切换为 CGLIB
      3. 可通过配置强制使用 CGLIB:@EnableAspectJAutoProxy(proxyTargetClass = true)
  • 使用