开箱即用的 spring boot 2.x 脚手架框架

「springboot 2.x 系列」零基础快速入门「springboot 2.x 系列」restful web 应用
「springboot 2.x 系列」properties 配置文件详解
「springboot 2.x 系列」package打包与devtools
「springboot 2.x 系列」日志log4j2会用吗?
「springboot 2.x 系列」actuator 监控/健康检查/审计/统计
「springboot 2.x 系列」深度理解定时任务schedule
「springboot 2.x 系列」多线程异步调用Async
「springboot 2.x 系列」整合mybaits数据库开发框架
「springboot 2.x 系列」exception全局异常处理
「springboot 2.x 系列」如何彻底解决跨域问题
「springboot 2.x 系列」validation数据校验详细说明
「springboot 2.x 系列」如何使用缓存缓解数据库压力
「springboot 2.x 系列」filter 过滤器如何正确使用

先看 spring boot 2.x restful web应用

基于上述代码修改

  • Spring Boot 允许在一个配置文件中针对不同 Profile 进行配置
  • Spring Boot 在未指定 Profile 时默认为 default
  • Spring Boot 提供了 @ConfigurationProperties 注解,可以非常方便地把一段配置加载到一个 Bean 中
  • 官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config

源码地址:https://github.com/langyastudio/langya-tech/tree/springboot/properties

读取配置文件

配置样例

这里使用 application.yml yml 类型的配置文件,而不是 application.properties ini 类型的配置文件。

langyastudio:
  disk:
    local:
      root: /mnt/volume/edu/pms/
      #只有在windows运行时才生效
      #use for test on windows OS
      win-root: Z:/volume/edu/pms/
      #文件存储路径
      root-file: ${langyastudio.disk.local.root}file/
      #转码路径自动映射为mts/
      root-mts: ${langyastudio.disk.local.root}mts/
      #文件存储临时路径
      root-tmp: ${langyastudio.disk.local.root}temp/upload/
      #-图片-可直接浏览的文件大小10M
      browse-img-max-size: 10485760
      #-图片-可转码的文件大小20M
      cvt-img-max-size: 20971520
      # 最大文件大小,默认10M
      max-size: 10485760
      # 是否允许空文件:
      allow-empty: false
      # 允许的文件类型:
      allow-types: jpg, png, gif

@Value

读取配置文件可以直接使用注解 @Value,例如在某个类里需要获取 root 配置项,可使用 @Value 注入:

@RestController
@RequestMapping("/config")
public class ConfigController
{
    @Value("${langyastudio.disk.local.root}")
    String root;
    
    @Value("${langyastudio.disk.local.root:/mnt/volume/edu/pms/}")
    String root;
	
    ...   
}

这里演示的是在 control 层注入配置项,在其他类文件中注入配置项需要使用 @Component

可以使用 ${langyastudio.disk.local.root:/mnt/volume/edu/pms/} 设置缺省值

@ ConfigurationProperties

定义 Bean

为了更好地管理配置,Spring Boot 允许创建一个 Bean 直接注入一组配置项。可以首先定义一个 Java Bean,需要确保 Java Bean 的属性名称与配置一致即可:

@Data
@ConfigurationProperties(prefix = "langyastudio.disk.local")
public class DiskLocalConfig
{
    private String       root;
    private String       winRoot;
    private String       rootFile;
    private String       rootMts;
    private String       rootTmp;
    private Integer      browseImgMaxSize;
    private Integer      cvtImgMaxSize;
    private Integer      maxSize;
    private Boolean      allowEmpty;
    private List<String> allowTypes;
}

注意到 @ConfigurationProperties(prefix = "langyastudio.disk.local") 表示将从配置项 langyastudio.disk.local 读取该项的所有子项配置并一一映射到属性字段中。

定义 ConfigurationPropertiesScan

表示对那些类文件进行属性扫描组装为 Bean。com.langyastudio.springboot.common.*表示类所在的位置。

@ConfigurationPropertiesScan("com.langyastudio.springboot.common.*")
@Configuration
public class WebConfig implements WebMvcConfigurer
{

}

也可以使用 @Configuration 替代

使用配置项

@Autowired
DiskLocalConfig diskLocalConfig;


---- 实际数据
{
    "root": "/mnt/volume/edu/pms/",
    "winRoot": "Z:/volume/edu/pms/",
    "rootFile": "/mnt/volume/edu/pms/file/",
    "rootMts": "/mnt/volume/edu/pms/mts/",
    "rootTmp": "/mnt/volume/edu/pms/temp/upload/",
    "browseImgMaxSize": 10485760,
    "cvtImgMaxSize": 20971520,
    "maxSize": 10485760,
    "allowEmpty": false,
    "allowTypes": [
        "jpg",
        "png",
        "gif"
    ]
}

这样就很方面的使用配置项,不需要使用一堆 @Value

配置环境profiles

即解决如何在研发、测试、上线等不同环境中使用不同的配置?通过 Profile 可以实现一套代码在不同环境启用不同的配置和功能。

我们可以三个配置文件:

  • application.yml
  • application-dev.yml
  • application-pro.yml

application-dev.ymlapplication-pro.yml 配置文件会自动覆盖 application.yml 文件的已有配置项。

在 java 程序运行时,可以通过 --spring.profiles.active=dev 指定使用哪个配置文件,如要以 dev 环境启动,可输入如下命令:

$ java -Dspring.profiles.active=dev -jar xxx.jar

