李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
!Destiny
惟坚韧者始能遂其志
  1. 首页
  2. 原创
  3. 技术
  4. 正文

SpringBoot框架自动配置之spring.factories和AutoConfiguration.imports

2025年6月12日 约 846 字3 分钟 160 0 0
本文最后更新于 2025年6月12日,距今已 468 天,其中的信息可能已经发生变化,请注意甄别。

一、核心区别

维度 spring.factories AutoConfiguration.imports
文件路径 META-INF/spring.factories META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
语法格式 Properties 键值对 纯文本(每行一个类名)
加载机制 全量加载后过滤(反射开销大) 按需加载(性能优化)
扩展性 支持多种扩展点(如事件监听器) 仅用于自动配置类注册
推荐场景 Spring Boot 2.x 或需兼容多版本 Spring Boot 3.x + Java 17+
简洁性 配置冗长,可读性低 简洁直观,易于维护

二、详细使用方式

1. spring.factories(传统方式)

适用版本:Spring Boot 1.x - 3.x(全兼容)

配置示例:

# 1. 自动配置类注册(核心功能)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.redis.RedisAutoConfiguration,\
com.example.web.WebMvcAutoConfiguration

# 2. 其他扩展点(非自动配置类)
org.springframework.context.ApplicationListener=\
com.example.listener.MyEventListener

org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.config.MyEnvProcessor

使用说明:

  • 键(如 EnableAutoConfiguration)决定配置类的用途。
  • 值为全限定类名,多个值用逗号分隔,支持续行符 \。
  • 适合需要注册多种类型组件的场景。

2. AutoConfiguration.imports(新方式)

适用版本:Spring Boot 3.0+(需 Java 17+)

配置示例:

# 仅需列出自动配置类,无需键名
com.example.redis.RedisAutoConfiguration
com.example.web.WebMvcAutoConfiguration
com.example.security.SecurityAutoConfiguration

使用说明:

  • 每行一个自动配置类,无特殊分隔符。
  • 仅支持自动配置类(@Configuration),其他扩展点仍需通过 spring.factories 配置。

三、版本支持与兼容性

Spring Boot 版本 Java 版本要求 推荐配置文件 兼容旧格式?
1.x Java 8+ spring.factories 仅支持旧格式
2.x Java 8-17 spring.factories 仅支持旧格式
3.x Java 17+ AutoConfiguration.imports 兼容两种格式,优先加载新格式

四、性能差异

  • spring.factories:
    Spring Boot 启动时会扫描所有 JAR 包中的 spring.factories,加载全部配置类后再通过 @Conditional 过滤,可能导致:

    • 类加载开销大(尤其是依赖众多时)。
    • 反射调用频繁,影响启动速度。
  • AutoConfiguration.imports:

    • 直接指定需要加载的配置类,无需扫描和过滤。
    • 启动时间可缩短 10%-30%(视依赖数量而定)。

五、迁移策略

  1. 新项目:

    • 若使用 Spring Boot 3.x + Java 17,直接采用 AutoConfiguration.imports。
  2. 旧项目升级:

    • 保留 spring.factories 以兼容旧版本。
    • 同时添加 AutoConfiguration.imports 以优化性能(两者可并存)。
  3. 第三方库适配:

    • 检查依赖库是否已更新为新格式(如 Redis、MyBatis 等 Starter)。
    • 若库仍使用 spring.factories,Spring Boot 3.x 会自动兼容。

六、注意事项

  1. 混合使用时的优先级:

    • 若同时存在两种文件,Spring Boot 3.x 会优先加载 AutoConfiguration.imports。
    • 重复的配置类只会被加载一次,不会冲突。
  2. 其他扩展点的处理:

    • 非自动配置类(如事件监听器)仍需通过 spring.factories 注册。
    • 示例:
      # spring.factories 中注册非自动配置组件
      org.springframework.context.ApplicationListener=\
      com.example.listener.MyEventListener
  3. 调试方法:
    启动时添加 --debug 参数,查看自动配置报告:

    java -jar app.jar --debug

