Spring路径-12-SpringBoot扩展(spring 扩展)

1 Jhipster代码生成

1.1 简介

是一个开源的 Yeoman 生成器,旨在加速和优化现代Web应用程序的开发过程。它提供了一套完整的工具链,将Java、Spring Boot 和前端框架如Angular或React完美结合,让开发者可以快速构建高质量、可扩展的企业级应用。

(1)JHipster能做什么

JHipster可以自动化生成一个完整和现代的Web应用程序或微服务架构。

  • 基于Spring Boot框架的服务端,具备高性能和高可用的Java技术栈;
  • 基于Angular,React和Bootstrap的时尚,现代,移动优先的前端;
  • 基于JHipster Registry,Netflix OSS,ELK堆栈和Docker的强大的微服务架构;
  • 使用Yeoman,Webpack和Maven/Gradle构建应用程序的强大工作流程。

(2)JHipster开发效率

以10个微服务,每个微服务包含1个数据表和4个UI界面(基本CURD界面)的开发规模为例:

工作项

人工开发(人天)

JHipster开发(人天)

数据库建表

1

0

项目创建及配置文件编写

2

0

开发CURD代码

5

1

开发前端UI

10

1

合计:

18

2

在实际项目中因为定制化工作的需要,开发效率的差距会比这个小,但正常情况下减少一半以上的工作量是可以达到的。

(3)前端技术栈

  • Angular、React、Vue
  • Bootstrap响应式网页设计
  • HTML5
  • 国际化
  • CSS的Sass
  • WebSocket
  • 使用Yarn安装新的JavaScript库
  • 使用Webpack构建,优化和实时加载
  • 使用Jest和Protractor进行测试
  • 支持Thymeleaf模板引擎

(4)后端技术栈

  • Spring Boot
  • Maven和Gradle
  • Spring Security
  • Spring MVC REST + Jackson
  • Spring Websocket
  • Spring Data JPA
  • Liquibase
  • Elasticsearch
  • MongoDB和Couchbase
  • Cassandra
  • Kafka

(5)微服务技术栈

  • 使用Netflix Zuul或Traefik作为HTTP路由
  • 使用Netflix Eureka或HashiCorp Consul作为服务发现
  • 使用Spring Cloud Config作为统一配置

(6)CI/CD支持

  • Jenkins
  • Travis CI
  • GitLab CI
  • Circle CI

(7)部署环境支持

  • 使用ELK堆栈进行应用指标监控
  • 使用ehcache,hazelcast或Infinispan进行缓存
  • 优化的静态资源(gzip过滤器,HTTP缓存头)
  • 使用Logback进行日志管理,可在运行时进行配置
  • 使用HikariCP连接池以获得最佳性能
  • 构建标准WAR文件或可执行JAR文件
  • 完整的Docker和Docker-Compse支持
  • 支持所有主要云提供商:AWS,Cloud Foundry,Heroku,Kubernetes,OpenShift,Docker等

(8)特点

  • 自动生成代码 - 节省大量手动编写基础结构的时间,让你能更专注于业务逻辑。
  • 最佳实践 - 严格遵循软件开发的最佳实践,保证项目的质量和可维护性。
  • 模块化设计 - 可以按需添加或移除功能模块,保持应用的灵活性。
  • 社区活跃 - 大量活跃的贡献者和用户社区,问题解决迅速,不断有新的特性和更新。
  • 文档丰富 - 官方文档详细全面,便于学习和参考。

1.2 JHipster开发环境安装]

本文演示如何在CentOS7上安装Jhipster以及其依赖组件。 这里采用官方推荐的Yarn安装方法,操作系统版本为CentOS 7.9。

(1) 安装JDK

推荐版本:OpenJDK 1.8.0-64bit。

(2)安装Nodejs

推荐版本: v8.11.3

(3)安装Yarn

推荐版本: v1.12.0

(4)安装JHipster

1)安装最新版本

$ yarn global add generator-jhipster

2)升级到最新版本

$ yarn global upgrade generator-jhipster

3)指定版本安装

$ yarn global add generator-jhipster@v5.1.0

(5)可选安装

1)安装Yeoman

$ yarn global add yo

2)安装Maven

推荐版本: 3.5.4

(6)参考

如果需要在Mac OS X,Windows上安装,或者Docker安装方式,请参考官网的安装文档:
https://www.jhipster.tech/installation/

1.3 JHipster生成单体架构的应用示例

本文演示如何用JHipster生成一个单体架构风格的应用。 环境需求:安装好JHipster开发环境的CentOS 7.9 应用名:app1 实体名:role 主机IP:192.168.220.120

