Spring路径-12-SpringBoot扩展

Spring路径-12-SpringBoot扩展1 Jhipster 代码生成 1 1 简介是一个开源的 Yeoman 生成器 旨在加速和优化现代 Web 应用程序的开发过程 它提供了一套完整的工具链 将 Java Spring Boot 和前端框架如 Angular 或 React 完美结合 让开发者可

欢迎大家来到IT世界,在知识的湖畔探索吧!

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

欢迎大家来到IT世界,在知识的湖畔探索吧!

2)升级到最新版本

欢迎大家来到IT世界,在知识的湖畔探索吧!$ yarn global upgrade generator-jhipster

3)指定版本安装

$ yarn global add generator-jhipster@v5.1.0

(5)可选安装

1)安装Yeoman

欢迎大家来到IT世界,在知识的湖畔探索吧!$ 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目录,输入命令后回车:

欢迎大家来到IT世界,在知识的湖畔探索吧!$ cd app1/ $ jhipster

命令行输出JHipster启动信息

Spring路径-12-SpringBoot扩展



欢迎大家来到IT世界,在知识的湖畔探索吧!

1.3.3 现在开始问答环节

Which type of application would you like to create?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

What is the base name of your application?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

What is your default Java package name?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

Spring路径-12-SpringBoot扩展

单击回车继续。

1.5 Which type of authentication would you like to use?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Which type of database would you like to use?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Which production database would you like to use?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Which development database would you like to use?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Do you want to use the Spring cache abstraction?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Do you want to use Hibernate 2nd level cache?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Which other technologies would you like to use?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Which Framework would you like to use for the client?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Would you like to enable internationalization support?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Please choose the native language of the application

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Please choose additional languages to install

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

Spring路径-12-SpringBoot扩展

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

1.3.5 生成实体代码

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

$ cd app1/ $ jhipster entity role

命令行输出实体已创建

Spring路径-12-SpringBoot扩展

1.3.6 现在开始创建字段

Do you want to add a field to your entity?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

What is the name of your field?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

What is the type of your field?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Do you want to add validation rules to your field?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Do you want to add a field to your entity?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Do you want to add a relationship to another entity?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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版本,但实际项目中使用没出现什么问题。

Spring路径-12-SpringBoot扩展

单击回车继续。

Do you want to add filtering?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

Do you want pagination on your entity?

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

Spring路径-12-SpringBoot扩展

单击回车继续。

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

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

欢迎大家来到IT世界,在知识的湖畔探索吧!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

Spring路径-12-SpringBoot扩展

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

Spring路径-12-SpringBoot扩展

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

$ mvn test

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

Spring路径-12-SpringBoot扩展

1.3.8 生成前端资源

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

调试前端页面

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

欢迎大家来到IT世界,在知识的湖畔探索吧!$ cd app1/ $ yarn start

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

Spring路径-12-SpringBoot扩展

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

Spring路径-12-SpringBoot扩展

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参数指定的值保持一致。

欢迎大家来到IT世界,在知识的湖畔探索吧!$ 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

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

Spring路径-12-SpringBoot扩展

启动

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

欢迎大家来到IT世界,在知识的湖畔探索吧!nohup ./target/app-1-0.0.1-SNAPSHOT.war &

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

$ tail -f nohup.out

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

Spring路径-12-SpringBoot扩展

1.3.11 访问应用UI

访问首页

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

Spring路径-12-SpringBoot扩展

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

实体页面

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

Spring路径-12-SpringBoot扩展

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

Spring路径-12-SpringBoot扩展

管理页面

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

  • 用户管理
  • 资源监控
  • 服务状态
  • 配置
  • 审核
  • 日志
  • API
Spring路径-12-SpringBoot扩展

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

语言页面

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

Spring路径-12-SpringBoot扩展

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)

欢迎大家来到IT世界,在知识的湖畔探索吧!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部分的最大容量

默认为 字节

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   
这组标签通过spring property 来配置的话,结果如下:
server.servlet.context-parameters.email=

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

将连接移出池外的最小空闲时间

默认为 ,即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 的源码如下:

欢迎大家来到IT世界,在知识的湖畔探索吧!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); } } 
  

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/118628.html

(0)
上一篇 4小时前
下一篇 4小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信