SpringBoot项目中常见组件的配置属性

本文本的属性摘录自官方Properties配置清单,并附加了国内开发常用的框架配置属性。以国内WEB开发中,所涉及的常见组件为顺序组织配置清单

1. 配置属性清单

1.1 日志配置

序号 属性名 类型 用途 备注
1 debug bool 开启debug日志级别 仅在没有自定义logback的情况下有效
2 trace bool 开启trace日志级别 仅在没有自定义logback的情况下有效
3 logging.config string 日志配置文件的路径 比如,logging.config=classpath:logback.xml 就可以指定logback日志的xml配置文件路径
4 logging.file string 指定日志文件名 比如:logging.file=my-app.log
5 logging.path string 指定日志文件的目录 比如,logging.path=/var/log
6 logging.file.max-history number 日志文件最大存档数量 假如设置为10,表明最多保留10个日志文件,如果超过10个,则会删除旧的
该配置仅在没有自定义logback的情况下有效
7 logging.file.max-size string 单个日志文件的最大容量 如10MB,512KB等
该配置仅在没有自定义logback的情况下有效
8 logging.level.* string 指定某个logger的级别 假如要将所有spring组件的日志级别设置为debug,则可以这样配置:
logging.level.org.springframeword=debug
9 logging.group.* string 将多个logger分组 假如要将 org.springfraework 和 org.apache 两个 logger 合并为一组,名为 public,可如下配置:
logging.group.public=org.springfraework, org.apache
10 logging.pattern.console string 控制台日志样式设置 仅在没有自定义logback的情况下有效
11 logging.pattern.dateformat string 日志中的日期输出格式 如:yyyy-MM-dd HH:mm:ss.SSS
仅在没有自定义logback的情况下有效
12 logging.register-shutdown-hook bool 是否要在日志组件启动后,注册“系统退出”的回调函数
13 logging.pattern.level string 指定日志输出格式中,与日志等级相关的信息如何输出 默认值为:%5p
仅在没有自定义logback的情况下有效
涉及的格式字符如下:
 %p : 用一个字母来标识日志级别,例如D表示DEBUG,I表示INFO
 %5p :最多用五个字母的来标识日志级别,例如DEBUG或INFO.
 %.-5p :固定用五个字母的日志级别,如果不足五个字符则向左对齐,例如DEBUG或INFO
 %t :输出线程名称
 %c :输入Logger的名称(简单类名)
 %C :Logger的唯一名称(全限定类名)

要求:最多5个字母显示日志级别,并且包含线程名称和类名,其配置如下:
logging.pattern.level=%5p [%t] %c{1.} -
14 logging.exception-conversion-word string 指定如何输出异常对象 默认值为:%wEx
只能配置预定义的几种形式,如下所示:
 %wEx :完整堆栈轨迹,包括异常类、异常信息和详细堆栈跟踪
 %wEx{short} :简短堆栈轨迹,仅包括异常类和异常信息,省略详细堆栈跟踪
 %wEx{full} :完整堆栈轨迹,包括异常类、异常信息和详细堆栈跟踪
 %wEx{none} :不输出任何异常信息

上面提到的仅在没有自定义logback的情况下有效的说法并不严谨,但这种说法适合日常开发中的大多数情况。严格来讲,spring boot 启动后,有一套默认的logback配置,上述有此备注的属性,是单独针对这个默认的logback配置的。如果工程中还单独配置了logback, 则spring boot默认的logback就不载了。但依然可以在自己的logback配置中,把 spring boot 默认的日志配置加载进来,但几乎很少有项目这样做,或是不知道有此特性。

一份无需额外xml文件的配置样例(application.yml)
logging:
  file:  /app/your-app-name/logs/ota/your-app-log-file-name.log
  file.max-size: 100MB
  file.max-history: 30
  level:
    root: WARN
    org.springframework: INFO
    org.hibernate: INFO
    # 为业务工程的顶级包名,单独指定日志级别
    com.xxx.your-app-package: INFO
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{64} - %msg%n'
    file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{64} - %msg%n'

1.2 指定配置文件位置

配置文件的配置由两部分构成:目录 + 文件名,如: /etc/config/apps/application.yml 中, /etc/config/apps/ 为目录,application.yml 为文件名,因此相应的配置也分成这两部分

序号 属性名 类型 用途 备注
1 spring.config.name string 配置文件的文件名
2 spring.config.location string 配置文件的目录 可以指定多个目录,使用英文逗号(,) 分隔。通常目录由协议和路径构成,比如:
a. file:///etc/ : 代表文件系统目录,但由于太常用,可简写为/etc
b. classpath:/config : 代表jar包内部目录
c. http://config.com/config : 代表网络目录,这其实最常用,但通常由配置服务内部完成

特别说明:如果配置的内容不是一个目录,而是完整的文件名,则读取此文件
3 logging.config.additional-location string 附加的配置文件目录 同上,可以指定多个目录,使用英文逗号(,) 分隔,如:
logging.config.additional-location=/etc/config/extra,/var/config/extra
除了标准目录外,该参数指定的目录下的配置文件,也会被读取
4 spring.autoconfigure.exclude string 要排除的自动装配Java类 多个排除项用英文逗号分隔,比如:
spring.autoconfigure.exclude=com.alibaba.cloud.nacos.NacosConfigAutoConfiguration

部分新手会有个疑惑:property属性配置项,不是写在配置文件里边的么,我在配置文件里边再写“配置文件的目录和名称”感觉怪怪的,他能起作用吗?
当然仔细一推敲就会发现这个问题本身就有问题 😄 。这涉及到 spring boot 启动时应该去哪里读取配置属性的问题。
很明显,配置文件的位置就是根据上面3个属性指定的。有趣的是,上面3个属性也是 properties 的一部分,可是现在都还没有加载和读取配置文件,哪里来的 properties 呢?此时的 properties 应该是为空的。

没错,此时确实还没加载配置文件,那么上面的3个属性从哪里获取的呢?这是3个特殊的配置属性,它不来自配置文件,而是来自程序默认值 或 启动程序时的命令行参数Java系统属性操作系统环境变量

