Spring aop拦截来自同一服务类的调用

时间:2011-09-07 18:30:59

标签: java spring java-ee aop spring-aop

我有与

中提到的相同的情景

Spring @Transaction method call by the method within the same class, does not work?

我指的是答案#1,我认为这对我的简单pojo课有效,但它没有。在我的情况下,我没有注释@Transaction。它是一个简单的pojo类。如果我在上面的帖子中举例,我希望拦截每个方法adduser以及使用spring aop的addusers。

是否可以拦截从同一服务调用中调用的方法?我指的是AspectJAwareProxy,它可以解决问题,但并不能解决整个问题。我的意思是我不希望任何东西被添加到我的业务逻辑中。所以我想避免任何编码,除了定义切入点和定义建议。是否有可能使用Java和spring aop?我正在使用CGlib来生成代理。 Spring版本是3.0.5。发布。

谢谢, 阿贾伊

1 个答案:

答案 0 :(得分:1)

为此,您必须使用加载时编织而不是代理。原因是因为spring使用代理来实现AOP功能(例如事务支持)。一旦进入类实例,对同一实例中的方法的任何方法调用将直接针对实际的实例对象,而不是包装代理,因此不会考虑AOP建议。加载时编织的工作方式不同。在那里,你有一个外部java代理,它在字节码级别上操作类来注入AOP支持。

你需要

1:修改用于包含spring aspectj代理的java命令行

2:添加

<context:load-time-weaver aspectj-weaving="on" />
<tx:annotation-driven mode="aspectj" />

到你的春天cofig。

了解更多:

AspectJ Load Time Weaving with Spring Transaction Manager and Maven

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-aj-ltw