一,问题描述
其中AOP切面是环绕通知,
但是调用A方法时,代码会先执行B方法,再执行AOP切面
class AB {
public void A() {
B();
}
@AOP
public void B() { //业务逻辑
}
}
二,原因解释
AOP 的工作原理
在 Spring AOP 中,切面(如环绕通知)是通过动态代理实现的。Spring 会为被代理的对象创建一个代理对象,所有的外部调用都会经过这个代理对象,从而触发切面逻辑。然而,同一个类内部的方法调用不会经过代理对象。
当 A 方法调用 B 方法时,这是类内部的直接调用,不会经过 Spring 的代理对象,因此 AOP 切面逻辑不会生效。
三,解决方案
方法1:通过代理对象调用 B 方法
@Component
public class AB {
@Autowired
private AB self; // 注入自身代理对象
public void A() {
self.B(); // 通过代理对象调用 B 方法
}
@AOP
public void B() {
// 业务逻辑
}
}
或者
@Component
public class AB {
@Autowired
private ApplicationContext;
public void A() {
this.applicationContext.getBean(AB.class).B(); // 通过代理对象调用 B 方法
}
@AOP
public void B() {
// 业务逻辑
}
}
方法2:将 B 方法抽取到另一个类中
// 类 AB
@Component
public class AB {
@Autowired
private BC bc;
public void A() {
bc.B(); // 调用 BC 类中的 B 方法
}
}
// 类 BC
@Component
public class BC {
@AOP
public void B() {
// 业务逻辑
}
}
1468

被折叠的 条评论
为什么被折叠?



