Suppose we have following class
@Service
class MyClass {
public void testA() {
testB();
}
@Transactional
public void testB() { ... }
}
Now, if we invoke myClass.testA();
in test, then @Transactional
on testB
will not take effect. The reason I think is following.
Cglib will create a proxy bean for MyClass
, like this:
Class Cglib$MyClass extends MyClass {
@Override
public void testB() {
// ...do transactional things
super.testB();
}
}
Now we invoke myClass.testA()
, which will invoke MyClass.testB()
instead of Cglib$MyClass.testB()
. So @Transactional
is not effective. (Am I right?)
I tried to add @Transactional
for both methods (i.e. testA()
and testB()
). The proxy class should like this.
Class Cglib$MyClass extends MyClass {
@Override
public void testA() {
// ...do transactional things
super.testA();
}
@Override
public void testB() {
// ...do transactional things
super.testB();
}
}
In this case, although we successfully invoke Cglib$MyClass.testA()
, it will still goes to MyClass.testB()
.
So my conclusion is, two methods in same class invoking each other will make aop annotation fail to take effect, unless we use AopContext.currentProxy()
.
Am I right on above guess? Thanks very much for advice!