@Transactional实际是通过Spring AOP来实现事务的管理的!
Spring AOP,大家都知道,就是切面,通过切面,来丰富我们的方法,但有时候我们会发现我们的切面失效了,不起作用,这是为什么呢?
现在单讲其中的一种情况,一个类有A,B两个方法,其中B是加了切面的,当在方法A中,直接调用B方法,是不会触发B方法的切面的。
原因:
正常情况下,我们调用一个类含切面的方法,实际我们是从Spring Bean容器中获取这个类的代理对象,这个代理对象里就包含了这个切面的信息。但是如果我们是同一个类里面,向上图那样的调用,就跳过了从spring容器中获取代理对象的过程,直接调用的是当前实例对象的方法,就自然没有增强的切面信息,即这个切面失效了。
如何解决切面失效问题:
1、将这个具有切面的方法,放到另一个类里面。这样就能触发从Spring Bean获取代理类的操作。
2、获取本对象的代理对象,再进行调用。具体操作如:
好啦,这就是用一个类中调用切面方法失效的原因,和解决办法啦。看完记得点个赞噢!