在使用Spring Boot
搭建多模块项目时,需要使用到自动配置功能,把一些通用功能封装成模块后通过META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件注册配置类。然而,最近遇到一个奇怪的问题:
- 自动配置类怎么都不生效
最终排查发现,问题竟然出在文件路径上!这篇文章记录一下问题的经过和解决方法。
一、问题描述
项目背景
-
使用版本:Spring Boot 3.x。
-
模块设计:
-
framework 模块:实现了一个幂等注解
@Idempotent
,通过切面类IdempotentAspect
拦截方法,并用IdempotentAutoConfiguration
注入。 -
测试模块:引入
framework
模块,测试幂等注解是否生效。
-
framework 模块:实现了一个幂等注解
-
配置方式:
- 在
framework
模块的src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中注册自动配置类:cn.com.h8k.onecoupon.framework.config.IdempotentAutoConfiguration
- 在
问题现象
测试时发现:
-
@Idempotent
注解没有触发切面逻辑。 - 日志里没有加载
IdempotentAutoConfiguration
的相关信息。 - 即使加了调试代码和日志,仍然没有任何效果。
二、排查过程
1. 确认自动配置文件路径和内容
首先检查了 AutoConfiguration.imports
文件的位置和内容是否正确:
- 路径:
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
- 内容:确认类名拼写无误。
但是问题依然存在,怀疑是自动配置类根本没有被 Spring Boot 加载。
2. 验证自动配置类是否加载
在自动配置类 IdempotentAutoConfiguration
中添加静态代码块或日志输出,判断是否加载:
@AutoConfiguration
public class IdempotentAutoConfiguration {
static {
System.out.println("IdempotentAutoConfiguration 加载成功!");
}
}
重新启动项目后,依然没有看到任何输出。说明自动配置类根本没有被 Spring Boot 扫描到。
3. 检查 META-INF
文件夹的实际路径
仔细查看项目结构时,发现 META-INF/spring
文件夹显示为 META-INF.spring
,这引起了注意。
原因分析:
在 IntelliJ IDEA
中,新建文件夹 META-INF/spring
后,IDEA 默认显示为 META-INF.spring
。如果直接在这个路径下创建文件,实际路径就会变成错误的 META-INF.spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
。
最终确认:文件路径写错了,Spring Boot 无法找到自动配置文件。
4. 修正路径并验证
将文件移动到正确路径 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
后,重新启动项目,问题解决!
日志中成功显示:
Positive matches:
-----------------
IdempotentAutoConfiguration
测试时,@Idempotent
注解也正常生效,切面逻辑开始运行。
结论 TL;DR
切记,在resources
中创建多级文件夹(new directory
)的时候,用/
进行分割父子文件夹,别用.
来分割了