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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:36:12