比如有一个名为my-app.jar的spring boot程序:

  • java -jar my-app.jar
    配置文件为classpath:/application.yml 或 classpath:/application.properties

  • java -jar my-app.jar --spring.config.location=/etc/config
    配置文件为 /etc/config/application.yml 或 /etc/config/application.properties

  • java -Dspring.config.location=/etc/config -jar my-app.jar
    配置文件为 /etc/config/application.yml 或 /etc/config/application.properties

这也是一个十分常见的范式,比如:不同于其它进程的守护进程,不同于其它用户的“超级管理员”,docker中不同于其它进程的“1号管理进程”

1.3 Boot应用程序自身的配置

序号 属性名 类型 用途 备注
1 spring.application.name string 应用程序的名字 在 Cloud 环境下,也是微服务的名字
2 spring.application.admin.enabled bool 是否开启管理功能 默认值:false
开启此选项后,SpringBoot 将开放后台管理的RESTFull接口,用于查看健康状态、环境配置、线程等信息
可访问 /acuator 来查看以上信息
3 spring.application.admin.jmx-name string 远程管理的 MBean 名称 默认值为:org.springframework.boot:type=Admin,name=SpringApplication
4 spring.main.sources string Boot应用程序的资源文件或目录 所谓资源,是指 ApplicationContext要加载的类名、包、或基于 Xml 配置的Bean定义文件
比如:在application.properties文件中有如下配置:
 spring.main.resources=vip.guzb.MyApplication,com.eastknight.config
上述配置指明SpringBoot引导时,将MyApplication作为启动类,并加载com.eastknight.config包下的配置

SpringBoot程序启动时,首先是去找资源文件,然后根据boot约定的规则读取资源文件,并根据文件中组件的装配要求加载组件
因此,也可以通过命令行参数来指定这个配置项,比如:
 java -jar my-app.jar --spring.main.resources=vip.guzb.MyApplication
5 spring.main.banner-mode string 启动时的banner信息 默认值为 console, 取值列表如下:
 off : 禁用banner功能
 console : 将 banner 内容输出到命令行窗口
 log : 将 banner 内容输出到应用程序的日志中

还可以通过编程的方式来细粒度地设置banner
6 spring.main.web-application-type string 指定 web 应用的类型 支持以下三种内容:
 SERVLET : 即常见的基于阻塞式IO模型的Web服务
 REACTIVE : 适用于高并发、高吞吐量的,基于异步IO模型的反应堆式Web应用程序,在Spring当前的体系中,就是WebFlux
 NONE : 非WEB应用程序,例如批处理任务或后台作业

如果不明确指定应用类型,Spring Boot 会根据 classpath 下的类和已加载 Configuration 进行推定
7 spring.main.register-shutdown-hook bool 应用程序是否注册“系统退出”回调 默认值:true
8 spring.main.allow-bean-definition-overriding bool 是否允许重复定义Bean 默认值:false
如果为true, 则允许在读取“Bean定义”期间,出现多个相同名称的Bean定义,后加载的覆盖先加载的。

1.4 服务器配置

1.4.1 服务器基础配置

序号 属性名 类型 用途 备注
1 server.port number 网络监听端口 默认值:8080
2 server.address string 服务器监听的网络地址 有以下三种设置类型
空值 : 这也是默认值,表示绑定当前主机所有可用的网络地址
具体的IP地址 :如192.168.10.125
主机名 :如 vip.guzb
3 server.server-header string HTTP 响应头中“Server”字段的内容 如:Tomcat 10.1.11
4 server.max-http-header-size string HTTP 响应头的最大内容大小 默认为 8KB
5 server.use-forward-headers bool 是否使用X-Forwarded-*转发的头部信息 默认为 false , 这表头Jetty默认不使用代理服务器转发的头信息
6 server.compression.enabled bool 是否开启响应(response)压缩 默认值:false
多数生产环境的 spring boot Web应用程序,其http请求都会经过 nginx 转发,nginx 默认会对响应数据进行压缩
7 server.compression.excluded-user-agents string 指定不压缩响应数据的客户端名称 多个客户端用英文豆号分隔,比如:
apache http client,edage 112.0.1722.48,chrome 114.0.5735.110
8 server.compression.mime-types string 对哪些MIME类型的内容进行压缩 如:text/html,text/plain,text/css,text/javascript,application/json
9 server.compression.min-response-size string 超过多少体积的内容才进行压缩 如:2KB
10 server.error.include-exception bool 错误页面的内容是否包含异常 默认为 false
11 server.error.include-stacktrace bool 错误页面的内容是否包含异常堆栈 默认为false 或 never
12 server.error.path string 错误页面对的Web Controller 路径 默认为 /error
13 server.error.whitelabel.enabled bool 是否开启默认的错误信息显示页面 默认为 true
14 server.connection-timeout number Web服务器的网络连接器接收下一个Http请求的最大等待时长 单位:毫秒,默认行为是取具体服务器(如tomcat、jetty)的Connector默认值
设置为 -1 代表可无限等待
15 server.http2.enabled bool 是否支持 HTTP2 协议 默认为 ture, 当前使用最多的还是 HTTP 1.1
16 server.ssl.enabled bool 是事支持 SSL 协议 默认为 ture, 但实践中,更多将SSL配置到了 nginx 上
17 server.ssl.enabled-protocols string 支持的 SSL 协议清单 多个协议用英文逗号分隔,常见的 SSL/TLS 协议版本如下:
1. SSLv3 :已经过时且不推荐使用,存在多个安全漏洞
2. TLSv1.0 / TLSv1.1 :较老的协议版本,已经被广泛认为不够安全
3. TLSv1.2 :当前广泛使用的安全协议版本
4. TLSv1.3 :最新的 TLS 协议版本,提供更强的安全性和性能改进
18 server.ssl.protocol string 服务器使用的 SSL 协议 默认为 TLS
19 server.ssl.ciphers string SSL 协议的加密套件 多个加密套件用英文逗号分隔,最常用的加密套件如下:
1. AES(Advanced Encryption Standard):一种对称加密算法,包括 AES128、AES256 等不同密钥长度
2. DES(Data Encryption Standard):一种早期的对称加密算法,已经被 AES 取代
3. RSA(Rivest, Shamir, Adleman):一种非对称加密算法,用于密钥交换和数字签名
4. SHA(Secure Hash Algorithm):哈希算法,用于生成消息摘要,包括 SHA-256、SHA-384 等不同摘要长度
4. ECDHE(Elliptic Curve Diffie-Hellman Ephemeral):一种基于椭圆曲线的密钥交换算法,提供前向安全性
20 server.ssl.client-auth string SSL的客户端认证模式 默认为none, 取值列表如下:
1. none : 服务器不要求客户端进行身份验证,并且可以继续建立连接
2. want : 服务器希望客户端提供有效的证书进行身份验证,但即使客户端没有提供证书,连接也会继续建立
3. need : 服务器要求客户端提供有效的证书进行身份验证。如果客户端没有提供有效的证书,连接将被终止
22 server.ssl.key-alias string 指定密钥在服务器密钥库中的别名
22 server.ssl.key-password string 服务器访问密钥时所需的密码
23 server.ssl.key-store string 指定服务器中 SSL/TLS 密钥库的路径
24 server.ssl.key-store-password string 服务器访问 SSL/TLS 密钥库时所需的密码
25 server.ssl.key-store-provider string SSL/TLS 密钥库供应商的名称 实际上就是密钥库程序的名称,主要有 SUN 和 BC (Bouncy Castle)
26 server.ssl.key-store-type string SSL/TLS 密钥库的类型 默认为:JKS,密钥类型用于定义如何存储密钥,常用的类型有:
1. JKS :Java KeyStore 是 Java 平台默认的密钥库类型
2. PKCS12 :基于 RSA 公钥加密标准(PKCS)#12 的密钥库类型
3. BKS :Bouncy Castle 密钥库类型
4. UBER :BC-FKS,Bouncy Castle 密钥库类型的兼容版本
27 server.ssl.trust-store string 信任密钥库的位置
28 server.ssl.trust-store-password string 访问信任密钥库的密码
29 server.ssl.trust-store-provider string 信任密钥库的程序提供商 同 server.ssl.key-store-provider
30 server.ssl.trust-store-type string 信任密钥库的的类型 同 server.ssl.key-store-type
31 server.netty.connection-timeout number netty通道的连接超时时长 单位:毫秒。仅当Servlet服务器的网络部分使用Netty时有效