当然如果只使用一个配置文件,可以实现多文档分区,即同样的多配置功能。在一个 yml 文件中,通过 --- 分隔多个不同配置,根据 spring.profiles.active 的值来决定启用哪个配置。

此时可以通过 @Profile 指定不同的配置项组实现同样的效果。这里不做详细介绍

#公共配置
spring:
  profiles:
    # 指定使用哪个文档块
    active: pro
---
spring:
  profiles: dev

server:
  port: 8080
---
spring:
  profiles: pro

server:
  port: 8081

yml 文件详解

以下内容来自网络,具体参考链接找不到了

什么是YAML

YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。主要强度这种语音是以数据为中心,而不是以标记语音为重心,例如像 xml语言就会使用大量的标记。

YAML是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。

YAML 的配置文件后缀为 .yml,例如 Springboot 项目中使用到的配置文件 application.yml 。

基本语法

  • YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16。
  • 数据结构采用键值对的形式,即 键名称: 值,注意冒号后面要有空格。
  • 每个清单(数组)成员以单行表示,并用短杠+空白(- )起始。或使用方括号([]),并用逗号+空白(, )分开成员。
  • 每个散列表的成员用冒号+空白(: )分开键值和内容。或使用大括号({ }),并用逗号+空白(, )分开。
  • 字符串值一般不使用引号,必要时可使用,使用双引号表示字符串时,会转义字符串中的特殊字符(例如\n)。使用单引号时不会转义字符串中的特殊字符。
  • 大小写敏感
  • 使用缩进表示层级关系,缩进不允许使用tab,只允许空格,因为有可能在不同系统下tab长度不一样
  • 缩进的空格数可以任意,只要相同层级的元素左对齐即可
  • 在单一文件中,可用连续三个连字号(—)区分多个文件。还有选择性的连续三个点号(…)用来表示文件结尾。
  • ‘#’ 表示注释,可以出现在一行中的任何位置,单行注释
  • 在使用逗号及冒号时,后面都必须接一个空白字符,所以可以在字符串或数值中自由加入分隔符号(例如:5,280 或 http://www.wikipedia.org)而不需要使用引号。

数据类型

  • 标量(scalars):单个的、不可再分的值
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

标量

标量是最基础的数据类型,不可再分的值,他们一般用于表示单个的变量,有以下七种:

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
# 字符串
string.value: Hello!我是陈皮!
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # 二进制
# 浮点数
float.value: 3.14159
# 科学计数法
float.value1: 314159e-5 
# Null,~ 代表null
null.value: ~
# 时间,时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
datetime.value: !!timestamp 2021-04-13T10:31:00+08:00
# 日期,日期必须使用ISO 8601格式,即yyyy-MM-dd
date.value: !!timestamp 2021-04-13

对象

我们知道单个变量可以用键值对,使用冒号结构表示 key: value,注意冒号后面要加一个空格。可以使用缩进层级的键值对表示一个对象,如下所示:

person:
  name: 陈皮
  age: 18
  man: true

数组

可以用短横杆加空格 -开头的行组成数组的每一个元素,如下的address字段:

person:
  name: 陈皮
  age: 18
  man: true
  address:
    - 深圳
    - 北京
    - 广州

也可以使用中括号进行行内显示形式,如下:

person:
  name: 陈皮
  age: 18
  man: true
  address:
    [深圳, 北京, 广州]

如果数组字段的成员也是一个数组,可以使用嵌套的形式,如下:

person:
  name: 陈皮
  age: 18
  man: true
  address: [深圳, 北京, 广州]
  twoArr:
    -
      - 2
      - 3
      - 1
    -
      - 10
      - 12
      - 30

如果数组成员是一个对象,则用如下两种形式形式:

childs:
  -
    name: 小红
    age: 10
  -
    name: 小王
    age: 15

文本块

如果你想引入多行的文本块,可以使用|符号,注意在冒号 : 和 | 符号之间要有空格。

person:
  name: |
    Hello Java!!
    I am fine!
    Thanks! GoodBye!

它和加双引号的效果一样,双引号能转义特殊字符:

person:
  name: "Hello Java!!\nI am fine!\nThanks! GoodBye!"

显示指定类型

有时我们需要显示指定某些值的类型,可以使用 !(感叹号)显式指定类型。!单叹号通常是自定义类型,!!双叹号是内置类型,例如:

# 指定为字符串
string.value: !!str HelloWorld!
# !!timestamp指定为日期时间类型
datetime.value: !!timestamp 2021-04-13T02:31:00+08:00

内置的类型如下:

  • !!int:整数类型
  • !!float:浮点类型
  • !!bool:布尔类型
  • !!str:字符串类型
  • !!binary:二进制类型
  • !!timestamp:日期时间类型
  • !!null:空值
  • !!set:集合类型
  • !!omap,!!pairs:键值列表或对象列表
  • !!seq:序列
  • !!map:散列表类型

引用

引用会用到 &锚点符合和 星号符号,&用来建立锚点,<< 表示合并到当前数据, 用来引用锚点。

xiaohong: &xiaohong
  name: 小红
  age: 20

dept:
  id: D15D8E4F6D68A4E88E
  <<: *xiaohong

上面最终相当于如下:

xiaohong:
  name: 小红
  age: 20

dept:
  id: D15D8E4F6D68A4E88E
  name: 小红
  age: 20

还有一种文件内引用,引用已经定义好的变量,如下:

base.host: https://chenpi.com
add.person.url: ${base.host}/person/add