spring Aop 事务控制

做开发几年了,一直也没搞清楚spring的事务传播性怎么回事,用的不太到位,经常出问题,最近在架构师课程上又学习到了这个地方,正好我们现在做的项目也用到了.

publicclassServiceA{

privateServiceBb;

voida(){

b.b3();

}

}

publicclassServiceB{

voidb1();

voidb2();

voidb3(){

b1();

b2();

}

}

假如传播性是REQUIRED_NEW,ServiceA,ServiceB的里面的方法都符合spring的切点规则,那么在调用a()的时候spring容器会创建几个事务?答案是2个.在调用a()的时候一个,b.b3()此时又一个,虽然b1(),b2()也符合切点规则但spring不会为他们2个启动新的事务.原因我们要从AOP的实现原理上来分析.

我们说AOP是在IOC的基础上出来的,没有IOC其实就没有AOP.spring是利用代理来完成事务控制的.

//这里假设是cglib代理

publicclassServiceAProxyextendsServiceA{

privateServiceAsvcA;

voida(){

begintransaction

svcA.a();

endtransaction

}

}

publicclassServiceBProxyextendsServiceB{

privateServiceBsvcB;

voidb1(){

begintransaction

svcB.b1();

endtransaction

}

voidb2(){

begintransaction

svcB.b2();

endtransaction

}

voidb3(){

begintransaction

svcB.b3();

endtransaction

}

}

这样在调用a.a()时只调用了A的代理方法a()和b的代理方法b3(),所以只开启了2个事务.

相关推荐