《Spring Boot 入门》附录 B:配置项速查

本附录把 Spring Boot 最常用的配置项按服务器、应用、数据源、JPA、Jackson、日志、Web 资源、校验、Actuator、Flyway 十类汇总成速查表,每项标注默认值、作用与对应正文小节,并附 3.x 到 4.x 的配置项迁移对照表,涵盖 Jackson 属性改名、MongoDB 与 Session 前缀调整等变更。

本篇目标:把 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.port8080内嵌 Tomcat 监听端口;设为 0 由系统随机分配,集成测试常用3.2
server.servlet.context-path/应用上下文路径;配成 /api 后所有映射前都多一层前缀8.1
server.shutdownimmediate关闭模式;改为 graceful 会等待在途请求完成,日志出现 GracefulShutdown 两行3.2
server.tomcat.threads.max200Tomcat 工作线程上限;threads.min-spare 控制保底线程数3.2
server.tomcat.max-connections8192允许的最大连接数3.2
server.error.include-messagenever错误响应是否包含异常 message;调试期可临时设 always10.1
server.forward-headers-strategy—反向代理后如何解析真实协议与主机,取值 native / framework3.2
server.compression.enabledfalse是否启用响应压缩;mime-types 控制压缩范围3.2
server.http2.enabledfalse是否启用 HTTP/2,需配合 TLS3.2
server.servlet.session.timeout30m会话超时时间,带单位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.nameapplication应用名;出现在日志、Actuator 与服务注册中,强烈建议显式设置1.1
spring.profiles.active—激活的 profile 列表,逗号分隔;启动日志会打印实际生效值6.1
spring.profiles.defaultdefault未显式激活任何 profile 时使用的兜底 profile6.1
spring.profiles.include—在当前 profile 之上再叠加的 profile 组6.1
spring.config.import—导入额外的配置文件或配置树;4.1 起可为导入项指定编码6.3
spring.config.nameapplication配置文件名(不含后缀);改它会连带改掉查找的文件名6.3
spring.main.banner-modeconsole启动横幅的显示方式,可设 off 关闭3.2
spring.main.allow-circular-referencesfalse是否允许 Bean 循环引用;默认禁止,不建议打开5.2
spring.main.lazy-initializationfalse是否全局延迟初始化;可加快启动但会推迟错误暴露5.3
spring.output.ansi.enableddetect控制台彩色输出开关,取值 always / never / detect16.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-size10连接池上限,最常调的一项12.1
spring.datasource.hikari.minimum-idle同 maximum-pool-size保底空闲连接数12.1
spring.datasource.hikari.connection-timeout30000 ms从池中获取连接的最长等待时间12.1
spring.datasource.hikari.idle-timeout600000 ms空闲连接被回收前的最长空闲时间12.1
spring.datasource.hikari.max-lifetime1800000 ms连接的最长存活时间,略小于数据库侧超时12.1
spring.datasource.hikari.pool-nameHikariPool-1连接池名,日志与监控里用于区分多数据源12.1
spring.datasource.hikari.auto-committrue是否自动提交;配事务时通常保持默认12.1
spring.datasource.hikari.leak-detection-threshold0(关闭)超过该毫秒数未归还连接就打印告警,排查泄漏很有用12.1
⚠ spring.datasource.connection-fetcheager4.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 或 none15.1
spring.jpa.show-sqlfalse是否把 SQL 打到控制台;只适合本地调试12.2
spring.jpa.open-in-viewtrue是否把 Session 延迟到视图渲染完;启动会警告,建议显式设 false13.1
spring.jpa.properties.*—原样透传给 JPA 提供者,例如 hibernate.format_sql12.2
spring.jpa.generate-ddlfalse是否在启动时生成 DDL;与 ddl-auto 配合使用15.1
spring.jpa.database-platform由连接推断方言;多数据源或特殊数据库时才显式指定12.2
spring.jpa.defer-datasource-initializationfalse是否把 data.sql 推迟到 JPA 初始化之后再执行15.3
spring.jpa.properties.hibernate.jdbc.batch_size15JDBC 批量写入大小,批量插入场景可调大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 的反序列化 Feature8.2
⚠ spring.jackson.json.write.*—序列化特性,对应 Jackson 的序列化 Feature10.3
⚠ spring.jackson.find-and-add-modulestrue4.x 新增:Jackson 3 自动注册 classpath 上所有模块,设 false 可回到只注册知名模块8.2
⚠ spring.jackson.use-jackson2-defaultsfalse4.x 逃生舱:配合 spring-boot-jackson2 模块,让 Jackson 3 用 Jackson 2 的默认行为8.2
spring.jackson.default-property-inclusion—全局序列化包含策略,如 non_null10.3
spring.jackson.time-zone—日期时间的默认时区10.3
spring.jackson.date-format—日期格式字符串10.3
spring.jackson.locale—序列化使用的 Locale10.3
spring.jackson.property-naming-strategy—全局属性命名策略,如 SNAKE_CASE10.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。
  • 自定义 ObjectMapper bean 不再能替换自动配置。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: debug16.1