1.4.2 Tomcat 服务器配置

序号 属性名 类型 用途 备注
1 server.tomcat.basedir string Tomcat运行时使用的根目录 配置、日志、临时文件等资源的位置,默认为空,一般情况下不设置该属性
2 server.tomcat.uri-encoding string URL的编码类型 默认为:UTF-8
3 server.tomcat.accept-count number 最大请求的排队数 默认为 100
当所有处理请求的线程均处于忙碌状态时,后续请求将进入队列。如果队列也已满,则拒绝连接
4 server.tomcat.max-connections number 最大请求连接数 默认为 10000
5 server.tomcat.max-threads number 最大工作线程数 默认为 200
工作线程即具体执行Web请求的线程
6 server.tomcat.min-spare-thread number 最小工作线程数 默认为 10
7 server.tomcat.max-swallow-size number 单个请求可接收的最大消息体大小 默认为 2M
8 server.tomcat.remote-ip-header string 获取原始请求客户端IP的HTTP Header字段名 在业务代码中,可以通过 request.getRemoteAddr() 方法获取请求端的地址信息。
但Tomcat是如何保证这个方法获取到的地址是真实的请求客户端的地址呢,如果中间经过nginx代理服务器转发呢?
方法是通过读取http header中的字段,通常代理服务器都会将他所代理的请求客户端的IP写到header的某个字段中,不同的代理服务器,使用的字段名可能不同,但最常见的是以下两个:
1. X-Forwarded-For
2. X-Real-IP
9 server.tomcat.protocol-header string 读取原始请求客户端 http 协议名的header字段 用途同上,tomcat从header的这个字段名上读取原始的http协议名
该字段名通常为:X-Forwarded-Proto
10 server.tomcat.resource.cache-ttl number 静态资源文件的缓存时长 单位:秒,静态资源如:.css 、.js 、.jpg 等文件
11 server.tomcat.use-relative-redirects bool 重定向折url是否使用相对地址 默认为 false
如果访问请求经过了中间代理,使用绝对地址的话,会出现无法访问的问题
12 server.tomcat.background-processor-delay number Tomcat 后台任务处理器的执行间隔 单位:秒
如清理session 、异步调用等后台操作
13 server.tomcat.additional-tld-skip-patterns string 设置要忽略的TLD处理Jar包的名称样式 满足名称样式的TLD jar包将不被加载,以提高性能
TLD(Tag Library Descriptor) 标签库描述符是早期 JSP 体系的一种处理标签的Java库,在前后端分离的应用中,它已经没有用武之地了
14 server.tomcat.internal-proxies string 内部代理的IP地址样式 是一个正则表达式
示例:10\.\d{1,3}\.\d{1,3}\.\d{1,3}
当客户端的IP地址匹配该样式时,被认定为是内部代理服务器的地址,因此它不是真实的客户端IP地址,Tomcat 将通过从header中读取字段等方法来尝试获取真实的客户端IP地址

默认值:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|\192\.168\.\d{1,3}\.\d{1,3}|\169\.254\.\d{1,3}\.\d{1,3}|\127\.\d{1,3}\.\d{1,3}\.\d{1,3}|\172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|\172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|\172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}\0:0:0:0:0:0:0:1\::1
15 server.tomcat.redirect-context-root bool 是否在重定向URL上添加应用上下文路径 默认值为 true
对于 SpringBoot 这种基于内嵌 Tomcat 形式的程序,可忽略此特性

