首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringAOP,加载时间编织器,奇怪的行为

SpringAOP,加载时间编织器,奇怪的行为
EN

Stack Overflow用户
提问于 2013-01-22 06:10:29
回答 2查看 1K关注 0票数 0

此时此刻,我正面临着一个问题,我真的不知道我做错了什么。我正在使用Spring框架和@AspectJ风格的AOP为我的and服务编写日志。我有两个包--背景和前端。在后台包中我有LogAspect,它看起来像这样:

代码语言:javascript
复制
@Aspect
public class LogAspect {
    @Pointcut("@annotation(logMethod)")
    public void logMethodAnnotated(LogMethod logMethod){}

    @Before("logMethodAnnotated(logMethod)")
    public void beforeLogMethodAnnotated(JoinPoint jp){
        //actions
    }

    @After("logMethodAnnotated(logMethod)")
    public void afterLogMethodAnnotated(JoinPoint jp){
        //actions   
    }
}

和META-INF/spring/background-osgi.xml:

代码语言:javascript
复制
<context:annotation-config />
<context:component-scan base-package="simon.background"/>

<context:load-time-weaver />   

还有META-INF/aop.xml:

代码语言:javascript
复制
<!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>

    <weaver>

        <!-- only weave classes in our application-specific packages -->
        <include within="simon.background.*"/>
        <include within="simon.frontend.controller.*"/>

    </weaver>

    <aspects>

        <!-- weave in just this aspect -->        
        <aspect name="simon.background.log.LogAspect"/>

    </aspects>

  </aspectj>

在我刚刚放入aplicationContext.xml <context:load-time-weaver aspectj-weaving="on" />的前端捆绑包中。但是代码表现得非常奇怪。当我将JoinPoint作为参数放入我的建议方法中时,我发现有一些问题。(我的意思是,当我得到没有参数的通知方法,所以方法头中没有JoinPoin时,一切都运行得很好,建议在@LogMethod (我的注释,我用来说明我想记录这个方法)注释方法之前和之后运行)。但现在它是这样工作的:-当我启动服务器并第一次部署包时,建议只为方法运行,它们是@LogMethod注释的,属于后台包,而不是frontend.controller中带注释的方法。-此外,当我在我的一个控制器中做了一些更改,保存了它并仅部署了前端包,然后当我运行@LogMethod注释方法时,我得到了这个错误:

org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常为日志:违反加载器约束:解析方法时,当前类的控制器(当前类的com/springsource/kernel/userregion/internal/equinox/KernelBundleClassLoader)实例,simon/前端/ "simon.background.log.LogAspect.afterLogMethodAnnotated(Lorg/aspectj/lang/JoinPoint;)V“/HuhController和类加载器(解析类的com/springsource/kernel/userregion/internal/equinox/KernelBundleClassLoader)实例,simon/java.lang.LinkageError/java.lang.LinkageError/LogAspect,对于类型/aspectj/lang/JoinPoint有不同的类对象;)签名中使用的V

有什么想法吗?我该如何修复它,这样我的程序才能正确地运行建议?

另外要注意的是,它可能会有所帮助:当我在调试模式下使用没有JoinPoint参数的建议运行此程序时,我意识到两个建议都为一个方法运行了两次。

EN

回答 2

Stack Overflow用户

发布于 2013-02-22 07:13:03

在运行两次时,会不会是因为您同时使用了这两个工具?Difference between vs

票数 0
EN

Stack Overflow用户

发布于 2019-07-19 11:30:40

您的切入点已经被触发了两次,因为您的表达式仅约束了注释类型。当一个方法被调用时,call()execution()都匹配这个表达式。

您可以在点切割上使用@annotation(xxx) && execution(* *(..))来限制仅在执行时的条件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14448151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档