假設我們有以下同一類在Spring AOP CGLIB調用沒有效果
類@Service
class MyClass {
public void testA() {
testB();
}
@Transactional
public void testB() { ... }
}
現在,如果我們在測試調用myClass.testA();
,然後@Transactional
上testB
不會生效。我認爲的原因在於。
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()
。
我對上述猜測是否正確?非常感謝您的建議!