Tomcat 标准的 Servlet 容器,它支持同时部署多个 Web 应用,每个应用都有各自的应用上下文。体现在URL上就是前缀,比如部署了两个应用,分别是 shop 和 order, 如果它们都提供了address接口,则访问应用时,就需要加上下文前缀,变成了 /shop/address 和 /order/address。
如果在shop应用中返回了一个到order应用的重定向地址 /order/details, 如果 server.tomcat.redirect-context-root=true, 则实际返回的重向地址为:/shop/order/details
16 server.tomcat.accesslog.enabled bool 是否开启访问日志记录 默认为 false
17 server.tomcat.accesslog.directory string 访问日志的存放目录 默认为 logs
如果是相对目录,则相对的是批tomcat的主目录,也可以指定绝对路径
18 server.tomcat.accesslog.buffered bool 是否缓存访问日志,以定期批量刷新 默认为 true
19 server.tomcat.accesslog.prefix string 日志文件名的前缀 默认为 access_log.
20 server.tomcat.accesslog.suffix string 日志文件的后缀名 默认为 .log
21 server.tomcat.accesslog.file-date-format string 访问日志文件名中的日期格式 默认为 .yyyy-MM-dd, 实际效果就是日志文件的动态中缀
22 server.tomcat.accesslog.pattern string 访问日志内容格式 默认为:common
common是一个预定义好的格式别名,真实的格式是由一系列格式字符组成的,如:%h %l %u %t "%r" %s %b

1. %a : 远程IP地址
2. %A : 本地IP地址
3. %b :发送的字节数,不包括HTTP头,没有发送字节就显示为 -
4. %B : 发送的字节数,不包括HTTP头
5. %h : 远程主机名
6. %H : 请求协议
7. %l : (是小写的L)远程逻辑从identd的用户名(总是返回 - )
8. %m : 请求方法
9. %p : 本地端口
10. %q : 查询字符串(如果有查询参数的话,会在前面加 ? 字符,反之为空)
11. %r : 第一行的要求
12. %s : 响应的HTTP状态代码
13. %S : 用户会话ID
14. %t : 日期和时间,在通用日志格式
15. %u : 远程用户身份验证
16. %U : 请求的URL路径
17. %v : 本地服务器名
18. %D : 处理请求的时间(以毫秒为单位)
19. %T : 处理请求的时间(以秒为单位)
20. %I :(是大写的i)当前请求的线程名称
23 server.tomcat.accesslog.rename-on-rotate bool 是否通过重命名当前日志文件的方式来存档当前日志 默认为 false
tomcat 会根据时间和当前日志文件大小,判定是否应该将当前日志存档

1.4.3 Undertow 服务器配置

序号 属性名 类型 用途 备注
1 server.undertow.buffer-size string 请求和响应的缓冲区大小 如:2MB,512KB 等,纯数字的话,单位为字节
2 server.undertow.direct-buffers bool 是否在 JVM 的堆外直接申请缓冲内存 默认是不申请堆外缓冲内存的
3 server.undertow.eager-filter-init bool 是否在启用时加载 Servlet 过滤器 默认为 false
这样可快速启动应用,只有当收到真实请求后,才会初始化 Servlet 过滤器
4 server.undertow.io-threads number 接收Web请求的主线程数 默认为操作系统CPU核心数,主线程只负责接收请求,不负责处理请求,处理请求的是工作线程
5 server.undertow.worker-threads number 处理Web请求的工作线程数 默认为IO线程数(server.undertow.io-threads)的8
6 server.undertow.max-http-post-size number Post请求的body最大负载量 默认为 -1B
可以是一个纯数字,也可以是数字+单位,如:10MB、512KB等。
-1 代表body大小不受限制
7 server.undertow.no-request-timeout number 关闭连接的最大空闲时间 单位:毫秒
当一个WEB连接建立后,却不发送任何后续请求时,该连接处于空闲状态,当这个空闲时长达到指定长度后,连接会被关闭
8 server.undertow.accesslog.dir string 访问日志的目录
9 server.undertow.accesslog.enabled bool 是否开启访问日志记录 默认为 false
10 server.undertow.accesslog.pattern string 访问日志的内容格式 默认为 common,它的配置格式与 server.tomcat.accesslog.pattern 一样
11 server.undertow.accesslog.prefix string 访问日志文件名的前缀 默认为 access_log.
12 server.undertow.accesslog.suffix string 访问日志文件名的后缀 默认为 .log
13 server.undertow.accesslog.rotate bool 是否开启日志文件的轮转功能 默认为 false
轮转功能是指:当日志的内容大小和日期达到一定要求后,将该部分日志切割成一个单独的文件存档

1.4.4 Jetty 服务器配置

序号 属性名 类型 用途 备注
1 server.jetty.acceptors number 接收WEB请求的接收器(线程)数量 默认为 -1
-1 表示请求接收器的数量将根据操作系统的的硬件特性而定,通常是CPU核心数的一多半
2 server.jetty.selectors number 处理WEB请求的选择器(线程)数量 默认为 -1
-1 表示请求选择器的数量将根据操作系统的的硬件特性而定
3 server.jetty.max-http-post-size number Http Post 请求的body部分的最大容量 默认为 200000 字节
4 server.jetty.connection-idle-timeout number 关闭连接的最大空闲时间 单位:毫秒
当一个WEB连接建立后,却不发送任何后续请求时,该连接处于空闲状态,当这个空闲时长达到指定长度后,连接会被关闭
5 server.jetty.accesslog.enabled bool 是否开启访问日志的记录功能 默认为 false
6 server.jetty.accesslog.append bool 是否以“追加”方式记录访问日志 默认为 false
这里的“追加”是指服务器启动后,新的日志将在原来(启动前)的日志文件上追加新日志。如果为false, 则会直接覆盖旧的日志内容。但本次运行期间产生的日志内容,并不会存在覆盖一说
7 server.jetty.accesslog.date-format string 设置记录访问日志的日期格式 默认为 dd/MMM/yyyy:HH:mm:ss Z
8 server.jetty.accesslog.extended-format bool 是否启用访问日志的扩展记录格式 默认为 false,
扩展格式会记录更多的客户端信息
9 server.jetty.accesslog.filename string 访问日志的文件名 默认为 access.log
多数日志文件名配置都支持以下配置约定:
1. 仅指定文件名:日志文件将保存在服务器的工作目录中, 如:server.jetty.accesslog.filename = access.log
2. 指定相对路径: 相对路径依然针对的是服务器工作目录,如:server.jetty.accesslog.filename = logs/access.log 会将日志文件保存在 logs 目录下
3. 指定绝对路径: 直接指定完整的文件路径,如:server.jetty.accesslog.filename = /var/log/myapp/access.log
10 server.jetty.accesslog.locale string 指定访问日志的Locale 默认为操作系统的locale
11 server.jetty.accesslog.log-cookies bool 是否记录Web请求的 cookie 信息 默认为 false
12 server.jetty.accesslog.log-latency bool 访问日志中,是否记录请求的处理时间(延迟时间) 默认为 false
处理时间是指 request -> response 之间的时长
13 server.jetty.accesslog.log-server bool 访问日志,是否记录请求端的主机名 默认为 false

