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