【问题标题】:Aspectj doesn't catch all events in spring framework?Aspectj 没有捕捉到 spring 框架中的所有事件?
【发布时间】:2008-09-02 14:19:23
【问题描述】:

我的项目基于spring framework 2.5.4。我尝试为一些控制器添加方面(我使用 aspectj 1.5.3)。

我在 application-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

当我在方面顾问中设置刹车点并调用控制器时,我只捕获 afterHandleRequest() 而不是 afterRebildThumbnail() 我做错了什么?

注意

我代表无法访问 SO 测试版的朋友提出这个问题,但我不知道这是怎么回事。

编辑

确实有一些拼写错误,感谢 Cheekysoft。但问题依然存在。

【问题讨论】:

    标签: java spring spring-aop


    【解决方案1】:

    您的断点没有被命中,因为您使用的是 Spring 的 AOP 代理。请参阅understanding-aop-proxies 了解 AOP 代理的特殊之处。

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

    要实现您想要的,请通过加载时间编织(Spring 非常支持)来研究使用“真正的”AOP。

    【讨论】:

      【解决方案2】:

      AspectJ 不适用于 Spring Web MVC 框架中的类。 Read the bottom of the "Open for extension..." box on the right side of the page

      相反,请查看HandlerInterceptor 接口。

      新的 Spring MVC Annotations 可能从那时起也可以工作,Controller 类都是 POJO,但我自己没有尝试过。

      【讨论】:

        【解决方案3】:

        基本设置看起来不错。

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

        例如

        @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方法不是final,方法名和类都正确。我不明白为什么这不起作用。

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

        【讨论】:

          【解决方案4】:

          这和拼写一样简单吗?还是问题中只有拼写错误? 有时你写rebuildThumbnail,有时你写rebildThumbnail

          您尝试用建议覆盖的方法不是 MVC 框架中的最终方法,因此虽然 bppas 答案很有用,但我的理解是在这种情况下这不是问题。但是,请确保 rebuildThumbnail 控制器操作不是最终的

          @bpapas:如果我错了,请纠正我。程序员自己的控制器动作是他试图覆盖的。查看 MultiActionController 源(及其父级),堆栈中唯一可能最终确定的方法是 MultiActionController.invokeNamedMethod,尽管我不能 100% 确定当时它是否会在堆栈中。将一个最终确定的方法放在堆栈的更高位置会导致向更下方的方法添加 AOP 建议的问题吗?

          【讨论】:

            猜你喜欢
            • 2012-10-07
            • 2014-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多