1.4.5 Servlet 配置

序号 属性名 类型 用途 备注
1 server.servlet.context-path string 设置Servlet服务的请求上下文路径 从使用上讲,就是在请求这个Servlet的时候,需在url上加前缀,前缀内容就是这个context-path
2 server.servlet.context-parameters.* string 添加ServletContext的初始化参数 对应于传统web.xml配置中的<init-param>标签,比如有这面这样一组初始化参数:
<init-param>
  <param-name>email</param-name>
  <param-value>east-knight@codefate.net<param-value>
<init-param>
这组标签通过spring property 来配置的话,结果如下:
server.servlet.context-parameters.email=east-knight@codefate.net
3 server.servlet.application-display-name string 整个Servelt应用的名称 该名称通常显示在相应的Servlet容器(服务器)的管理页面中,业务开发中使用不到
4 server.servlet.jsp.class-name string 处理 JSP 视图的类名 JSP 是一种视图模板技术,在模板中可以让代码与html标签混合使用,它是Servlet的一种升级使用方式。原始的 Servlet 只提供了向 Reponse 中写入字符串或数据流的底层功能
5 server.servlet.jsp.init-parameters.* string 为JSP Servelt指定初始化参数 与 server.servlet.context-parameters.* 类似
6 server.servlet.jsp.registered bool 指定JSP Servlet 是否已经注册了 默认为 true
7 server.servlet.session.cookie.name string 会话 Cookie 的名称
8 server.servlet.session.cookie.comment string 为会话 Cookie 设置注释
9 server.servlet.session.cookie.domain string 设置会话 Cookie 适用的域名 如果指定了域名,则只会对来自该域名的客端才能读取cookie
10 server.servlet.session.cookie.path string 指定哪些 path 开始会话 Cookie 比如指定 server.servlet.session.cookie.path=/user , 则只有 /user 开头的页面脚本才能读取 cookie
11 server.servlet.session.cookie.http-only bool 是否开启cookie的http-only特性 如果开启,页面脚本无法读取cookie. 事实上在前后分离架构下,已经不使用cookie了
12 server.servlet.session.cookie.secure bool 是否仅在https协下开启 Cookie 默认为 false
13 server.servlet.session.cookie.max-age number 会话 cookie 的最大存活时长 单位:秒。如果不指定,则关闭浏览器后自动过期
14 server.servlet.session.timeout number 会话的过期时长 默认为 30m, 即30分钟,如果不指定时间单位后缀,则默认为单位为:秒
15 server.servlet.session.tracking-modes string 会话的跟踪模式 即如何实现session的ID传递,可以配置多个会话跟踪模式,它们之间使用英文逗号分隔。支持的模式有:
1. COOKIE : 通过客户端cookie跟踪,会话ID保存在Cookie中
2. URL : 通过URL跟踪,会话ID保存在URL的Query参数中
3. SSL : 要求在安全连接(HTTPS)下才能创建会话
1. NONE : 禁用会话追踪,会话标识符不会被创建或传输
16 spring.servlet.multipart.enabled bool 是否启用多部件上传功能 默认为 true
17 pring.servlet.multipart.file-size-threshold number 设置写入磁盘的文件大小阈值 默认为 0, 单位:字节。当上传文件大小超该阈值时,会将文件写入到磁盘
18 spring.servlet.multipart.location string 上传文件的临时保存位置
19 spring.servlet.multipart.max-file-size number 单个文件的最大容量 默认为 1M
20 spring.servlet.multipart.max-request-size number 多部件 http 请求的最大容量 默认为 10M
21 spring.servlet.multipart.resolve-lazily bool 是否延迟解析多部件消息体 默认为 false
如果设置为true, 则只有程序中真实调用了获取部件体内容的方法时,才会去解析 ,这可以提高性能

1.5 数据源配置

1.5.1 默认JDBC配置

