繁体   English   中英

Aspectj:在aop.xml(LTW)中声明时,切入点不再起作用

[英]Aspectj: Pointcut no longer works when declared in aop.xml ( LTW)

我试图将我的方面定义为一个具体方面,以便能够在aop.xml中定义切入点而无需编译代码。 我正在使用LTW。

当我在方面类本身中定义poincut exp并将方面定义为简单方面()时,它可以正常工作。 但是,当我将方面声明为具体方面并在aop.xml中定义切入点时。 该方面不再起作用...并且不再达到我的建议内的断点...

这是带有/不带有具体方面的代码:

没有具体的方面(作品精细):

public abstract aspect AbstractAspect {
    protected abstract pointcut publicMethod();
}

public aspect MethodExecutionTimeAspect extends AbstractAspect {
    public pointcut publicMethod() : execution(public * com.proj.package..*());
    Object around() : publicMethod() {
        .....
        Object ret = proceed();
        ....
   }
}

和aop.xml

<aspectj>
    <aspects>
    <aspect  name="com.proj.packae.aspectj.MethodExecutionTimeAspect"/> 
    </aspects>
    <weaver options="-verbose">
    </weaver>
</aspectj>

具有具体方面(不起作用)

public abstract aspect AbstractAspect {
    protected abstract pointcut publicMethod();
}

public aspect MethodExecutionTimeAspect extends AbstractAspect {
    public pointcut publicMethod() : execution(public * com.proj.package..*());
    Object around() : publicMethod() {
        .....
        Object ret = proceed();
        ....
   }
} 

aop.xml文件

  <aspectj>
<aspects>

     <concrete-aspect name="com.proj.package.MethodExecutionTimeAspect" extends="com.project.package.aspectj.AbstractAspect">
        <pointcut name="publicMethod" expression="execution(public * com.proj.package..*())" />
    </concrete-aspect>

</aspects>

<weaver options="-verbose">

</weaver>

我正在使用Aspectj 1.6罐子。

当我不使用concret方面时,以下日志

[WebappClassLoader@7f62cbb2] info register aspect com.project.package.aspectj.MethodExecutionTimeAspect

当我使用具体方面时,我看到以下日志:

[WebappClassLoader@393e11ac] info define aspect com.project.package.aspectj.MethodExecutionTimeAspect

日志上未显示任何错误,只是看起来具体方面尚未注册。

请指教。

您犯了几个错误:

  • 使用<concrete-aspect> ,具体的切入点应该只在aop.xml中 ,而不是在代码中。 可能是复制和粘贴错误,但在您的示例中,看起来好像两次定义了具体的切入点:在代码和XML中。
  • 具体化抽象方面时,抽象方面必须已经包含要映射到具体切入点的建议。 不能通过XML或代码和XML的组合覆盖它。

看我自己的例子,与您的例子非常相似:

样例应用程序:

package de.scrum_master.app;

public class Application {
    public static void main(String[] args) {
        Application app = new Application();
        app.say("Hello world!");
        app.add(11, 22);
    }

    private int add(int i, int j) { return i + j; }
    public void say(String message) { System.out.println(message); }
}

如您所见,有两个公共方法(一个静态,一个非静态)和一个私有方法。 我这样做是为了测试以后的具体切入点是否真的只抓住了公众的切入点。

摘要方面:

package de.scrum_master.aspectj;

public abstract aspect AbstractAspect {
    protected abstract pointcut publicMethod();

    Object around() : publicMethod() {
        System.out.println(thisJoinPointStaticPart);
        return proceed();
    }
}

aop.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
    <aspects>
        <concrete-aspect
            name="de.scrum_master.aspectj.ConcreteAspect"
            extends="de.scrum_master.aspectj.AbstractAspect"
        >
            <pointcut
                name="publicMethod"
                expression="execution(public * de.scrum_master..*(..))"
            />
        </concrete-aspect>
    </aspects>
</aspectj>

使用LTW时的应用程序输出:

execution(void de.scrum_master.app.Application.main(String[]))
execution(void de.scrum_master.app.Application.say(String))
Hello world!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM