You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非Spring环境下Java Maven项目中AspectJ注解无法生效问题求助

我帮你排查了一下代码和配置,发现几个关键问题,调整后应该就能正常触发切面逻辑了:

问题排查与修复步骤

1. 切面类必须标注@Aspect注解

你的SysoutAdvice类只添加了@Around通知注解,但AspectJ需要用@Aspect标记这是一个切面类,否则无法识别它。修改后的切面类如下:

package com.aop.advices;

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

@Aspect // 必须添加这个注解标记切面
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;
    }
}

2. 完善aspectj-maven-plugin的执行配置

你当前的插件配置只定义了编译级别,但没让插件参与项目的编译生命周期。需要取消注释你原本写的executions部分,让插件在compile阶段完成切面织入:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.11</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal> <!-- 编译时织入切面逻辑 -->
                <goal>test-compile</goal> <!-- 如果测试类也需要织入可保留 -->
            </goals>
        </execution>
    </executions>
    <configuration>
        <complianceLevel>1.8</complianceLevel>
        <source>1.8</source>
        <target>1.8</target>
        <!-- 明确扫描切面和目标类的包路径,避免漏织入 -->
        <includes>
            <include>com/aop/**/*.java</include>
            <include>com/annotations/**/*.java</include>
        </includes>
    </configuration>
</plugin>

注意删除你原本单独配置的无execution的aspectj-maven-plugin,避免重复配置冲突。

3. 优化依赖配置

aspectjtools是编译时工具,不需要作为运行时依赖,可以给它加上provided scope,避免打包到最终jar包中:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjtools</artifactId>
    <version>1.9.6</version>
    <scope>provided</scope> <!-- 标记为编译时依赖 -->
</dependency>

运行时只保留aspectjrt和aspectjweaver即可。

4. 确认注解路径与调用逻辑

  • 确保自定义注解Sysout的包路径确实是com.annotations,切面中@annotation(com.annotations.Sysout)的路径完全匹配。
  • 测试时通过类实例正常调用被@Sysout标注的方法(AspectJ编译时织入会修改目标类字节码,只要编译正确,正常调用就会触发切面)。

验证步骤

修改完成后,执行mvn clean compile package重新编译打包,再运行你的Test类,应该就能看到"Start...."和"End...."的输出了。

内容的提问来源于stack exchange,提问作者Chandru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:12:42