1.3.1 首先创建一个应用目录

$ mkdir app1

1.3.2 生成工程代码

进入app1目录,输入命令后回车:

$ cd app1/
$ jhipster

命令行输出JHipster启动信息

1.3.3 现在开始问答环节

Which type of application would you like to create?

选择生成的应用类型 这是一个单选题,有4个选项,使用上下键切换选项。 因为这个例子是生成单体架构的应用,所以这里选择默认选项Monolithic application,也就是单体架构的应用。

单击回车继续。

What is the base name of your application?

输入应用的名称 默认名称是当前目录名app1,也可以自己输入名称;这里使用默认名称。 注意:名称只能是大小写字母,数字和下划线的任意组合,不允许任何其它字符。

单击回车继续。

What is your default Java package name?

输入应用的java包名 默认java包名是com.mycompany.myapp,也可以自己输入包名;这里使用默认包名。 注意:包名要符合Java标准规范的要求。

单击回车继续。

Do you want to use the JHipster Registry to configure, monitor and scale your application?

是否需要使用JHipster Registry来实现应用的配置,监控和弹性缩放? 这是一个单选题,有2个选项,使用上下键切换选项。 因为这个例子是生成单体架构的应用,不需要以上特性,所以这里选择默认选项No

单击回车继续。

1.5 Which type of authentication would you like to use?

选择应用的认证类型 这是一个单选题,有3个选项,使用上下键切换选项。 对于无状态的单体应用,JWT最适合,所以这里选择默认选项JWT authentication

单击回车继续。

Which type of database would you like to use?

选择使用的数据库类型 这是一个单选题,有4个选项,使用上下键切换选项。 可以看到支持的数据库类型很多,这里选择默认选项SQL

单击回车继续。

Which production database would you like to use?

选择生产环境中使用的数据库 这是一个单选题,有5个选项,使用上下键切换选项。 可以看到目前支持5种SQL数据库,这里选择默认选项MySQL

单击回车继续。

Which development database would you like to use?

选择开发环境中使用的数据库 这是一个单选题,有3个选项,使用上下键切换选项。 H2调试起来简单,但为了和生产环境保持一致性,这里选择MySQL

单击回车继续。

Do you want to use the Spring cache abstraction?

是否需要使用Spring Cache? 这是一个单选题,有5个选项,使用上下键切换选项。 对于单体架构的应用,不考虑多个实例的场景,使用本地缓存最简单,所以这里选择Yes, with the Ehcache implementation (local cache, for a single node)

单击回车继续。

Do you want to use Hibernate 2nd level cache?

是否需要使用Hibernate二级缓存? 默认选择是Y,如果不需要使用,输入n;这里选择默认选项Y注意:这个问题和上一个问题(1.9)的选择有关联性,上一个问题的不同选择,会导致后续不同问题的出现。

单击回车继续。

Would you like to use Maven or Gradle for building the backend?

选择使用Maven还是Gradle来构建应用 这是一个单选题,有2个选项,使用上下键切换选项。 根据自己的开发环境需要,选择相应的构建工具,这里选择默认选项Maven

单击回车继续。

Which other technologies would you like to use?

选择需要用到的技术组件 这是一个多选题,有4个选项,使用上下键切换选项,使用空格键选中选项,使用a键全选,使用i键取消全选。 根据自己的技术架构规划,选择相应的技术组件,也可以都不选择。

单击回车继续。

Which Framework would you like to use for the client?

选择前端框架 这是一个单选题,有2个选项,使用上下键切换选项。 根据自己的技术架构规划,选择相应的前端框架,这里选择默认选项Angular 6

单击回车继续。

Would you like to enable SASS support using the LibSass stylesheet preprocessor?

是否需要启用样式表预处理来支持SASS? 默认选择是N,如果需要启用,输入y;这里选择默认选项N

单击回车继续。

Would you like to enable internationalization support?

是否需要国际化支持? 默认选择是Y,如果不需要,输入n;这里选择默认选项Y

单击回车继续。

Please choose the native language of the application

选择国际化支持中的母语 这是一个单选题,有37个选项,使用上下键切换选项。 注意:这个问题和上一个问题(1.15)的选择有关联性,上一个问题如果选择n,这个问题不会出现。

单击回车继续。

Please choose additional languages to install

选择国际化支持中的其它语言 这是一个多选题,有37个选项,使用上下键切换选项,使用空格键选中选项,使用a键全选,使用i键取消全选。 根据自己的业务规划,选择相应的语言,也可以都不选择。

单击回车继续。

Besides JUnit and Jest, which testing frameworks would you like to use?

