<分区>
假设我们有下面的类
@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
是无效的。 (我说得对吗?)
我尝试为两种方法(即 testA()
和 testB()
)添加 @Transactional
。代理类应该是这样的。
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()
。
我上面的猜测是否正确?非常感谢您的建议!