Spring AOP依赖引入的切面未执行:跨模块切面配置问题
跨模块复用AspectJ切面的实现方案
嘿,针对你想在Library模块定义AspectJ切面,然后在另一个SpringBoot服务模块中使用这些切面的需求,我整理了一套可行的步骤,帮你搞定这个问题:
1. 先把Library模块的基础配置做对
首先得确保你的Library模块能被SpringBoot模块正确依赖,并且里面的切面能被识别:
- 在Library模块的
pom.xml里,必须引入AspectJ的核心依赖:
<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.20.1</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.20.1</version> </dependency> </dependencies>
- 你Library模块里的切面一定要是public访问权限,比如完整的切面代码可以写成这样:
package it.cattanisimone.java.mvn.aspectjlibrary; public aspect LibraryAspect { // 定义切点,这里可以根据你的需求调整表达式 public pointcut libraryTraced(): execution(* *.*(..)); // 前置通知 before() : libraryTraced() { System.out.println("来自Library模块的切面输出"); } }
- 打包Library模块的时候,默认Maven会把切面类包含进jar包,除非你加了特殊的过滤规则,这一步不用额外操作。
2. 在SpringBoot模块中引入Library依赖
接下来在SpringBoot服务模块的pom.xml里,添加对Library模块的依赖,这样才能把切面拉进来:
<dependencies> <!-- 引入你的自定义AspectJ Library模块 --> <dependency> <groupId>it.cattanisimone.java.mvn</groupId> <artifactId>aspectjlibrary</artifactId> <version>替换成你的Library模块版本号</version> </dependency> <!-- SpringBoot集成AOP的starter依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> </dependencies>
3. 让SpringBoot启用AspectJ自动代理
在SpringBoot的启动类上加上@EnableAspectJAutoProxy注解,这样Spring才能自动识别并加载所有的AspectJ切面(包括Library模块里的):
package it.cattanisimone.java.mvn.aspectj; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; @SpringBootApplication @EnableAspectJAutoProxy public class AspectjApplication { public static void main(String[] args) { SpringApplication.run(AspectjApplication.class, args); } }
4. 验证切面是否生效
启动你的SpringBoot服务,调用任意被切点匹配到的方法(比如你LocalAspect里的execution(* *.*(..))会匹配所有方法),控制台应该同时输出:
local 来自Library模块的切面输出
如果只看到local,可以检查这几点:
- Library模块的依赖是不是真的引入成功了,jar包里有没有切面类
- 切面的切点表达式是不是能匹配到你调用的目标方法
- SpringBoot的AspectJ自动代理是不是正确启用了
额外注意事项
- 如果你用的是编译时织入(CTW),那得在两个模块的
pom.xml里都配置AspectJ Maven插件,确保切面在编译阶段就被织入目标类:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.9.20.1</version> </dependency> </dependencies> </plugin> </plugins> </build>
- 如果两个切面的切点完全一样,想控制执行顺序的话,在Spring AOP环境下可以用
@Order注解;要是纯AspectJ环境,直接在切面里加declare precedence声明顺序就行:
// 让LibraryAspect的通知先执行 declare precedence : LibraryAspect, LocalAspect;
内容的提问来源于stack exchange,提问作者Cattani Simone
相关产品推荐
相关产品推荐