总结

  • 选 spring.factories:需兼容 Spring Boot 2.x 或需要注册多种扩展点。
  • 选 AutoConfiguration.imports:Spring Boot 3.x 项目,追求启动性能优化。
  • 两者并存:适合版本过渡期或需要同时支持新旧版本的库开发。

根据项目需求和技术栈选择合适的配置方式,可显著提升开发效率和应用性能。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/tech/4450

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

SpringBoot框架自动配置之spring.factories和AutoConfiguration.imports

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: AutoConfiguration.imports spring.factories SpringBoot
最后更新:2025年6月12日

岁月同一天 9 月 23 日

回望过去的今天,你在写什么

  • 代码人生
    1 年前 2025年9月23日
    Consul开启transparent-proxy访问外部资源的时候,请求偶发Connection reset问题分析

    在Consul中启用透明代理(Transparent Proxy)后,访问外部资源出现偶发Connection rese…

  • 其他
    7 年前 2019年9月23日
    Idea激活码

    2020.4.21到期 亲测有效 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNI…

相关文章
  • SpringBoot基于redis的分布式锁的实现(源码)2019年7月20日
  • k8s + docker + Jenkins使用Pipeline部署SpringBoot项目时Jenkins错误集锦2020年4月8日
  • SpringBoot整合Elasticsearch游标查询(scroll)2020年10月16日
  • 使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理2022年6月23日
  • JVM参数中的-D是什么意思2025年6月23日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

封侯非我意,但愿海波平。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
Redis7+&8.X 全新进阶系列(02):Redis Functions 详解——替代Lua脚本的官方轻量化函数方案 Redis7.x&8.x 全新进阶系列(01):划时代升级总览——从6.x到7.x/8.x全版本变革全景 让WordPress静态化之Rocket‑Nginx WordPress下一代默认主题Ipsum预览 C++之父重磅发声:AI编程正在毁掉一代程序员 支撑全网40%网站的WordPress正在重新拥抱PHP生态
关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比关于使用AI的一些思考WordPress下一代默认主题Ipsum预览Kratos+ v1.1.16版本更新说明
Elasticsearch零停机迁移数据 网站升级到http/2 妹妹的画【2019.07.13】 浅谈一下redis分布式锁和zookeeper分布式锁的区别以及各自的优缺点 使用itext和freemarker来根据Html模板生成PDF文件,加水印、印章 新买的笔记本发货啦……
最近评论
李锋镝 发布于 23 小时前(09月22日) 是的,换风格了,不过我觉得之前的年份命名挺好的,一看就知道哪一年的
obaby 发布于 1 天前(09月22日) 我现在是个假的wp了,哈哈哈 wp终于改了主题的命名风格了
李锋镝 发布于 3 天前(09月20日) 静态博客我之前也用过,但是感觉不是很方便,后来就一直用的WordPress
Sheep5 发布于 3 天前(09月20日) 我直接用静态博客,天然有速度优势。
不凡 发布于 3 天前(09月20日) 主要是wordpress插件丰富,需要什么功能插件,插件市场应有尽有,typecho是性能更好、更轻...
标签聚合
架构 Redis 多线程 Claude IDEA ElasticSearch Theme 日常 数据库 K8s SQL AI编程 JAVA AI MySQL SpringBoot 分布式 Spring WordPress JVM
友情链接
  • sssr7844的博客
  • 皮皮社
  • 蜗牛工作室
  • 林羽凡
  • 韩小韩博客
  • 志文工作室
  • 哥斯拉
  • 搬砖日记
  • lijie blog
  • Honesty
  • 老张博客
  • 瓦匠个人小站
  • 知向前端
  • 临窗旋墨
  • Serendipity
  • 韩情脉脉
  • 若梦博客
  • Mr.Sun的博客
  • 九仞之行
  • 懋和道人

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号