本篇目标:把 Spring Boot 最常用的配置项按十类整理成一张可随时查阅的速查表,为每一项标注默认值、作用与对应的正文小节,并给出 3.x 到 4.x 的配置项迁移对照。
适用版本:Spring Boot 4.1.x(Java 21)
附录 B 配置项速查
Spring Boot 暴露的配置项有上千个,但日常开发真正会改的不过几十个。本附录把它们按用途分成十类,每张表给出「配置项 / 默认值 / 说明 / 详见章节」四列,把它当字典用:先定位类别,再找键名,最后顺着「详见」回到正文看完整推导。
先约定三件事。第一,键名一律用 application.yml 的层级写法给出,用 .properties 文件时把点号当分隔符展开即可,两种写法完全等价。第二,「默认值」一列取自 Spring Boot 4.1.x 的官方元数据,标「—」表示没有固定默认值或由环境决定。第三,标 ⚠ 的行是 4.x 与 3.x 行为不同、迁移时最容易踩的地方。
B.1 服务器
server.* 前缀控制内嵌 Web 服务器。第 3 章已经见过它,这里补齐高频项:
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
server.port | 8080 | 内嵌 Tomcat 监听端口;设为 0 由系统随机分配,集成测试常用 | 3.2 |
server.servlet.context-path | / | 应用上下文路径;配成 /api 后所有映射前都多一层前缀 | 8.1 |
server.shutdown | immediate | 关闭模式;改为 graceful 会等待在途请求完成,日志出现 GracefulShutdown 两行 | 3.2 |
server.tomcat.threads.max | 200 | Tomcat 工作线程上限;threads.min-spare 控制保底线程数 | 3.2 |
server.tomcat.max-connections | 8192 | 允许的最大连接数 | 3.2 |
server.error.include-message | never | 错误响应是否包含异常 message;调试期可临时设 always | 10.1 |
server.forward-headers-strategy | — | 反向代理后如何解析真实协议与主机,取值 native / framework | 3.2 |
server.compression.enabled | false | 是否启用响应压缩;mime-types 控制压缩范围 | 3.2 |
server.http2.enabled | false | 是否启用 HTTP/2,需配合 TLS | 3.2 |
server.servlet.session.timeout | 30m | 会话超时时间,带单位 | 11.3 |
注意 server.shutdown: graceful 需要配合 spring.lifecycle.timeout-per-shutdown-phase(默认 30s)控制等待上限,超时后仍会强制关闭。生产环境的滚动发布几乎都会打开这一项,否则正在处理的请求会被直接切断。
server.forward-headers-strategy 是部署到网关或反向代理后最容易漏配的一项:不配的话,应用看到的协议永远是 http、主机是代理地址,生成的重定向链接就会错。Kubernetes 里一般交给框架处理,传统 Nginx 前置则常用 native。
B.2 应用
spring.application.* 与 spring.profiles.* 决定「这个应用是谁」以及「用哪套配置」。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
spring.application.name | application | 应用名;出现在日志、Actuator 与服务注册中,强烈建议显式设置 | 1.1 |
spring.profiles.active | — | 激活的 profile 列表,逗号分隔;启动日志会打印实际生效值 | 6.1 |
spring.profiles.default | default | 未显式激活任何 profile 时使用的兜底 profile | 6.1 |
spring.profiles.include | — | 在当前 profile 之上再叠加的 profile 组 | 6.1 |
spring.config.import | — | 导入额外的配置文件或配置树;4.1 起可为导入项指定编码 | 6.3 |
spring.config.name | application | 配置文件名(不含后缀);改它会连带改掉查找的文件名 | 6.3 |
spring.main.banner-mode | console | 启动横幅的显示方式,可设 off 关闭 | 3.2 |
spring.main.allow-circular-references | false | 是否允许 Bean 循环引用;默认禁止,不建议打开 | 5.2 |
spring.main.lazy-initialization | false | 是否全局延迟初始化;可加快启动但会推迟错误暴露 | 5.3 |
spring.output.ansi.enabled | detect | 控制台彩色输出开关,取值 always / never / detect | 16.1 |
spring.config.import 是 2.4 之后推荐的组合配置方式,比如把敏感配置拆到 configtree: 或另一个 file: 中再导入,它比多个 profile 文件更好维护。若导入的是一份外部 .properties,4.1 允许显式声明其字符编码,避免中文被按 ISO-8859-1 误读。
spring.main.lazy-initialization 是个双刃剑:打开后启动更快,但 Bean 的初始化错误会从「启动时」推迟到「第一次被用到时」,反而更难排查。它适合启动时间敏感、且已有充分测试覆盖的场景,不适合还在开发中的项目。
B.3 数据源
spring.datasource.* 负责连接池。只要 classpath 上有 HikariCP 与 JDBC 驱动,Spring Boot 就会自动配置一个 DataSource,4.0 起 HikariCP 升到 7.0。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
spring.datasource.url | 内嵌库时自动生成 | JDBC 连接串;显式给出后以它为准 | 12.1 |
spring.datasource.username | — | 数据库用户名 | 12.1 |
spring.datasource.password | — | 数据库密码;生产环境用环境变量或配置中心注入 | 12.1 |
spring.datasource.driver-class-name | 由 URL 推断 | JDBC 驱动类名;多数据源或自定义 URL 时才需显式指定 | 12.1 |
spring.datasource.hikari.maximum-pool-size | 10 | 连接池上限,最常调的一项 | 12.1 |
spring.datasource.hikari.minimum-idle | 同 maximum-pool-size | 保底空闲连接数 | 12.1 |
spring.datasource.hikari.connection-timeout | 30000 ms | 从池中获取连接的最长等待时间 | 12.1 |
spring.datasource.hikari.idle-timeout | 600000 ms | 空闲连接被回收前的最长空闲时间 | 12.1 |
spring.datasource.hikari.max-lifetime | 1800000 ms | 连接的最长存活时间,略小于数据库侧超时 | 12.1 |
spring.datasource.hikari.pool-name | HikariPool-1 | 连接池名,日志与监控里用于区分多数据源 | 12.1 |
spring.datasource.hikari.auto-commit | true | 是否自动提交;配事务时通常保持默认 | 12.1 |
spring.datasource.hikari.leak-detection-threshold | 0(关闭) | 超过该毫秒数未归还连接就打印告警,排查泄漏很有用 | 12.1 |
⚠ spring.datasource.connection-fetch | eager | 4.1 新增;设 lazy 后连接在真正执行 SQL 时才获取,可加快启动 | 12.1 |
maximum-pool-size 不是越大越好:它受数据库最大连接数约束,多个实例各开 10 个连接,很容易在横向扩容时把数据库连接打满。经验做法是先按「实例数 × 池上限 < 数据库 max_connections × 0.8」估算。
leak-detection-threshold 在排查「连接池耗尽」时非常关键:把它设成 2000,任何占用超过 2 秒未归还的连接都会打出堆栈,一眼就能定位到忘记关闭或长事务的代码。它只增加少量开销,值得在压测环境常开。
B.4 JPA 与 Hibernate
spring.jpa.* 前缀。4.0 起 Hibernate 升到 7.2,但配置项名称基本沿用。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
spring.jpa.hibernate.ddl-auto | 内嵌库 create-drop,其他 none | 表结构生成策略;有迁移脚本时只用 validate 或 none | 15.1 |
spring.jpa.show-sql | false | 是否把 SQL 打到控制台;只适合本地调试 | 12.2 |
spring.jpa.open-in-view | true | 是否把 Session 延迟到视图渲染完;启动会警告,建议显式设 false | 13.1 |
spring.jpa.properties.* | — | 原样透传给 JPA 提供者,例如 hibernate.format_sql | 12.2 |
spring.jpa.generate-ddl | false | 是否在启动时生成 DDL;与 ddl-auto 配合使用 | 15.1 |
spring.jpa.database-platform | 由连接推断 | 方言;多数据源或特殊数据库时才显式指定 | 12.2 |
spring.jpa.defer-datasource-initialization | false | 是否把 data.sql 推迟到 JPA 初始化之后再执行 | 15.3 |
spring.jpa.properties.hibernate.jdbc.batch_size | 15 | JDBC 批量写入大小,批量插入场景可调大 | 12.3 |
open-in-view: true 的问题在于:它把数据库连接从 Service 层一直占用到 HTTP 响应写完,高峰期会显著拉长连接占用时间。关闭后若在模板或序列化阶段触碰未加载的关联,会立刻抛 LazyInitializationException——这正是排查手册 附录 D
里专门列出的一个症状。
spring.jpa.properties.* 是一个透传通道:键名去掉 spring.jpa.properties. 前缀后,原样交给 JPA 提供者(这里是 Hibernate)。所以 Hibernate 的所有配置项都能通过它触达,代价是没有 IDE 补全、也没有默认值校验,写错只会静默无效。
B.5 Jackson(4.x 口径)
这是 4.x 改动最大的一类配置,务必逐条核对。Spring Boot 4.0 把 JSON 处理切到 Jackson 3,包名由 com.fasterxml.jackson 改为 tools.jackson(jackson-annotations 仍留在 com.fasterxml.jackson.annotation),自动配置改用 JsonMapper / XmlMapper。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
⚠ spring.jackson.json.read.* | — | 反序列化特性,对应 Jackson 的反序列化 Feature | 8.2 |
⚠ spring.jackson.json.write.* | — | 序列化特性,对应 Jackson 的序列化 Feature | 10.3 |
⚠ spring.jackson.find-and-add-modules | true | 4.x 新增:Jackson 3 自动注册 classpath 上所有模块,设 false 可回到只注册知名模块 | 8.2 |
⚠ spring.jackson.use-jackson2-defaults | false | 4.x 逃生舱:配合 spring-boot-jackson2 模块,让 Jackson 3 用 Jackson 2 的默认行为 | 8.2 |
spring.jackson.default-property-inclusion | — | 全局序列化包含策略,如 non_null | 10.3 |
spring.jackson.time-zone | — | 日期时间的默认时区 | 10.3 |
spring.jackson.date-format | — | 日期格式字符串 | 10.3 |
spring.jackson.locale | — | 序列化使用的 Locale | 10.3 |
spring.jackson.property-naming-strategy | — | 全局属性命名策略,如 SNAKE_CASE | 10.3 |
三处最需要留意:
- 旧前缀全部失效。3.x 的
spring.jackson.read.*/spring.jackson.write.*在 4.x 必须写成spring.jackson.json.read.*/spring.jackson.json.write.*;spring.jackson.parser.*也并入spring.jackson.json.read.*。写错前缀不会报错,只是静默不生效,这是迁移中最隐蔽的坑。完整对照见 B.11。 - 自定义
ObjectMapperbean 不再能替换自动配置。3.x 里放一个@Bean ObjectMapper就能接管全局序列化;4.x 自动配置用的是JsonMapper,要定制请用JsonMapperBuilderCustomizer(旧的Jackson2ObjectMapperBuilderCustomizer已改名)。 - 模块注册范围变了。Jackson 3 会把 classpath 上所有模块都注册进来,好处是「引了依赖就自动生效」,风险是行为可能被意料之外的模块改变;真出问题先试
spring.jackson.find-and-add-modules: false。 - 注解仍在旧包。只有 Jackson 核心库改到了
tools.jackson,jackson-annotations依旧在com.fasterxml.jackson.annotation——所以@JsonProperty、@JsonIgnore这些注解的 import 不用改。迁移时最容易犯的错,就是把它们一起改掉导致编译失败。
B.6 日志
logging.* 前缀。默认用 Logback,控制台输出格式由 pattern 决定。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
logging.level.* | INFO | 按包或类名设级别,如 logging.level.org.hibernate.SQL: debug | 16.1 |
logging.level.root | INFO | 根 logger 级别 | 16.1 |
logging.file.name | — | 日志文件名;设置后同时写文件 | 16.1 |
logging.file.path | — | 日志目录;与 file.name 二选一 | 16.1 |
logging.pattern.console | 内置彩色格式 | 控制台日志格式,可加 %clr 上色 | 16.1 |
logging.pattern.file | 内置格式 | 文件日志格式 | 16.1 |
logging.charset.console | 平台默认 | 控制台输出字符集,Windows 中文乱码时设 UTF-8 | 16.1 |
logging.charset.file | 平台默认 | 文件输出字符集 | 16.1 |
⚠ logging.console.enabled | true | 4.0 新增;设 false 可完全关闭控制台输出 | 16.1 |
logging.group.* | — | 给一组包起别名,便于批量设级别,如把多个框架归入 web | 16.1 |
logging.structured.format.console | — | 结构化日志格式(如 ecs、logstash),输出 JSON 行 | 16.2 |
logging.structured.format.file | — | 写入文件时的结构化格式 | 16.2 |
logging.level.* 的键可以用包名,也可以用具体类名,粒度越细优先级越高。生产环境别把 root 调到 DEBUG——日志量会成倍增长,还会拖慢高并发路径。
logging.group.* 的用法是「先定义组、再给组设级别」:先声明 logging.group.web: com.example.book.web, org.springframework.web,之后就能写 logging.level.web: debug 一次性调好几个包。它比逐行写多组 logging.level.* 更好维护,排查完记得改回 INFO。
logging.pattern.console 里几个常用占位符值得记住:%d 时间、%level 级别、%logger logger 名、%msg 消息、%clr 着色、%wEx 换行异常。默认格式已经够用,只有对接日志采集规范时才需要自定义;改了格式要同步检查采集端的解析规则。
B.7 Web 资源与静态资源
spring.web.resources.* 与 spring.mvc.*。静态资源的映射规则、缓存头都在这里。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
spring.web.resources.static-locations | classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/ | 静态资源查找位置,按顺序匹配 | 11.1 |
spring.mvc.static-path-pattern | /** | 静态资源的 URL 匹配模式;改它会同时影响所有静态映射 | 11.1 |
spring.web.resources.cache.cachecontrol.max-age | — | 响应缓存有效期,如 1h;未设置则不发送该头 | 11.1 |
spring.web.resources.cache.cachecontrol.cache-public | — | 是否允许共享缓存 | 11.1 |
spring.web.resources.cache.cachecontrol.no-cache | — | 是否要求每次校验缓存 | 11.1 |
spring.web.resources.cache.cachecontrol.must-revalidate | — | 缓存过期后是否必须回源校验 | 11.1 |
spring.web.resources.add-mappings | true | 是否注册默认的静态资源处理器 | 11.1 |
spring.web.resources.chain.enabled | false | 是否启用资源链(指纹、版本化) | 11.1 |
spring.web.resources.chain.strategy.content.enabled | false | 是否用内容哈希做资源指纹,配合缓存头实现「内容变才失效」 | 11.1 |
spring.web.resources.cache.period | — | 缓存的简化写法,等价于设 max-age | 11.1 |
一个常被忽略的细节:static-locations 的匹配是按声明顺序的,/static/ 排在 /public/ 前,同名文件以先命中的为准。缓存相关的属性属于「组」,要么整组不写,要么一次配全,否则默认会带上 no-cache。
chain.strategy.content.enabled 打开后,静态资源的 URL 会被改写成带内容哈希的形式(如 app-4f8a1c.js),文件名一变浏览器就会重新拉取,可以放心把 max-age 设得很长。它是「强缓存 + 指纹」这套组合在 Spring Boot 里的开箱实现。
B.8 校验与消息转换
Bean Validation 的自动配置没有可调属性——只要 classpath 上有 spring-boot-starter-validation,@Valid 就生效。需要配置的主要是错误响应形态与消息转换。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
spring.mvc.problemdetails.enabled | false | 开启后框架错误统一转成 RFC 7807 的 ProblemDetail 响应 | 10.3 |
spring.mvc.throw-exception-if-no-handler-found | false | 找不到处理器时抛异常而非返回默认 404,便于统一处理 | 10.1 |
spring.mvc.contentnegotiation.favor-parameter | false | 允许用请求参数(默认 format)指定响应媒体类型 | 8.3 |
spring.mvc.format.date | — | 全局日期格式,影响 @DateTimeFormat 的默认解析 | 9.1 |
spring.mvc.format.date-time | — | 全局日期时间格式 | 9.1 |
校验注解本身不做转换——自定义消息、嵌套校验、分组校验都是代码层能力,配置项只能调默认格式。消息转换器(把对象写成 JSON、把 JSON 读成对象)的定制同样在代码里注册,见 10.3 。
B.9 Actuator
需要 spring-boot-starter-actuator。4.x 的一处行为变化务必记住:liveness / readiness 探针默认启用。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
management.endpoints.web.exposure.include | health | 通过 HTTP 暴露的端点列表,逗号分隔或 * | 18.3 |
management.endpoints.web.exposure.exclude | — | 在 include 基础上再排除某些端点 | 18.3 |
management.endpoints.web.base-path | /actuator | 端点统一前缀 | 18.3 |
management.endpoint.health.show-details | never | 健康检查是否返回组件明细;可设 when-authorized | 18.3 |
management.endpoint.health.show-components | — | 是否列出健康组件,取值 always / when-authorized / never | 18.3 |
⚠ management.endpoint.health.probes.enabled | 4.x 默认 true | 是否启用 liveness / readiness 探针;4.x 默认开启,设 false 关闭 | 18.3 |
management.server.port | 与主端口相同 | 让管理端点跑在独立端口,便于网络隔离 | 18.3 |
management.info.env.enabled | false | 是否把 info.* 属性暴露到 /actuator/info | 18.3 |
management.endpoints.enabled-by-default | true | 端点的总开关;关掉后逐个启用 | 18.3 |
management.endpoint.health.probes.add-additional-paths | false | 是否把探针也挂到 /health/liveness 等额外路径 | 18.3 |
探针默认开启意味着 /actuator/health/liveness 与 /actuator/health/readiness 开箱可用,容器编排的健康检查可以直接指向它们;但如果你不想要这两个端点,记得显式关闭。暴露端点时遵循最小化原则:exposure.include 只列真正需要的,* 只应出现在内网且已做鉴权的场景。
生产环境还要注意:Actuator 端点默认不带鉴权,一旦暴露了 env、heapdump 这类敏感端点又不加保护,等于把配置与内存内容公开。要么把管理端点放在独立端口并限制网络访问,要么接入 Spring Security 做访问控制。
B.10 Flyway
4.x 下 Flyway 必须显式引入 spring-boot-starter-flyway(3.x 只需 flyway-core),否则配置项写了也不会生效。
| 配置项 | 默认值 | 说明 | 详见 |
|---|---|---|---|
spring.flyway.enabled | true | 是否启用迁移 | 15.1 |
spring.flyway.locations | classpath:db/migration | 脚本搜索路径,逗号分隔多个 | 15.1 |
spring.flyway.baseline-on-migrate | false | 面对非空库时是否自动打基线 | 15.2 |
spring.flyway.baseline-version | 1 | 打基线时写入的起始版本 | 15.2 |
spring.flyway.validate-on-migrate | true | 迁移前校验已执行脚本的 checksum | 15.2 |
spring.flyway.table | flyway_schema_history | 历史表名;多应用共库时各自区分 | 15.1 |
spring.flyway.clean-disabled | true | 禁止 clean(会清空整个 schema),保持默认 | 15.1 |
spring.flyway.out-of-order | false | 是否允许补执行低版本脚本 | 15.2 |
spring.flyway.schemas | 默认 schema | 迁移作用的目标 schema,多 schema 场景需指定 | 15.3 |
spring.flyway.target | latest | 迁移到哪个版本为止,可用于灰度或回退到指定版本 | 15.2 |
spring.flyway.placeholders.* | — | 脚本里 ${key} 占位符的替换值,用于多环境参数化 | 15.3 |
多环境脚本靠 locations 多路径实现:公共脚本放 db/migration,H2 专用脚本放 db/migration/h2,按 profile 切换路径即可,细节见 15.3
。
placeholders.* 让同一份脚本能适配不同环境:脚本里写 CREATE SCHEMA IF NOT EXISTS ${schema};,再按 profile 给 spring.flyway.placeholders.schema 赋不同值。注意占位符替换默认开启,若 SQL 里本来就有 ${...} 语法(如某些数据库的字符串拼接),需要用 spring.flyway.placeholder-prefix 换掉前缀避免误替换。
B.11 3.x → 4.x 配置项变更对照表
下面这些是迁移时必须改的键名。改错前缀不会抛异常,只会静默失效——所以升级后要专门做一遍配置项审查。
| 3.x 属性 | 4.x 属性 | 说明 |
|---|---|---|
spring.jackson.read.* | spring.jackson.json.read.* | 反序列化特性前缀加 json 段 |
spring.jackson.write.* | spring.jackson.json.write.* | 序列化特性前缀加 json 段 |
spring.jackson.parser.* | spring.jackson.json.read.* | parser 相关并入 read |
| (无) | spring.jackson.find-and-add-modules | 新增,默认 true;Jackson 3 自动注册所有模块 |
| (无) | spring.jackson.use-jackson2-defaults | 新增逃生舱,配合 spring-boot-jackson2 模块 |
spring.data.mongodb.* | spring.mongodb.* | 仅「只需 driver」的那些属性改前缀 |
spring.session.redis.* | spring.session.data.redis.* | Spring Session 4.0 的属性调整 |
spring.dao.exceptiontranslation.enabled | spring.persistence.exceptiontranslation.enabled | 异常转换开关改名 |
@EntityScan(org.springframework.boot.autoconfigure.domain) | org.springframework.boot.persistence.autoconfigure.EntityScan | 注解包迁移,import 需同步改 |
| (无) | spring.datasource.connection-fetch | 4.1 新增,可取 lazy 惰性获取连接 |
两点补充。其一,@EntityScan 是注解而非配置项,但因为改包会导致编译失败,一并列在这里便于排查。其二,MongoDB 与 Session 的改动只涉及「由 driver 直接消费」的属性,Spring Data 层的高级配置键名不变,迁移时以官方元数据为准逐条比对。
迁移时最稳妥的做法是用工具而不是肉眼:升级依赖后,启动时加 --debug,或引入 Actuator 后访问 /actuator/configprops,把「已绑定但名字可疑」的项逐个核对。凡是写错前缀的属性,Spring Boot 不会报错——它只会被当成一个没人消费的陌生键,安静地留在配置文件里。
B.12 使用配置项的常见坑
| 现象 | 原因 | 处理 |
|---|---|---|
| 配置写了不生效 | 键名拼错或前缀是 3.x 旧名 | 用 IDE 的配置项补全,或对照 B.11 |
| 环境变量覆盖不了 yml | 环境变量名未按 SPRING_DATASOURCE_URL 规则转换 | 用 kebab-case 转大写下划线,见 6.3 |
| 换 profile 没变化 | spring.profiles.active 未设或被命令行覆盖 | 看启动日志第二行的实际 profile |
| 数值带单位解析失败 | max-age 等需要单位的项写了裸数字 | 补单位,如 1h、30s |
自定义 ObjectMapper 失效 | 4.x 改用 JsonMapper,旧 bean 不再接管 | 换成 JsonMapperBuilderCustomizer |
| Actuator 端点访问不到 | 端点未包含在 exposure.include 中 | 补进列表,或按需设 * |
| 敏感端点被公开 | 暴露了 env、heapdump 等又未鉴权 | 收紧 include 列表并接入安全组件 |
| 配置在本地生效、上线失效 | 环境变量或命令行覆盖了 yml | 用 /actuator/env 核对实际来源 |
| 单位写错导致解析失败 | 时长、容量类配置漏了单位 | 补上 ms / s / m / MB 等单位 |
B.13 配置项的组织与安全
配置项多起来之后,「写在哪、怎么分层、敏感值怎么放」比「某个键叫什么」更影响可维护性。
| 做法 | 说明 | 建议 |
|---|---|---|
| 按 profile 拆文件 | application-dev.yml、application-prod.yml | 通用项留在 application.yml,只把差异项放进各 profile |
用 spring.config.import 组合 | 把配置拆到多个来源再导入 | 比堆叠 profile 更好维护,4.1 起可为导入项指定编码 |
| 敏感值走环境变量 | 密码、密钥不写进仓库 | 用 SPRING_DATASOURCE_PASSWORD 之类注入 |
配置树 configtree: | 把目录下每个文件读成一个配置项 | 适合容器里以挂载卷注入密钥 |
| 外部化覆盖 | 命令行 > 环境变量 > 外部文件 > 打包内文件 | 上线用命令行或环境变量做最后覆盖 |
三条落地经验。其一,把「会随环境变化的项」与「不变的项」分开:spring.application.name、静态资源路径这类不动的写在主文件,数据源、日志级别这类随环境变的放 profile。其二,密码永远不进仓库——本地用 application-local.yml 并加进 .gitignore,生产用环境变量或配置中心。其三,spring.config.import 支持 optional: 前缀(如 optional:configtree:/etc/app/),目录不存在时不会让启动失败,适合「有则生效、无则跳过」的可选配置。
要确认最终生效值,最可靠的办法是引入 Actuator 后访问 /actuator/env 与 /actuator/configprops,它们会按优先级列出每个键的取值与来源,比反复改文件猜测快得多。
小结
本附录把常用配置项按服务器、应用、数据源、JPA、Jackson、日志、Web 资源、校验、Actuator、Flyway 十类整理成速查表。真正需要记住的是三件事:第一,server.* 与 spring.datasource.* 是上线前必审的项,端口、上下文路径、连接池上限直接影响可用性;第二,4.x 的 Jackson 配置前缀全面加 json 段,旧前缀静默失效,是迁移中最隐蔽的坑;第三,Flyway 在 4.x 需要独立 starter,配置项才生效。遇到报错再回到 附录 D
按症状定位,构建工具的写法差异见 附录 C
。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。