代码之家  ›  专栏  ›  技术社区  ›  Serge

Aspectj不能捕获spring框架中的所有事件?

  •  7
  • Serge  · 技术社区  · 17 年前

    我的项目基于SpringFramework 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

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

    笔记

    我代表我的朋友问这个问题,他没有访问SO beta的权限,我不知道这是怎么回事。

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

    4 回复  |  直到 9 年前
        1
  •  2
  •   akash    7 年前

    understanding-aop-proxies 了解AOP代理的特殊性。

    handleRequest MultiActionController

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

        2
  •  1
  •   bpapa    17 年前

    AspectJ不能很好地与SpringWebMVC框架中的类一起工作。 Read the bottom of the "Open for extension..." box on the right side of the page

    相反,看看 HandlerInterceptor 界面

        3
  •  1
  •   Cheekysoft Moz Morris    17 年前

    基本设置看起来不错。

    例如

    @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" );
    }
    

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

        4
  •  0
  •   akash    7 年前

    这和拼写一样简单吗?或者只是问题中的拼写错误? 有时你会写信 rebuildThumbnail rebildThumbnail

    您试图用建议覆盖的方法不是MVC框架中的最终方法,因此虽然bpapas答案很有用,但我的理解是,在这种情况下这不是问题所在。但是,一定要确保 重建的简陋建筑 控制器操作不是最终的

    MultiActionController.invokeNamedMethod ,虽然我不能100%确定这是否会在当时的堆栈中。将最终确定的方法放在堆栈更高的位置会导致向更低的方法添加AOP建议时出现问题吗?