gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:16:49 25 4
gpt4 key购买 nike

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

当我在方面类本身中定义切入点 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 jar。

当我不使用concret-aspects时,这是以下日志

[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); }
}

如您所见,有两种公共(public)方法(一种静态,一种非静态)和一种私有(private)方法。我这样做是为了测试稍后的具体切入点是否真的只捕获公共(public)切入点。

抽象方面:

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!

关于java - Aspectj:在 aop.xml 中声明时切入点不再起作用(LTW),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18164032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com