在aspectJ中是否必须实现具体方面

Is it mandatory to implement concrete aspect in aspectJ

我正在 运行使用 aspectJ 中的加载时间织入 (LTW) 构建一个 HelloWorld 项目。我只定义了抽象方面。我没有定义具体方面,但在 aop.xml 中提到 <concrete-aspect>"name" 属性为 main.java.aop.helloworld.MyHelloWorldAspect,如下所示:

<concrete-aspect name="main.java.aop.helloworld.MyHelloWorldAspect"
        extends="main.java.aop.helloworld.HelloWorldAspect">
        <pointcut name="helloWorld"
            expression="execution(public static void HelloWorld.say*(..))" />
    </concrete-aspect>

我可以 运行 应用程序正常运行并获得所需的结果。但是,打印下面的行来定义具体方面。

[URLClassLoader@ddc3fe] info define aspect main.java.aop.helloworld.MyHelloWorldAspect

我想知道具体 class 实现是否是强制性的,因为它打印一条 INFO 消息来定义具体方面。此外,根据以下信息消息,编织和应用方面和建议工作正常。

[URLClassLoader@ddc3fe] weaveinfo Join point 'method-execution(void main.java.aop.helloworld.HelloWorld.say(java.lang.String))' in Type 'main.java.aop.helloworld.HelloWorld' (HelloWorld.java:5) advised by before advice from 'main.java.aop.helloworld.MyHelloWorldAspect' (HelloWorldAspect.java)

谁能解释具体的 class 实施是否是强制性的。如果不需要,那么请帮助我理解它是如何工作的。谢谢。

如果您不提供具体方面,那么抽象方面的建议将不适用。编译这个:

class C {}
abstract aspect X { before():staticinitialization(C) {}}

并且 X 中的建议不适用于 C。删除 abstract 或提供 X 的具体子方面,它将适用。但是,这仅适用于建议 - 抽象方面的任何静态横切 都将 适用,例如方法或字段间类型声明。

对于具体方面,您有两个选择 - 代码或 XML,并且您将走 XML 路线,这很好。我认为您显示的第一条(措辞不当的)信息消息告诉您系统正在根据您的规范定义具体方面,而不是您需要。