繁体   English   中英

是否可以在 aop.xml 上包含要通过其注释编织的类?

[英]Is it possible to include classes to be weaved by their annotations on aop.xml?

我正在开发一些方面,这些方面有望在加载时使用@AnAnnotation 编织类。 我创建了 aop.xml 如下

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "https://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>

    <weaver options="-verbose -showWeaveInfo">
        <include within="@com.example.MyAnnotation *" />
    </weaver>

    <aspects>
        <aspect name="com.example.MyAspect" />
    </aspects>

</aspectj>

根据日志,我的方面似乎尝试建议适当的课程,但之后发生了以下异常。

java.lang.NoSuchMethodError: com.example.MyAspect.aspectOf

有任何想法吗?

:日志

[ERROR] [AppClassLoader@2b193f2d] info AspectJ Weaver Version 1.9.7 built on Thursday Jun 24, 2021 at 16:14:45 PDT
[ERROR] [AppClassLoader@2b193f2d] info register classloader jdk.internal.loader.ClassLoaders$AppClassLoader@2b193f2d
[ERROR] [AppClassLoader@2b193f2d] info using configuration project/target/classes/META-INF/aop.xml
[ERROR] [AppClassLoader@2b193f2d] info register aspect com.example.MyAspect
[ERROR] [AppClassLoader@2b193f2d] weaveinfo Join point 'constructor-execution(void com.example.MyAspectTest$MyTargetClass.<init>(com.example.MyAspectTest, java.lang.String))' in Type 'com.example.MyAspectTest$MyTargetClass' (MyAspectTest.java:165) advised by afterReturning advice from 'com.example.MyAspect' (MyAspect.java) [with runtime test]
[ERROR] [AppClassLoader@2b193f2d] weaveinfo Join point 'method-execution(void com.example.MyAspectTest$MyTargetClass.myMethod(int))' in Type 'com.example.MyAspectTest$MyTargetClass.' (MyAspectTest.java:182) advised by afterReturning advice from 'com.example.MyAspect' (MyAspect.java) [with runtime test]
[INFO] Running com.example.MyAspectTest
[ERROR] Tests run: 5, Failures: 0, Errors: 5, Skipped: 0, Time elapsed: 0.055 s <<< FAILURE! - in com.example.MyAspectTest
[ERROR] com.example.MyAspectTest.testMyMethod  Time elapsed: 0.011 s  <<< ERROR!
java.lang.NoSuchMethodError: 'com.example.MyAspect com.example.MyAspect.aspectOf()'
    at com.example.MyAspectTest.<init>(MyAspectTest.java:57)

:MyAspect.java

package com.example;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class MyAspect {

    @AfterReturning("""
            @target(com.example.MyAnnotation)
            && (execution(* *.*(..)) || execution(* .new(..)))
            """)
    public void intercept(JoinPoint JoinPoint) throws Throwable {
        System.out.println("********** MyAspect intercepted");
    }
}

您的aop.xml中有一个细微的错误:

<include within="@com.example.MyAnnotation *" />

include within规则中的范围太窄。 方面编织错误地仅限于目标类,方面 class 本身被排除在外,因为它本身不携带 target5 注释。 效果是编织器本身永远不会完成方面 - 请记住,它之前不是由 AJC 编译的。 这导致了NoSuchMethodError: ...MyAspect.aspectOf() 因此,将编织 scope 扩大到整个基础 package 可以解决您的问题:

<include within="com.example..*" />

还有两点你应该改进:

  • 使用@within而不是@target ,因为@target在运行时动态评估。 只有这样我们才能确定目标实例具有哪种确切类型。 但是, @within可以在编织期间进行静态评估。
  • 由于使用了 Java 17(您似乎喜欢新的文本块),因此使用 AspectJ 1.9.8.RC3。 对于 LTW,只要字节码兼容,这可能不是绝对必要的,但在尝试编译 Java 17 代码时,AspectJ 1.9.7 是不够的,因为它最多仅支持 Java 15。

这是我的三个相应提交的拉取请求

暂无
暂无

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

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