序号 属性名 类型 用途 备注
1 spring.datasource.name string 数据源名称 当使用内存数据库时,默认名称为 testdb
2 spring.datasource.jndi-name string 数据源的JNDI名称
3 spring.datasource.generate-unique-name string 是否随机生成一个数据源的名称 默认为 false
4 spring.datasource.username string 连接数据库的用户名
5 spring.datasource.password string 连接数据库的密码
6 spring.datasource.type string 数据源(连接池)的类型 所谓类型,即数据源(连接池)的全限定类名,如:com.alibaba.druid.pool.DruidDataSource 。默认情况下,spring boot 会从classpath中自动探测
7 spring.datasource.url string JDBC连接的URL
8 spring.datasource.driver-class-name string JDBC连接的驱动类名 必须是驱动类的全限定名,如:com.mysql.cj.jdbc.Driver 。默认情况下,spring boot 会根据 url 自动探测一个合适的 jdbc 驱动
9 spring.datasource.schema string 指定数据库模式名称 schema 在不同数据库产品中的语义是不一样的,在mysql中,它就是一个database, 很多用户都可以操作它。在oracle中,schema是一个用户的数据库资源存储空间,仅属于该用户,在mssql中又不一样
10 spring.datasource.schema-username string 数据库模式对应的用户名 a. 在mysql中:此项无意义
b. 在oracle中,用户名与数据库schema名称保持一致
c. 在mssql中,代表某个schema下的用户名
d. 在postgresql中,与mssql一致
11 spring.datasource.schema-password string 数据库模式下个用户的密码 a. 在mysql中:此项无意义
b. 在oracle中,代表schema的密码
c. 在mssql中,代表某个schema下,某个用户的密码
d. 在postgresql中,与mssql一致
12 spring.datasource.separator string 初始化SQL脚本中,语句间的分隔符 默认为 ;
13 spring.datasource.sql-script-encoding string 初始化SQL脚本的编码
14 spring.datasource.initialization-mode string 数据源的初始化模式 默认为 embedded, 模式名称列表如下:
1. always : 无论数据库是否已被初始化,每次应用程序启动都会执行初始化脚本
2. embedded : 仅在嵌入式数据库(如H2、HSQL等)被使用且数据库文件不存在时执行初始化操作。如果数据库文件已存在,则不进行任何初始化操作
3. never : 从不执行初始化操作。无论数据库是否已被初始化,应用程序启动时都不会执行任何初始化脚本
4. unrecognized : 未识别的模式。如果指定了一个无效的模式值,将抛出异常
15 spring.datasource.data string 数据源的表数据初始化脚本 如: classpath: config-init-data.sql
16 spring.datasource.data-username string 执行初始化数据SQL脚本的用户名 即执行上面这个data文件的数据库用户名
17 spring.datasource.data-password string 执行初始化数据SQL脚本的密码 即执行上面这个data文件的数据库密码
18 spring.datasource.platform string 数据库平台(产品)名称 默认为 all
支持的数据库平台有:all、h2、oracle、mysql、mssql、postgresql、derby
19 spring.datasource.jmx-enabled bool 是否开启JMX功能 开启后,可通过 JConsole、VisualVM 工具查看数据源的内部状态
20 spring.datasource.xa.properties string XA数据源的扩展属性 这只是一个扩展属性的前缀,属性的配置依然是key value 键值对的形式, 如username、password 等
21 spring.datasource.xa.data-source-class-name string XA数据源的驱类全限定名称
22 spring.datasource.continue-on-error bool 初始化脚本执行错误时,是否继续执行 默认为 false

1.5.2 Apache DBCP 数据源配置

序号 属性名 类型 用途 备注
1 spring.datasource.dbcp2.default-auto-commit bool 是否默认为自动提交 默认为 false
2 spring.datasource.dbcp2.default-read-only bool 是否默认为只读连接 默认为 false
3 spring.datasource.dbcp2.default-transaction-isolation int 默认的隔离级别 默认为 -1 ,代表未设置 ,有以下值可设置:
1. NONE(0): 不支持事务
2.READ_UNCOMMITTED(1): 读未提交。允许脏读、不可重复读和幻读
3.READ_COMMITTED(2): 读已提交。防止脏读,但是仍允许不可重复读和幻读
3.REPEATABLE_READ(4): 可重复读。防止脏读和不可重复读,但是仍允许幻读
4.SERIALIZABLE(8): 串行化。最高的隔离级别,防止脏读、不可重复读和幻

由于是int类型,因此,只能设置为括号中的数字,而不是常量串。这些常量串定义在 java.sql.Connection 中

