【问题标题】:AspectJ annotations are not working in JAVA maven project (Not spring project)AspectJ 注释在 JAVA maven 项目中不起作用(不是 spring 项目)
【发布时间】:2021-05-30 10:45:52
【问题描述】:

我正在尝试在没有 spring 的 JAVA maven 项目中实现 AspectJ 注释。我已经添加了方面并创建了注释。但它没有调用我作为注释添加到方法的方面。下面是我的代码。还有项目链接 - https://github.com/chandru-kumar/aop-example

我也添加了 aspectj maven 插件..但它没有被调用..你能帮忙..吗?不知道我错过了什么。 我还没有找到没有 Spring 项目的任何示例..

Pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.aop.example</groupId>
  <artifactId>aop-example</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>1.9.6</version>
        </dependency>
        
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.6</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.11</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <useIncrementalCompilation>false</useIncrementalCompilation>
                </configuration>
            </plugin>
            
            <!-- <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <complianceLevel>1.8</complianceLevel>
                            <source>1.8</source>
                            <target>1.8</target>
                        </configuration>
                    </execution>
                </executions>
            </plugin> -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>
                                        com.aop.example.Test
                                    </mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

JAVA - 方面 - 建议

package com.aop.advices;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;

public class SysoutAdvice {
    @Around("@annotation(com.annotations.Sysout)")
    public Object print(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("Start....");
        Object object = proceedingJoinPoint.proceed();
        System.out.println("End....");
        return object;
    }
}

JAVA - 注释

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@retention(RUNTIME)
@target(METHOD)
public @interface Sysout{}

【问题讨论】:

  • 这里是示例代码 - AOP Example
  • 感谢 GitHub 上的MCVE。这完全是正确的做法。否则我不可能在几分钟内注意到所有这些错误。实际上,回答问题并通过屏幕截图记录问题比实际修复应用程序花费的时间要长得多。

标签: aspectj aspectj-maven-plugin


【解决方案1】:

我可以说您是 AspectJ 初学者。你犯了很多错误。不过不用担心,随着时间的推移,您会不断学习并获得更多经验。

注解必须有RUNTIME范围

否则编译后的代码将没有注解可以拦截,只有源代码,无济于事。

切面必须有@Aspect注解

否则 AspectJ 编译器不会将类识别为方面。

避免双日志输出

如果不添加&amp;&amp; execution(* *(..)),切面将拦截callexecution 连接点。效果将是双日志消息,因为方面建议被触发了两次。

添加缺少的 Maven 插件执行

否则 AspectJ Maven 插件不会编译任何东西,因为你没有告诉它要做什么。

删除多余的 AspectJ 依赖项

否则,Assembly 插件会将它们打包到可执行 JAR 中,使其大小达到 13.4 MB。但实际上,在使用编译时编织时,您只需要 AspectJ 运行时 aspectjrt 即可运行应用程序。另外两个用于加载时编织 (aspectjweaver) 和用于 AspectJ 编译器 (aspetjtools),这两者在运行时都不需要。

如果您按照我的建议删除这两个,JAR 大小会显着缩小到 0.12 MB。这比原来小 100 倍多。

确保旧的 AspectJ Maven 插件使用最新的 AspectJ 编译器

版本号应与aspectjrt 使用的版本号相同。所以你不需要aspetjtools作为运行时依赖,而是作为插件依赖,如果你想确保你有相同的版本。

此步骤是可选的,但 AspectJ Maven 1.11 默认使用 AspectJ Tools 1.8.13。如果您只编译 Java 8 代码,这很好,因为 AspectJ Maven 1.11 不支持超过 Java 8。

如果您想要支持 AspectJ 1.9.7.M3 和 Java 16 的更现代的插件,请查看 dev.aspectj plugin version(请注意其他 Maven 组 ID!)。

在您的 Maven 配置中应该更改其他次优的东西,但这是最重要的东西,它可以使您的项目运行并让您的可执行 JAR 变小。


更新:这是我的pull request,它解决了上述问题和更多问题(请参阅提交 cmets)。

【讨论】:

  • 更新:我创建了一个 GitHub 拉取请求并添加了一个指向我的答案的链接。
  • 谢谢@kriegaex。示例代码有效!我知道我必须先掌握基础知识,然后再开始创建示例项目。非常感谢您花时间解释基本内容并更新我的示例代码。这很有帮助..!!
  • 另外,当我将 Eclipse 中的代码作为 Java 程序运行时,这些方面没有被调用。 Eclipse 中是否有用于 AspectJ 的插件来使其工作?我可以 mvn 打包 jar 并运行它,它可以工作..只是想知道,如果我们在 Eclipse 中有任何选项....
  • 您尝试过网络搜索引擎吗?寻找 AJDT。
  • @dreamcrash,我一直希望它能教给其他可能会发现这一点的用户,也就是说,我写它并不是为了 OP 的利益。实际上,我很惊讶在这样一个小示例项目中一次可以做错多少事情。但是它很小,使它成为一个很好的例子,教育初学者在尝试“复制和粘贴编程”时要注意哪些细节。软件开发都是关于细节的,不是吗? ?
猜你喜欢
  • 2018-10-18
  • 2022-08-03
  • 2019-05-19
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多