`
wls981
  • 浏览: 135935 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

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>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics