1. 概述
Spring Boot 是一个约定优于配置的框架。尽管它自带大量自动配置,但在实际开发中,我们通常还是会通过 application.properties
这类配置文件来覆盖默认行为。
然而,在使用 Spring Cloud 的项目中,你可能会发现还有一个叫 bootstrap.properties
的配置文件。这玩意儿是干啥的?跟 application.properties
又有啥区别?
本文就来 讲清楚这两个配置文件的职责划分和加载顺序,避免你在配置中心、加密配置等场景下踩坑。
2. application.properties 是什么时候用的?
application.yml
或 application.properties
的核心作用是:✅ 配置应用上下文(Application Context)
Spring Boot 启动时会自动创建一个已自动配置好的应用上下文。虽然你可以不用写任何配置就能跑起来,但大多数情况下我们都需要自定义一些属性。
Spring Boot 提供了多种方式来覆盖默认配置,优先级从高到低大致如下:
- 命令行参数
- JVM 系统属性(
-D
) - 操作系统环境变量
application.properties
/application.yml
- ……
⚠️ 关键点来了:**application.properties
的优先级是最低的** —— 也就是说,它最容易被其他方式覆盖。
我们通常会在 application.properties
中配置以下几类内容:
- 🔧 核心配置:日志、线程池等
- 🔄 集成配置:RabbitMQ、ActiveMQ、Kafka 等中间件
- 🌐 Web 配置:HTTP、MVC、端口、静态资源等
- 🔐 安全配置:LDAP、OAuth2、Security 相关设置
这些都属于“应用启动后要生效”的配置,归应用上下文管。
3. bootstrap.properties 是什么时候用的?
bootstrap.yml
或 bootstrap.properties
的作用是:✅ 配置引导上下文(Bootstrap Context)
这个上下文是 Spring Cloud 特有的概念,普通 Spring Boot 项目压根不会加载它。
引导上下文是干啥的?
简单粗暴地说:它是应用上下文的“爹”。
当 Spring Cloud 应用启动时,会先创建一个 bootstrap context
,它的主要任务有:
- 从外部配置中心(如 Config Server)拉取配置
- 解密加密的配置项(比如用 JCE 加密的密码)
- 把获取到的配置提前加载进
Environment
⚠️ 注意:bootstrap context 先于 application context 加载,所以它里面的配置更“早”,也更“基础”。
两个上下文的关系
维度 | bootstrap context | application context |
---|---|---|
职责 | 加载外部配置、解密 | 构建 Bean、启动 MVC 等 |
父子关系 | 是 application 的父上下文 | 子上下文 |
共享环境 | ✅ 共享同一个 Environment 实例 |
✅ |
配置文件 | bootstrap.properties / bootstrap.yml |
application.properties / application.yml |
📌 举个例子:你想从 Git 仓库拿配置,那首先得知道 Config Server 的地址、认证信息。这些“元配置”不可能写在 application.properties
里——因为那个文件本身都还没加载呢!
所以,这类“启动前就必须知道”的配置,就得放在 bootstrap.properties
里。
4. 快速示例
来看一个典型的 bootstrap.properties
配置:
spring.application.name=config-client
spring.profiles.active=development
spring.cloud.config.uri=http://localhost:8888
spring.cloud.config.username=admin
spring.cloud.config.password=secure123
spring.cloud.config.fail-fast=true
management.security.enabled=false
每行解释:
spring.application.name=config-client
➤ 告诉 Config Server:我要拉的是哪个应用的配置spring.profiles.active=development
➤ 激活development
环境,拉对应 profile 的配置spring.cloud.config.uri=http://localhost:8888
➤ Config Server 地址spring.cloud.config.username/admin
和密码
➤ 访问 Config Server 的认证信息spring.cloud.config.fail-fast=true
➤ 如果 Config Server 连不上,直接启动失败,别苟延残喘management.security.enabled=false
➤ (老版本)关闭管理端点安全,方便调试
✅ 这些配置必须在应用启动初期就准备好,否则连配置都拿不到,后面全白搭。
5. 总结
对比项 | bootstrap.properties | application.properties |
---|---|---|
所属上下文 | Bootstrap Context(父) | Application Context(子) |
加载时机 | ❗最早加载,启动初期 | 稍后加载 |
主要用途 | 配置如何获取外部配置(如 Config Server 地址) | 配置应用自身行为 |
是否共享 Environment | ✅ 是,两者共享 | ✅ |
是否必需 | ❌ Spring Boot 单体项目不需要 | ✅ 几乎所有项目都有 |
文件优先级 | 更高(先加载) | 相对较低 |
🔚 一句话总结:
bootstrap.properties
是用来“找配置的配置”,而application.properties
是“找到之后用的配置”。
如果你在用 Spring Cloud Config、Vault、加密配置等功能,不搞清楚这个区别,迟早要踩坑。记住:先有 bootstrap,才有 application。