Spring Boot 3.x自动配置原理与2.x差异核心在于四点:入口机制改用AutoConfigurationGroup延迟加载;配置类加载路径从spring.factories切换为AutoConfiguration.imports纯文本文件;条件评估更严格,如@ConditionalOnClass不触发静态初始化、@ConditionalOnMissingBean默认仅查当前容器;全面迁移至jakarta.*包并引入@AutoConfiguration新注解标准。

要准确理解SpringBoot 3.x自动配置原理与2.x的差异,必须从入口机制、配置类加载路径、条件评估逻辑和底层依赖四方面切入,否则升级后启动失败或Bean缺失将难以定位。
自动配置的触发入口变了
Spring Boot 2.x中@EnableAutoConfiguration通过@Import(AutoConfigurationImportSelector.class)导入配置类;Spring Boot 3.x则改用@Import(AutoConfigurationGroup.class),该类实现了DeferredImportSelector.Group接口,延迟到所有@Configuration类解析完成后再执行分组筛选。
这一步变化导致自动配置类的加载时机整体后移,避免了早期因@Configuration未就绪而误判@ConditionalOnClass等条件的问题。
如果你在2.x中自定义过AutoConfigurationImportSelector的子类,【必须重写为AutoConfigurationGroup实现】,否则不会被识别。
配置类不再从spring.factories加载
方法一:Spring Boot 2.x依赖META-INF/spring.factories文件,以org.springframework.boot.autoconfigure.EnableAutoConfiguration为key列出全限定类名。
方法二:Spring Boot 3.x完全弃用spring.factories,改用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,每行一个自动配置类的全限定名,不支持#注释、不支持逗号分隔、不支持通配符。
这个文件必须是纯文本格式,UTF-8编码,且首行不能有BOM头。如果旧项目保留了spring.factories但没删掉,3.x会静默忽略它——不会报错,也不会加载其中的配置类,极易造成功能丢失却查不到原因。
条件注解的评估逻辑更严格
第一步:@ConditionalOnClass现在使用ClassLoader.loadClass而非Class.forName,不触发静态初始化块。
第二步:@ConditionalOnMissingBean默认启用search = SearchStrategy.CURRENT(仅当前容器),而2.x默认是ALL(含父容器)。这意味着父子上下文隔离更彻底,跨上下文共享Bean需显式指定search = SearchStrategy.ALL。
第三步:@ConditionalOnProperty对空字符串、null值、未定义属性的判定更精确,例如spring.profiles.active=“”在2.x中可能被当作激活default,在3.x中明确视为未激活任何profile。
Jakarta EE迁移直接影响自动配置生效
Spring Boot 3.x所有自动配置类内部使用的Servlet、Validation、Persistence等API均已切换为jakarta.*包。例如:AutoConfigureWebMvc中的WebMvcConfigurer依赖jakarta.servlet.Filter,若项目里仍有javax.servlet.http.HttpServletRequest参数的自定义Filter,【该Filter会导致整个WebMvcAutoConfiguration跳过】,因为@ConditionalOnClass(jakarta.servlet.Filter.class)为true,但@ConditionalOnMissingBean类型匹配失败。
这并非配置错误,而是类路径污染引发的条件误判——必须确保所有依赖jar中不混用javax.*和jakarta.*的同一接口。
@AutoConfiguration注解成为新标准
方法1:Spring Boot 3.x推荐使用@AutoConfiguration替代@EnableAutoConfiguration作为配置类顶层注解,它自带@Import(AutoConfigurationImportRegistrar.class),可声明order、before、after等元数据。
方法2:@AutoConfiguration可直接标注在普通类上,无需配合@Configuration;而2.x中所有自动配置类都必须是@Configuration类。
方法3:Spring Boot 3.x内置的自动配置类(如DataSourceAutoConfiguration)已全部重构为@AutoConfiguration风格,源码中不再出现@EnableAutoConfiguration。
你写的自定义starter若仍用@EnableAutoConfiguration + @Configuration组合,在3.x中虽能运行,但无法参与新的排序和前置/后置依赖声明机制。

