注:通常情况下,数据源属性仅在创建连接工厂实例前有效,但这些以 default 头的属性例外,他们只是预设了 JDCBC 连接中部分特性的默认值,但这些特性是可以在运行期动态设置的,比如隔离级别。那些在连接工厂创建以后就不能再修改的属性,都是描述连接池自身特性的,而非描述 JDBC 连接的特性
4 spring.datasource.dbcp2.default-query-timeout-seconds integer 默认的查询超时秒数
5 spring.datasource.dbcp2.default-catalog string 默认连接的catalog 多数关系型数据库均没有实现 catalog 这个概念
6 spring.datasource.dbcp2.default-schema string 默认连接的schema 对于mysql而言,schema 与 database 是等效的
对于oracle 和 postgresql, schema 在database层级之下
7 spring.datasource.dbcp2.cache-state bool 连接池中的连接是否缓存状态 默认为 true
8 spring.datasource.dbcp2.lifo bool 从连接池中获取连接的方式是否为后进先出 默认为 true
LIFO: 即 Last In First Out, 向池中申请连接时,将优先选择最后归还到池中的连接
FIFO: 即 First In First Out, 与LIFO正好相反,申请连接时,它将按照连接入池的顺序来选择
9 spring.datasource.dbcp2.initial-size int 连池的初始连接数 默认为 0
10 spring.datasource.dbcp2.max-total int 最大连接数,指定连接池中同时可从数据库分配的最大活动连接数 默认为 8
11 spring.datasource.dbcp2.max-idle int 最大空闲连接数,指定连接池中保持的最大空闲连接数 默认为 8
12 spring.datasource.dbcp2.min-idle int 最小空闲连接数,指定连接池中保持的最小空闲连接数 默认为 0
13 spring.datasource.dbcp2.max-wait-millis int 连接等待超时时间,指定在连接池耗尽时,再次请求连接的最大等待时间 单位:毫秒,默认为 -1,表示无限等待
14 spring.datasource.dbcp2.validation-query string 用于验证连接是否有效的SQL查询语句 默认为 null
当校验 sql 为 null 时,连接的校验逻辑是执行 Connection.isValid(int) 这个标准的 jdbc 接口方法,而不是执行 SELECT 1 这个语句。isValid(int) 方法会由JDBC驱动程序自行检查连接的有效性,如果在指定的时间(单位:秒)内未获取结果,则该方法返回false, 反之则返回内部实际的检测结果
15 spring.datasource.dbcp2.validation-query-timeout-seconds int 执行连接有效性检查的超时时长(单位:秒) 默认为 -1, 表示无限等待
16 spring.datasource.dbcp2.test-on-create bool 创建连接时,是否执行可用性验证查询语句 默认为 false
17 spring.datasource.dbcp2.test-on-borrow bool 在借用连接时,是否执行连接的可用性验证查询语句 默认为 true
18 spring.datasource.dbcp2.test-on-return bool 在将连接返回给连接池时,是否执行连接的可用性验证查询语句 默认为 false
19 spring.datasource.dbcp2.pool-prepared-statements bool 是否启用预编译语句的缓存池功能 默认为 false, 如果设置为 true,则会同时创建 PreparedStatements与 CallableStatements 语句的缓存池
20 spring.datasource.dbcp2.max-open-prepared-statements int 预编译语句池可同时分配的最大语句数量 默认为 -1,代表不受限制
这是一个性能优化参数,当预编译语句被执行时,连接池会从预编译语句池中获取一个可用的预编译语句。如果预编译语句池中没有可用的预编译语句,连接池会根据需要创建新的预编译语句。max-open-prepared-statements属性用于限制连接池中同时打开的预编译语句的最大数量。一旦达到这个限制,连接池将不再创建新的预编译语句,直到有预编译语句被释放回连接池。
通过设置一个合理的值,可避免过多的资源消耗。
21 spring.datasource.dbcp2.time-between-eviction-runs-millis long 间隔多久执行一次空闲连接和过期连接的检查 默认为 -1,表示不执行检查任务。单位:毫秒
22 spring.datasource.dbcp2.num-tests-per-eviction-run int 单次空闲连接检查任务要测试的最大连接数 默认为 3
23 spring.datasource.dbcp2.min-evictable-idle-time-millis long 将连接移出池外的最小空闲时间 默认为 1800000,即30分钟
24 spring.datasource.dbcp2.soft-min-evictable-idle-time-millis long 将连接柔性移出池外的最小空闲时间 默认为 -1,单位:毫秒
功能与 min-evictable-idle-time-millis 等效,但有一个附加条件,就是池中空闲的连接数至少有min-idle个时,才执行将连接移出池外的操作,另外,本参数的优先级高于 min-evictable-idle-time-millis
25 spring.datasource.dbcp2.eviction-policy-class-name string 空闲连接移出池外的策略类名 默认为 org.apache.commons.pool2.impl.DefaultEvictionPolicy
26 spring.datasource.dbcp2.test-while-idle bool 连接空闲期间是否测试它的可用性 默认为 false
空闲期间,对连接进行测试,如果测试结果为连接无效,则会将其移出连接池
27 spring.datasource.dbcp2.connection-factory-class-name string 创建连接的连接工厂类名 默认为 org.apache.commons.dbcp2.DriverConnectionFactory
28 spring.datasource.dbcp2.connection-init-sqls list 指定连接创建后,可立即执行的,且仅执行一次的SQL语句 默认为 null
29 spring.datasource.dbcp2.access-to-underlying-connection-allowed bool 是否允许直接访问底层的 jdbc 连接 默认为 false
30 spring.datasource.dbcp2.max-conn-lifetime-millis long 连接的最大存活时长,单位:毫秒 默认为 -1, 表示不受限制
该参数容易与 max-idle 混淆,本参数指的是一个连接最大可以存活多久,是整体时长。而 max-idle 设置的是一个连接的最大空闲时长
31 spring.datasource.dbcp2.log-expired-connections bool 是否在日志中输出过期的连接 默认为 true
32 spring.datasource.dbcp2.jmx-name string 连接池的 jmx 名称
33 spring.datasource.dbcp2.disconnection-sql-codes set 设置判断连接已断开的状态码 默认为 null
该参数仅在 fast-fail-validation 为 true 时才有意义。默认情况下,执行SQL时,发生 SQLExcetion,且SQL状态码为以下内容,将被认定为连接已失效(关闭):
• 57P01: 管理员关闭了连接
• 57P02: 数据库崩溃导致连接关闭
• 57P03: 当前连接不可用
• 01002: SQL94 断开连接错误
• JZ0C0: Sysbase 断开连接错误
• JZ0C1: Sysbase 断开连接错误
• 08*:其它以08开发的 SQL_STATE 状态码
34 spring.datasource.dbcp2.jmx-name string 连接池的 jmx 名称
35 spring.datasource.dbcp2.fast-fail-validation bool 是否开启连接有效性检查的快速失败特性 默认为 false
连接池有专门的 Evictor 组件来检查它是否可用。实现手段通常是调用 JDBC 的isValid(int) 方法或执行一个简单的查询SQL。如果一个连接被标记为是可用的,而在实际用它执行SQL时抛出了致命(Fatal)类SQLException时,就会使用 Evictor 组件来查验连接的可用性状态。
多数据情况下,出现 Fatal 类 SQLException 都意味着数据库服务器不可用,此时再去进行可用性验证其实是多余的。 所以便有了快速失败校验(fast-fail-validation)这个特性,当这个参数设置为 true 时,会根据 SQLException 中的状态码来决定是否连接不可用。如果是,则不再使用 Evictor 组件来进一步校验连接的可用性。
那么哪些状态码可被认定为连接不可用呢,见 disconnection-sql-codes 这个参数
36 spring.datasource.dbcp2.remove-abandoned-on-borrow bool 是否在向池中获取连接时触发作废连接清理操作 默认为 false
如果该参数设置为 true, 则每次获取连接时,都将进行作废连接的清理工作(即将标记为 abandoned 的连接从池中删除),但移除折条件不只是连接被标识为 abandoned, 还需同时满足以下条件 :
• 标记为 abandoned 的连接时长超过 remove-abandoned-timeout 秒
• getNumIdle() < 2
• getNumActive() > getMaxTotal() - 3
37 spring.datasource.dbcp2.remove-abandoned-timeout string 被标记为作废的连接从池中删除的前的保持时长,单位:秒 默认为 300
38 spring.datasource.dbcp2.remove-abandoned-on-maintenance boolean 是否在连接池的维护任务中执行作废连接清理操作 默认为 false
即便该参数设置为 true,也未必生效,必须要在 time-between-eviction-runs-millis 参数设置为一个正数时才有效,因为只有这个参数设置为一个有效的值时,连接池的维护任务才会被激活
39 spring.datasource.dbcp2.log-abandoned bool 是否在日志中输出执行作废连接清除的代码运行时堆栈信息 默认为 false