选择单元测试工具 这是一个多选题,有2个选项,使用上下键切换选项,使用空格键选中选项,使用a键全选,使用i键取消全选。 根据自己的技术架构规划,选择相应的技术组件,也可以都不选择。

单击回车继续。

Would you like to install other generators from the JHipster Marketplace?

是否需要从JHipster市场中安装其它的开发工具? 默认选择是N,如果需要启用,输入y;这里选择默认选项N

单击回车继续。

1.3.4 问答结束,开始生成工程代码

这个过程可能会有点长,根据电脑性能和网速的不同,通常需要3-5分钟。

至此,生成工程代码成功完成。可以在app1根目录下查看所有生成的文件。

1.3.5 生成实体代码

接下来,创建一个实体表role,并生成相关的后端代码和前端资源。 在开始之前,通常需要先把数据库设计完成,一般情况下不需要手工添加id字段,JHipster默认会生成一个自增的int类型的id主键。 进入app1目录,输入命令后回车:

$ cd app1/
$ jhipster entity role

命令行输出实体已创建

1.3.6 现在开始创建字段

Do you want to add a field to your entity?

是否需要添加一个字段到实体? 默认选择是Y,如果不需要添加,输入n;这里选择默认选项Y

单击回车继续。

What is the name of your field?

输入字段名 这里输入第一个字段名roleName,字段名要符合之前所选择的数据库的命名规范。 注意:这个问题和上一个问题(2.1)的选择有关联性,上一个问题如果选择n,这个问题不会出现。

单击回车继续。

What is the type of your field?

选择字段类型 这是一个单选题,有12个选项,使用上下键切换选项。 根据你的数据库设计,选择相应类型,这里选择String类型。

单击回车继续。

Do you want to add validation rules to your field?

是否需要为这个字段添加规则? 默认选择是N,如果需要添加,输入y;这里选择默认选项N

单击回车继续。

Do you want to add a field to your entity?

是否需要继续添加字段? 成功添加完一个字段后,重新回到了第一个问题(2.1)。如果选择Y,会重复2.1 ~ 2.4的过程;如果选择n,则进入新的问题;这里输入n

单击回车继续。

Do you want to add a relationship to another entity?

是否需要添加一个与别的实体的关联关系? 默认选择是Y,如果不需要添加,输入n;因为目前还没有生成别的实体,这里输入n

单击回车继续。

Do you want to use separate service class for your business logic?

是否需要使用独立的service层来封装业务逻辑? 这是一个单选题,有3个选项,使用上下键切换选项。 三个选项的意思分别是不用service层使用service类使用service接口和实现类;这里选择Yes, generate a separate service class

单击回车继续。

Do you want to use a Data Transfer Object (DTO)?

是否需要使用DTO? 这是一个单选题,有2个选项,使用上下键切换选项。 如果选择No, use the entity directly,可能会带来一些前后端耦合和传输效率的问题;所以这里选择[BETA] Yes, generate a DTO with MapStruct,虽然还是BETA版本,但实际项目中使用没出现什么问题。

单击回车继续。

Do you want to add filtering?

是否需要添加筛选功能? 这是一个单选题,有2个选项,使用上下键切换选项。 如果选择添加筛选功能,代码中会添加JPA动态查询的逻辑,但实际代码还需要手动修改,也许将来新版本会不断完善这个功能;这里为了简单起见,选择Not needed

单击回车继续。

Do you want pagination on your entity?

是否需要分页功能? 这是一个单选题,有3个选项,使用上下键切换选项。 第2个选项适合Web UI,第3个选项适合Mobile UI;这里选择Yes, with pagination links

单击回车继续。

1.3.7 问答结束,开始生成实体代码

这个过程中会提示与已有文件有冲突,需要选择处理方式,提示的输入选项是Ynaxdh,说明如下:

Y: yes (Default)
n: no
a: yes to this question and all others (or always yes).
x: abort (exit)
d: show the differences between the old and the new file
h: help, list all options

这里选择a

单击回车。实体代码生成过程比较快,通常1-2分钟就能完成。

至此,生成实体代码成功完成。可以执行maven测试命令来验证整个工程代码(如果生成工程代码时选择的构建工具是Maven)

$ mvn test

如果一切正常,命令行会输出成功信息:

1.3.8 生成前端资源

之前在生成工程代码时选择的前端组件是Angular,所以前端资源会按如下流程生成: a, 生成工程代码或者实体代码的任务完成后,会自动触发执行yarn install; b, yarn install执行完成后,会自动触发执行webpack:build; c, webpack:build执行完成后,所有前端资源就已经生成了,默认是在app1/target/www目录下。

