非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
相关产品推荐
相关产品推荐