不同的版本,配置属性名称会存在少许差异,准确配置名称参见工程中的 org.apache.commons.dbcp2.BasicDataSource 类

另外,也建议直接去DBCP的官网查阅各参数的详细说明

继续更新中......

2. 如何从Spring源码中查看默认配置

从官方源码中查看配置是最准确的,操作步骤如下:

  1. 所有配置都集中在 spring-boot-autoconfiure.jar 包中

  2. 找到类名以 AutoConfiguration 结尾的,你所关注的那个组件自动装配类
    比如:你关注JdbcTemplate, 则先找到 JdbcTemplateAutoConfiguration 这个类(稍后会以这个类为例子,详细说明)

  3. 找到类名以 Configuration 结尾的,你所关注的那个组件配置类
    与第二步的差异是:类名后缀没有了Auto字符,比如 JdbcTemplateConfiguration,通常这个类会在 AutoConfiguration 类中以 @Import 的方式引入,这样它的装配逻辑就可以自动执行了。因此,熟悉了以后,可以直接跳过第2步。

  4. 找到 AutoConfiguration 在装配组件时,所使用到的相应的 Properties 类的方法
    这个 Properties 就是我们日常开发所配置的内容,即第1章节列出的内容。但这些属性在不同的组件中,所属的类名各不相同。比如数据源组件的属性叫 DataSourceProperties,Jdbc模板的属性叫 JdbcProperties。这些 Properties 类中的属性,就是我们的配置项,也是第1章节内容的出处。

简而言之,配置项最终位于各种 Properties 类中。AutoConfiguration、Configuration、Properties 共同构成了 spring boot 组件自动化装配的基础。AutoConfiguration 负责在 spring boot 环境中触发某类组件的自动装配,Configuration 负责完成具体的装配逻辑,而 Properties 则提供了在运行时,从外部加载组件属性的特性

下面以 JdbcTemplateAutoConfiguration 和 JdbcTemplateConfiguration 为例,详细说明。JdbcTemplateAutoConfiguration 的代码如下:

package org.springframework.boot.autoconfigure.jdbc;

import javax.sql.DataSource;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(JdbcProperties.class)
@Import({ JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class })
           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
public class JdbcTemplateAutoConfiguration {

}

可见,JdbcTemplateAutoConfiguration 类 Import 了 JdbcTemplateConfiguration,而 JdbcTemplateConfiguration 才是 JdbcTemplate 组件真实的装配逻辑所在处。JdbcTemplateConfiguration 的源码如下:

package org.springframework.boot.autoconfigure.jdbc;

import javax.sql.DataSource;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(JdbcOperations.class)
class JdbcTemplateConfiguration {
    @Bean
	@Primary
	JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {
                                                      ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
		JdbcProperties.Template template = properties.getTemplate();
        jdbcTemplate.setFetchSize(template.getFetchSize());     // 使用jdbcProperties的设置
		jdbcTemplate.setMaxRows(template.getMaxRows());         // 使用jdbcProperties的设置
		if (template.getQueryTimeout() != null) {
			jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());
		}
		return jdbcTemplate;
	}
}

从上面可以看到,JdbcTemplate 组件的属性是从 JdbcProperties 中读取的。

进一步查看 JdbcTemplate 源码,会发现有一些属性在 JdbcProperties 中是没有的,比如 skipResultsProcessing 和 resultsMapCaseInsensitive。JdbcTemplate 的这些 properties 就不能通过第1章节的方式来设置了,需要我们写代码来完成。

上面基于 JdbcTemplate 的例子比较简单,多数第三方组件都可以通过这种方式来查看配置。但数据源是比较特殊的,它有一个统一的上层抽象类 DataSource, 和多个实现类。且从源码查看 property 配置的方式也不同。比如 DBCP2 这个数据源,并没有一个叫做 Dbcp2DataSourceProperty 的类来从外部加载 DBCP2 的属性,所有的数据源配置都在 DataSourceProperties 类中. 各个具体的数据源属性,由不同的 property 前缀来区分。DBCP2 单独的属性就配置在 spring.datasource.dbcp2.* 下。那么问题来了:应该从哪里查看 DBCP2 单独的属性配置名称呢。答案是 DBCP2 的 DataSource 实现类,即:org.apache.commons.dbcp2.BasicDataSource 类。查看其它数据源产品的配置属性方法也是如此,即:各个数据源单独的配置属性,就在这些数据源产品的 DataSource 实现类上。

下面是官方的 DataSourceConfiguration 源码中与 DBCP2 数据源装配相关的代码片段

package org.springframework.boot.autoconfigure.jdbc;

abstract class DataSourceConfiguration {
	protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {
		return (T) properties.initializeDataSourceBuilder().type(type).build();
	}

	@Configuration(proxyBeanMethods = false)
	@ConditionalOnClass(org.apache.commons.dbcp2.BasicDataSource.class)
	@ConditionalOnMissingBean(DataSource.class)
	@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.commons.dbcp2.BasicDataSource", matchIfMissing = true)
	static class Dbcp2 {
		@Bean
        // 这一行表明:DBCP2 自身的属性就在 BasicDataSource 中
		@ConfigurationProperties(prefix = "spring.datasource.dbcp2") 
		org.apache.commons.dbcp2.BasicDataSource dataSource(DataSourceProperties properties) {
			return createDataSource(properties, org.apache.commons.dbcp2.BasicDataSource.class);
		}
	}

📚 术语说明:
装配
指组件加载和初始化的整个过程

配置
指装配组件中时,各个 properties 属性值的设置,因此,配置过程只是组件装配过程中的一个环节。

这是我自己为方便中文叙事,分离出的这两个概念。其实使用“装配”和“设置”这两个词要更易区分和理解些,但由于“配置”这个词已被广泛使用(尽管其概念已经出现混淆),这里还是继续使用这个词。它们的对应的英文是 Configuration 和 Properties Setting

posted @ 2023-08-08 09:16  顾志兵  阅读(714)  评论(3编辑  收藏  举报