AspectJ 注释在 JAVA maven 项目中不起作用(不是 spring 项目)

AspectJ annotations are not working in JAVA maven project (Not spring project)

我正在尝试在没有 spring 的 JAVA maven 项目中实现 AspectJ 注释。我添加了方面并创建了注释。但它没有调用我作为注释添加到方法中的方面..下面是我的代码..还有项目 link - 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{}

我可以看出您是 AspectJ 初学者。你犯了很多错误。但别担心,随着时间的推移,您将学习并获得更多经验。

注释必须具有 RUNTIME 范围

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

方面必须有 @Aspect 注释

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

避免双重日志输出

如果不添加&& 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 和 Java16 的更现代的插件,请查看 dev.aspectj plugin version(请注意其他 Maven 组 ID!)。

在您的 Maven 配置中还有其他一些次优的东西需要更改,但这是最重要的东西,它会使您的项目 运行 和您的可执行 JAR 变小。


更新: 这是我的 pull request 修复了上述问题和其他一些问题(参见提交评论)。