spring AOP 之拦截范围
?
示例代码如下:
?
?
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>
?