Spring Boot AOP「面向切面编程」

spring boot

spring boot AOP「面向切面编程」

  • AspectJ是一种更强大的AOP实现,它通过编译时和加载时织入,提供了比Spring AOP更丰富的增强选项。

  • @EnableAspectJAutoProxy(exposeProxy = true) 开启AspectJ

    • exposeProxy = true 的特殊作用

      1. 暴露当前代理对象:将当前的代理对象暴露到 AopContext 中,可以通过 AopContext.currentProxy() 方法获取。

      2. 解决自调用问题:主要为了解决同一个类中方法调用时切面不生效的问题。

  • CGLIB 和 java 动态代理的对比

    • JDK 动态代理

      • 基于接口的代理机制

      • Java 原生支持 (java.lang.reflect.Proxy)

      • 运行时动态生成接口的实现类

    • CGLIB (Code Generation Library)

      • 基于继承的代理机制

      • 第三方库 (属于 ASM 字节码操作库的一部分)

      • 运行时动态生成目标类的子类

    • Spring AspectJ中的选择策略

      1. 如果目标对象实现了接口 → 使用 JDK 动态代理

      2. 如果目标对象没有接口 → 自动切换为 CGLIB

      3. 可通过配置强制使用 CGLIB:@EnableAspectJAutoProxy(proxyTargetClass = true)

  • 使用

# spring boot

## spring boot AOP「面向切面编程」

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