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