调试前端页面

进入app1目录,输入命令后回车:

$ cd app1/
$ yarn start

如果一切正常,会启动Webpack dev-server;

可通过浏览器访问
http://192.168.220.120:9000
查看前端调试页面。此时所有前端资源的修改,都会同步更新到浏览器上。

1.3.9 数据库配置

启动一个数据库容器

在命令行,任意目录下,启动一个mysql容器;如果本地没有mysql:5的镜像,容器启动时会自动去docker store下载镜像。

$ docker container run --name app1-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 32768:3306 mysql:5

在数据库中创建schema

通过客户端连接上刚启动的数据库容器,添加一个名为app1的schema。应用启动时会自动在这个schema里面创建数据表。

修改应用的数据库配置

spring.datasource.url中的端口号32768,与步骤4.1中-p参数指定的值保持一致。 spring.datasource.url中的schema名称app1,与步骤4.2中添加的schema名称保持一致。
spring.datasource.password的值
my-secret-pw,与步骤4.1中MYSQL_ROOT_PASSWORD参数指定的值保持一致。

$ cd app1/
$ vi src/main/resources/config/application-dev.yml
# 修改数据库连接相关配置
spring:
    datasource:
        url: jdbc:mysql://localhost:32768/app1?useUnicode=true&characterEncoding=utf8&useSSL=false
        username: root
        password: my-secret-pw

1.3.10 构建和启动

构建

进入app1目录,输入命令后回车:

$ cd app1/
$ mvn -Pdev package

如果一切正常,命令行会输出构建成功信息:

启动

进入app1目录,输入命令后回车:

nohup ./target/app-1-0.0.1-SNAPSHOT.war &

通过tail命令,查看启动日志:

$ tail -f nohup.out

如果一切正常,日志会输出启动成功信息:

1.3.11 访问应用UI

访问首页

通过浏览器访问
http://192.168.220.120:8080
,进入应用的首页:

点击右上角账号 - 登录, 默认用户名和密码都是admin

实体页面

登录之后可以看到页头上的菜单,数据菜单下就是所有实体的操作页面,这里能看到生成的实体role的子菜单:

点击role子菜单,进入role实体的操作页面,这里已经生成了基本的增删改查功能,如果需要更多功能,就要定制开发了:

管理页面

这里包括了如下功能页面:

  • 用户管理
  • 资源监控
  • 服务状态
  • 配置
  • 审核
  • 日志
  • API

页面功能都很直观,点进去看一看就知道了。

语言页面

这里就是国际化支持的页面,生成工程代码时选择了哪些语言,这里就会提供哪些语言的子菜单:

1.3.12 源码

jhi-example-app1

2 SpringBoot常用应用属性配置列表

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

#2.1 配置属性清单

2.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'

2.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号管理进程”

2.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定义,后加载的覆盖先加载的。

2.1.4 服务器配置

2.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时有效

2.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 会根据时间和当前日志文件大小,判定是否应该将当前日志存档

2.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 轮转功能是指:当日志的内容大小和日期达到一定要求后,将该部分日志切割成一个单独的文件存档

2.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

2.1.4.5 Servlet 配置

序号

属性名

类型

用途

备注

1

server.servlet.context-path

string

设置Servlet服务的请求上下文路径

从使用上讲,就是在请求这个Servlet的时候,需在url上加前缀,前缀内容就是这个context-path

2

server.servlet.context-parameters.*

string

添加ServletContext的初始化参数

对应于传统web.xml配置中的标签,比如有这面这样一组初始化参数:   email   east-knight@codefate.net 这组标签通过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, 则只有程序中真实调用了获取部件体内容的方法时,才会去解析 ,这可以提高性能

2.1.5 数据源配置

2.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

2.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.2 如何从Spring源码中查看默认配置

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

  • 所有配置都集中在 spring-boot-autoconfiure.jar 包中
  • 找到类名以 AutoConfiguration 结尾的,你所关注的那个组件自动装配类 比如:你关注JdbcTemplate, 则先找到 JdbcTemplateAutoConfiguration 这个类(稍后会以这个类为例子,详细说明)
  • 找到类名以 Configuration 结尾的,你所关注的那个组件配置类 与第二步的差异是:类名后缀没有了Auto字符,比如 JdbcTemplateConfiguration,通常这个类会在 AutoConfiguration 类中以 @Import 的方式引入,这样它的装配逻辑就可以自动执行了。因此,熟悉了以后,可以直接跳过第2步。
  • 找到 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 createDataSource(DataSourceProperties properties, Class 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);
        }
    }