@Component
public class TestBean {
public void a() {
this.b();
}
@Transactional
public void b() {
System.out.println("methodB executing...");
}
}
a方法中调用b方法,b方法的事务是否生效!
不生效
原因是spring会为TestBean生成一个“代理对象“,TestBeanProxy,只用调用TestBeanProxy b(),切面才会生效
而a() 使用this.b()调用,就是使用了“代理目标对象“ TestBean的实例去调用的,不会生效。
如果才能生效呢
@Component
public class TestBean {
public void a() {
getProxy().b();
}
@Transactional
public void b() {
System.out.println("methodB executing...");
}
private TestBean getProxy(){
//注意 AopContext是存在ThreadLoacl中,线程切换上下文会丢失
TestBean testBean = (TestBean) AopContext.currentProxy();
}
}