2008-09-02 79 views
7

我的项目基于spring framework 2.5.4。我尝试为某些控制器添加方面(我使用aspectj 1.5.3)。Aspectj没有捕获到Spring框架中的所有事件?

我已经启用自动代理在应用servlet.xml中,刚刚粘贴这些行到XML文件的末尾:

<aop:aspectj-autoproxy /> 
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" /> 

创建方面:

package com.example.bg.web.utils; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AuditLogProcessor 
{ 
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class); 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterHandleRequest() { 
     log.info("test111"); 
    } 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterRebuildThumbnail() { 
     log.info("test222"); 
    } 
}

我的控制器:

class AssetAddController implements Controller 
class AssetThumbnailRebuildController extends MultiActionController

当我在aspect advisors中设置制动点并调用控制器时,我只捕获afterHandleRequest()但不是afterRebildThumbnail() 我做错了什么?

注意

我问代表我朋友的这个问题,谁不具有左右的测试访问,我没有什么线索它的全部。

编辑

有的确有些拼写错误,谢谢Cheekysoft。但问题仍然存在。

回答

2

断点没有被击中,因为你正在使用Spring的AOP代理。有关AOP代理如何特殊的说明,请参阅understanding-aop-proxies

基本上,MVC框架将调用你的控制器的代理上的handleRequest方法(例如你用作基类的MultiActionController实现),然后这个方法会对它的rebuildThumbnail进行“内部”调用方法,但这不会通过代理,因此不会涉及任何方面。 (这与方法最终没有任何关系。)

为了实现你想要的,通过加载时织入(其中Spring支持非常好)来调查使用“真正的”AOP。

0

这就像拼写一样简单吗?或者在问题中只有错别字? 有时候你写rebuildThumbnail,有时你写rebildThumbnail

你正试图与建议覆盖的方法是不是在MVC框架的最终方法,所以虽然bpapas答案是有用的,我的理解是,这是没有问题的在这案件。但是,请确保rebuildThumbnail控制器操作不是最终的

@bpapas:请纠正我,如果我错了。程序员自己的控制器动作就是他想要重写的内容。查看MultiActionController源代码(及其父代),堆栈中唯一可能定位的方法是MultiActionController.invokeNamedMethod,尽管我不能100%确定当时是否在堆栈中。如果在堆栈中使用更高的方法会导致将AOP建议添加到方法中的问题?

1

基本设置看起来不错。

通过不定义就地切入点并指定应用后通知的方法,可以稍微简化语法。 (方法的命名切入点会自动为您创建。)

例如,

@After("com.example.bg.web.controllers.assets.AssetAddController.handleRequest()") 
public void afterHandleRequest() { 
    log.info("test111"); 
} 

@After("com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()") 
public void afterRebuildThumbnail() { 
    log.info("test222"); 
} 

只要rebuildThumbnail方法不是最终的,并且方法名称和类是正确的。我不明白为什么这不起作用。

看到http://static.springframework.org/spring/docs/2.0.x/reference/aop.html