logging.level.rootINFO根 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-816.1
logging.charset.file平台默认文件输出字符集16.1
⚠ logging.console.enabledtrue4.0 新增;设 false 可完全关闭控制台输出16.1
logging.group.*—给一组包起别名,便于批量设级别,如把多个框架归入 web16.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-locationsclasspath:/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-mappingstrue是否注册默认的静态资源处理器11.1
spring.web.resources.chain.enabledfalse是否启用资源链(指纹、版本化)11.1
spring.web.resources.chain.strategy.content.enabledfalse是否用内容哈希做资源指纹,配合缓存头实现「内容变才失效」11.1
spring.web.resources.cache.period—缓存的简化写法,等价于设 max-age11.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.enabledfalse开启后框架错误统一转成 RFC 7807 的 ProblemDetail 响应10.3
spring.mvc.throw-exception-if-no-handler-foundfalse找不到处理器时抛异常而非返回默认 404,便于统一处理10.1
spring.mvc.contentnegotiation.favor-parameterfalse允许用请求参数(默认 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.includehealth通过 HTTP 暴露的端点列表,逗号分隔或 *18.3
management.endpoints.web.exposure.exclude—在 include 基础上再排除某些端点18.3
management.endpoints.web.base-path/actuator端点统一前缀18.3
management.endpoint.health.show-detailsnever健康检查是否返回组件明细;可设 when-authorized18.3
management.endpoint.health.show-components—是否列出健康组件,取值 always / when-authorized / never18.3
⚠ management.endpoint.health.probes.enabled4.x 默认 true是否启用 liveness / readiness 探针;4.x 默认开启,设 false 关闭18.3
management.server.port与主端口相同让管理端点跑在独立端口,便于网络隔离18.3
management.info.env.enabledfalse是否把 info.* 属性暴露到 /actuator/info18.3
management.endpoints.enabled-by-defaulttrue端点的总开关;关掉后逐个启用18.3
management.endpoint.health.probes.add-additional-pathsfalse是否把探针也挂到 /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.enabledtrue是否启用迁移15.1
spring.flyway.locationsclasspath:db/migration脚本搜索路径,逗号分隔多个15.1
spring.flyway.baseline-on-migratefalse面对非空库时是否自动打基线15.2
spring.flyway.baseline-version1打基线时写入的起始版本15.2
spring.flyway.validate-on-migratetrue迁移前校验已执行脚本的 checksum15.2
spring.flyway.tableflyway_schema_history历史表名;多应用共库时各自区分15.1
spring.flyway.clean-disabledtrue禁止 clean(会清空整个 schema),保持默认15.1
spring.flyway.out-of-orderfalse是否允许补执行低版本脚本15.2
spring.flyway.schemas默认 schema迁移作用的目标 schema,多 schema 场景需指定15.3
spring.flyway.targetlatest迁移到哪个版本为止,可用于灰度或回退到指定版本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.enabledspring.persistence.exceptiontranslation.enabled异常转换开关改名
@EntityScan(org.springframework.boot.autoconfigure.domain)org.springframework.boot.persistence.autoconfigure.EntityScan注解包迁移,import 需同步改
(无)spring.datasource.connection-fetch4.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 。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「java」更多文章

  1. 《Spring Boot 入门》18.3 打包与运行
  2. 《Spring Boot 入门》18.2 实现
  3. 《Spring Boot 入门》18.1 需求与设计