【发布时间】:2017-03-21 08:07:17
【问题描述】:
假设我们有以下类
@Service
class MyClass {
public void testA() {
testB();
}
@Transactional
public void testB() { ... }
}
现在,如果我们在测试中调用myClass.testA();,那么testB 上的@Transactional 将不会生效。我认为原因如下。
Cglib 将为MyClass 创建一个代理 bean,如下所示:
Class Cglib$MyClass extends MyClass {
@Override
public void testB() {
// ...do transactional things
super.testB();
}
}
现在我们调用myClass.testA(),它将调用MyClass.testB() 而不是Cglib$MyClass.testB()。所以@Transactional 无效。 (我说的对吗?)
我尝试为这两种方法添加@Transactional(即testA() 和testB())。代理类应该是这样的。
Class Cglib$MyClass extends MyClass {
@Override
public void testA() {
// ...do transactional things
super.testA();
}
@Override
public void testB() {
// ...do transactional things
super.testB();
}
}
在这种情况下,虽然我们成功调用了Cglib$MyClass.testA(),但它仍然会转到MyClass.testB()。
所以我的结论是,同一个类中的两个方法互相调用会导致aop注解失效,除非我们使用AopContext.currentProxy()。
我猜对了吗?非常感谢您的建议!
【问题讨论】: