问题:
Spring中类中有多个方法,注解方法在相互调用时,注解功能失效。
原因:
原类A
public class A {
@Transactional
public void a() {
...
}
public void b() {
...
}
}
代理(CGlib)之后
public class Proxy$A extend A{
A a = new A();
//spring扫描注解后,为注解的方法插入一个startTransaction()方法。
public void a () {
startTransaction();
a.a();
commitTransactionAfterReturning();
}
public void b() {
...
}
}
类A被代理后,会在代理对象ProxyA中声明一个新的对象A,并将A中a对应的方法重新封装。当调用原A的方法时,流程就会变成 proxyA.a() -> a.a()
解决方法:
- 第一种:将b()方法抽出来,重新声明一个类,并且该类交由spring管理控制。
- 第二种:同时在b()上添加@Transactional注解或者在类上添加。
- 第三种:在原A类中的a()方法,改为 ((A)AopContext.currentProxy).b()