SpringBoot3 spring.factories自动配置功能不生效的解决

 更新时间:2025年09月04日 16:14:35   作者:小时候的阳光  
SpringBoot3弃用spring.factories,改用AutoConfiguration.imports文件管理自动配置类,需删除旧文件,新增专用文件并使用@AutoConfiguration替代@Configuration+@ConditionalOn组合注解,提升配置清晰度与未来扩展性

场景说明

原来的SpringBoot 自动配置功能如下,主要是创建spring.factories 文件,在里面写入你要自动配置的类全路径。

文件内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.bigshow.starter.sse.config.SseAutoConfigure

其中 SseAutoConfigure 就是你要自动化配置的类:

/**
 * SSE服务端 核心配置类
 *
 * @author BigShow
 */
@Configuration
@ConditionalOnProperty(prefix = "bigshow.sse", value = "enable", havingValue = "true")
@EnableConfigurationProperties({SseProperties.class})
public class SseAutoConfigure implements InitializingBean {

    @Lazy
    @Resource
    private ApplicationContext applicationContext;

    @Bean
    @ConditionalOnMissingBean
    SseServer sseServer() {
        return new SseServer();
    }


    @Bean
    @ConditionalOnMissingBean
    public SseBusinessService sseBusinessService() {
        return new DefaultSseBusinessServiceImpl();
    }
}

该项目打包 mvn clean install 或者 mvn deploy 发布到maven仓库中去,

其他应用项目直接引入然后在application.yml文件中配置一下即可使用此功能。

    <dependency>
        <groupId>com.bigshow</groupId>
        <artifactId>sse-spring-boot-starter</artifactId>
        <version>1.0</version>
    </dependency>
bigshow:
  sse:
    enable: true

但是!从SpringBoot3开始,这样 spring.factories 自动配置功能不生效了。

原因是:官方做出了改变!

原因说明

Spring Boot 3采用了基于META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件的自动配置加载策略,替代了过去的spring.factories方式

注意:文件名字就是 “org.springframework.boot.autoconfigure.AutoConfiguration.imports

这个文件里面的内容就是你要配置类的全路径名称即可:

com.example.autoconfig.MyAutoConfiguration1
com.example.autoconfig.MyAutoConfiguration2
com.example.autoconfig.MyAutoConfiguration3
...

看到这里不禁要问:这和之前的有什么区别 ,感觉就是配置文件名称不一样了 ? !

从表面上看,确实是这样,但是这为未来提供了很大的意义:

原来的 spring.factories 文件里面可以做很多其他的事情,它是一个 多功能的配置文件,采用键值对形式,内部可以声明多种类型的自动加载内容,不只是自动配置类,还包括:

  • 监听器(ApplicationListener)
  • 环境后置处理器(EnvironmentPostProcessor)
  • ApplicationContextInitializer
  • FactoryBean 等等

所以确实,spring.factories文件长期承担了很多职责,Spring Boot3通过拆分专用文件来让自动配置更清晰规范,也更适合未来演进,

Spring Boot 3 对 spring.factories 中的自动配置部分做了拆分,但 其他功能和扩展点并没有全部抛弃 spring.factories,而是逐步迁移或沿用不同的新机制。

功能类型以前在 spring.factories 里声明Spring Boot 3 处理方式(现状)
自动配置类(EnableAutoConfiguration)在 spring.factories 的 key: org.springframework.boot.autoconfigure.EnableAutoConfiguration拆分到 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中声明类全名
ApplicationListenerspring.factories的org.springframework.context.ApplicationListener依然使用 spring.factories 方式声明,暂时未拆分,未来可能转为模块化机制
EnvironmentPostProcessorspring.factories的org.springframework.boot.env.EnvironmentPostProcessor依然通过 spring.factories 声明继续使用
ApplicationContextInitializerspring.factories的org.springframework.context.ApplicationContextInitializer目前依然使用 spring.factories
FactoryBean及其他扩展类spring.factories声明大多数依然沿用 spring.factories,具体视扩展功能而定

简单总结过去和现在的配置文件方式对比:

