AutoConfigurationImportFilter 在自动配置类加载前的字符串阶段过滤,通过低成本字符串匹配提前排除无关类,避免后续反射和条件评估开销;需配合 spring-boot-configuration-processor 生成元数据文件以发挥最大效能。

AutoConfigurationImportFilter 的作用时机很关键
它在 AutoConfigurationImportSelector#filter 阶段被调用,此时自动配置类还只是全限定名字符串数组,**尚未加载字节码**。这意味着你可以用极低成本(比如字符串匹配、元数据查表)提前筛掉大量不需要的类,避免后续反射解析、条件评估甚至类加载带来的开销。
常见错误是误以为它和 @Conditional 一样在 Bean 创建阶段起作用——其实它早得多,属于“配置类筛选层”,不是“Bean 实例化层”。
- 如果想按运行时环境(如
spring.profiles.active)动态过滤,不能只靠它,得配合@ConditionalOnProperty等注解做二次控制 - 它接收的
AutoConfigurationMetadata来自META-INF/spring-autoconfigure-metadata.properties,这个文件必须由 spring-boot-configuration-processor 编译插件生成,否则 metadata 为空 - 返回的
boolean[]必须与输入数组长度一致,false对应位置的类会被直接丢弃,不会进入后续任何条件判断流程
自定义 Filter 必须注册到 spring.factories(Spring Boot 2.x)或 AutoConfiguration.imports(3.x)
Spring Boot 2.x 依赖 META-INF/spring.factories 声明过滤器:
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\ com.example.MyFastFilter
Spring Boot 3.x 及以后改用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,但注意:这个文件只用于声明自动配置类,**不支持注册 Filter**。Filter 注册仍需保留 spring.factories(兼容模式),或通过 @EnableAutoConfiguration(excludeFilters = ...) 在启动类上指定。
- 若项目已升级到 Spring Boot 3.2+,且启用了
spring.autoconfigure.exclude-on-condition,部分内置 Filter(如OnClassCondition)会走新路径,但自定义实现仍需spring.factories - 多个 Filter 按注册顺序依次执行,每个都拿到原始
autoConfigurationClasses数组,不是链式传递结果 - 不要在
match方法里做耗时操作(如 IO、远程调用),它在主线程同步执行,会拖慢启动
用字符串规则快速排除明显无关的配置类
最实用的策略是基于类名做前缀/关键词过滤,比如你项目完全不用数据库,就可以直接排除所有含 DataSource、Jpa、Jdbc 的配置类:
public class FastExclusionFilter implements AutoConfigurationImportFilter {
private static final Set<string> EXCLUDE_KEYWORDS = Set.of(
"DataSource", "Jpa", "Jdbc", "Hibernate", "Mybatis"
);
@Override
public boolean[] match(String[] autoConfigurationClasses,
AutoConfigurationMetadata autoConfigurationMetadata) {
boolean[] matches = new boolean[autoConfigurationClasses.length];
Arrays.parallelSetAll(matches, i -> {
String className = autoConfigurationClasses[i];
return className == null || EXCLUDE_KEYWORDS.stream()
.noneMatch(keyword -> className.contains(keyword));
});
return matches;
}
}</string>
这种过滤比 @ConditionalOnClass 快一个数量级,因为不涉及类加载器查找。
- 注意
className是全限定名,如org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration - 避免用正则,
String.contains()足够快且安全;正则编译和匹配反而引入额外开销 - 别试图用
autoConfigurationMetadata查@ConditionalOnMissingBean这类运行时条件——它只存编译期静态元数据,比如@ConditionalOnClass的 value 值
性能收益取决于项目依赖规模,但容易忽略元数据缺失问题
一个中等规模微服务(50+ starter)启用合理过滤后,AutoConfigurationImportSelector#getAutoConfigurationEntry 阶段耗时可从 120ms 降到 30ms 左右。但前提是 spring-autoconfigure-metadata.properties 文件存在且非空。
这个文件默认由 spring-boot-configuration-processor 生成,如果你的模块没加该插件,或者用了 Lombok 导致注解处理器顺序异常,autoConfigurationMetadata 就是空的——你的 Filter 依然执行,但无法利用元数据做更精细判断(比如跳过某个特定条件不满足的类),只能退回到纯字符串过滤。
- 检查方法:在 IDE 中打开
target/classes/META-INF/spring-autoconfigure-metadata.properties,确认有内容 - Gradle 用户需显式启用注解处理器:
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' - Filter 本身无法修复元数据缺失,但它也不依赖元数据存活——纯字符串过滤仍然有效










