示例代码如下:
package com.test.common; public interface BaseService { public void methodA(); } package com.test.user.service; public interface UserService extends BaseService { public void methodB(); } package com.test.user.service.impl; public class UserServiceImpl implements UserService { public void methodA(){ //do something... } public void methodB(){ //do something... } }
Spring 事务配置如下:
<aop:config>
<aop:pointcut id="servicePointcut" expression="execution(* com.test.user.service..*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
</aop:config>
经过以上配置后,以为速个UserServiceImpl都在spring的事务管理范围内了,但当去调用UserServiceImpl.methodA方法时,发现methodA方法根本没有事务(断点后发现根本没有Spring的TransactionIntercepor的相关拦截)。造成这个问题的原因是因为spring默认情况下代理使用的时候JDK动态代理(必须要实现接口),这时候是代码接口上的方法而不是具体实现类上的方法,我的切入点声明的时候声明了只拦截 com.test.user.service包下所有类的所有方法,而methodA的方法是在另一个包下的,所以methodA的调用无法拦截到,解决办法就是把com.test.common包下的接口也声明到事务拦截范围内。
<aop:config>
<aop:pointcut id="servicePointcutC" expression="execution(* com.test.common..*(..))"/>
<aop:pointcut id="servicePointcut" expression="execution(* com.test.user.service..*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcutC"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
</aop:config>