方面以前的 spring.factories现在的 AutoConfiguration.imports
作用范围多种扩展点都在里面声明只声明自动配置类
文件结构key-value 配置格式纯粹类名列表,每行一个全限定类名
维护复杂度可能集中且复杂简单、专一,后续更易扩展
兼容性老版本Spring Boot依赖Spring Boot 3及以后版本推荐

未来趋势和新机制

  • Spring 团队计划逐步拆解 spring.factories 的过度职责,将不同的扩展分别拆分到更明确、可维护的专用文件或基于 Java 模块系统(JPMS)的机制中。
  • 部分机制将使用 spring.autoconfigure 专用资源文件,其他高级扩展会结合 SPI(ServiceLoader机制)、spring/org/springframework/boot 下的专用目录,或者全新注解驱动方式实现。
  • 但目前绝大多数非自动配置的扩展仍旧通过 spring.factories 管理。

如何迁移老的starter

原自定义的starter工程:

删除META-INF/spring.factories文件或者停止使用它。

在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中添加你的自动配置类路径,例如:

com.bigshow.starter.sse.config.SseAutoConfigure

自动配置类里使用@AutoConfiguration替换原来@Configuration和 (Spring Boot 3 官方推荐使用@AutoConfiguration替代以前的@Configuration + @ConditionalOn等组合注解)

@AutoConfiguration
@ConditionalOnProperty(prefix = "bigshow.sse", value = "enable", havingValue = "true")
@EnableConfigurationProperties({SseProperties.class})
public class SseAutoConfigure implements InitializingBean {
...
}

这里简单说明下@Configuration 换成 @AutoConfiguration 好处

  1. 明确标识自动配置类身份
  2. 增强编译期和IDE的支持
  3. 更精准的自动配置加载机制
  4. 未来扩展和模块化支持更友好
  5. 避免潜在的类路径扫描冲突
  6. 结合条件注解效果更可靠

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现红黑树(平衡二叉树)的详细过程

    Java实现红黑树(平衡二叉树)的详细过程

    红黑树接近平衡的二叉树,插入,删除函数跟平衡二叉树一样,只是平衡函数不同,下面这篇文章主要给大家介绍了关于Java实现红黑树(平衡二叉树)的相关资料,需要的朋友可以参考下
    2021-10-10
  • Gradle的安装和IDEA集成、项目导入的详细教程

    Gradle的安装和IDEA集成、项目导入的详细教程

    这篇文章主要介绍了Gradle的安装和IDEA集成、项目导入的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • resttemplate设置params的方法

    resttemplate设置params的方法

    RestTemplate设置请求参数的方式根据请求类型(GET/POST)和参数形式(路径参数、查询参数、JSON请求体)有所不同,下面通过本文给大家介绍resttemplate设置params的方法,感兴趣的朋友一起看看吧
    2025-04-04
  • mybatis 报错显示sql中有两个limit的解决

    mybatis 报错显示sql中有两个limit的解决

    这篇文章主要介绍了mybatis 报错显示sql中有两个limit的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java中泛型使用的简单方法介绍

    Java中泛型使用的简单方法介绍

    这篇文章主要给大家介绍了关于Java中泛型使用的简单方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 关于@Query注解的用法(Spring Data JPA)

    关于@Query注解的用法(Spring Data JPA)

    这篇文章主要介绍了关于@Query注解的用法(Spring Data JPA),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java使用访问者模式解决公司层级结构图问题详解

    Java使用访问者模式解决公司层级结构图问题详解

    这篇文章主要介绍了Java使用访问者模式解决公司层级结构图问题,结合实例形式分析了访问者模式的概念、原理及Java使用访问者模式解决公司曾经结构图问题的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-04-04
  • springboot schedule 解决定时任务不执行的问题

    springboot schedule 解决定时任务不执行的问题

    这篇文章主要介绍了springboot schedule 解决定时任务不执行的问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数是两个非常强大的功能,它们可以让我们编写更灵活和优雅的代码,但也需要注意一些潜在的问题和风险,这篇文章主要介绍了Scala隐式转换和隐式参数,需要的朋友可以参考下
    2023-04-04
  • springboot加载不到nacos配置中心的配置问题处理

    springboot加载不到nacos配置中心的配置问题处理

    这篇文章主要介绍了springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06

最新评论