3.SpringBoot配置

在哪配置?

  • SpringBoot指定在resources类路径下配置application.ymlapplication.properties 在里面进行配置
<includes>
  <include>**/application*.yml</include>
  <include>**/application*.yaml</include>
  <include>**/application*.properties</include>
</includes>
  • properties我们已经很熟悉了接下来就将yaml

3.1 Yaml配置

什么是yaml?

  • YAML是一个可读性高,用来表达数据序列化的格式。
  • YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。
  • 在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言]),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
  • yaml是一种强调空格的标记语言

yaml基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

yaml支持数据类型

YAML 入门教程https://www.runoob.com/w3cnote/yaml-intro.html

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值(字符串、布尔值、整数、浮点数、Null、时间、日期)
key: 
    child-key: value
    child-key2: value2
    
    
#list 可以写成下面这样也可以写成数组
English:
	- A
 	- B
 	- C
English: [A,B,C]


#都是KV形式,只不过kv之间是有空格的
server:
	port: 8080
	
	
#	& 锚点和 * 别名,可以用来引用: 相当于吧上面两句都搞到下面去了
defaults: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

3.2 yaml测试实体类对应yml数据赋值

第一步:编写实体类(这里省略了get set 构造方法和toString)

  • @Component:是为了让Spring容器接管,测试直接注入调用就行
  • @ConfigurationProperties(prefix = “person”):这个是可以直接定位到application.yml配置文件的配置属性的头名称
  • 这里同样可以根据**@Value**注解进行对属性赋值
  • @Validated是后面加的 用于JSR303数据校验 @Email是用于数据校验,这一个字段是后面加的基于此才能进行数据校验
package com.xuan.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * xuan
 * 2020/7/22
 * 1870136088@qq.com
 **/
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

    private Integer age;
    @NotNull
    private String name;
    private List<String> hobbies;
    private Map<String,Object> subject;
    @Email
    private String email;
    private Dog dog;

}
@Component
public class Dog {

    private Integer age;
    private String name;
}

第二步:由于使用了@ConfigurationProperties注解所以要导入相应配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

第三步:编写yml配置文件设置值

person:
  age: ${random.int}
  name: xuan
  hobbies:
    - basketball
    - football
    - reading
  subject: {Chinese: "100",English: "55"}
  dog:
    age: 3
    name: jingou

第四步:编写测试

@SpringBootTest
class Springboot01HelloworldApplicationTests {

    @Autowired
    Person person;
    @Test
    void contextLoads() {

        System.out.println(person);
    }

}

第五步 查看输出结果

Person{age=18, name='xuan', hobbies=[basketball, football, reading], subject={Chinese=100, English=55}, dog=Dog{age=3, name='jingou'}}

@ConfigurationProperties与@Value区别

  • 可以看出@Value的优势主要是支持SpEl表达式

@ConfigurationProperties

@value

功能

批量注入配置文件中的属性

一个个指定

松散绑定(松散语法)

支持

不支持

SpEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

不支持

  • 所谓松散绑定第一时间应该想到数据库字段与实体类字段驼峰命名规则,这就是采用了那种方法
  • JSR303数据校验的注解为@Validated 例如email校验 要写成@Email格式 然后会以email格式去校验(下面基本涵盖了校验格式)

Constraint

详细信息

@Null

被注释的元素必须为 null

@NotNull

被注释的元素必须不为 null

@AssertTrue

被注释的元素必须为 true

@AssertFalse

被注释的元素必须为 false

@Min(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max, min)

被注释的元素的大小必须在指定的范围内

@Digits (integer, fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past

被注释的元素必须是一个过去的日期

@Future

被注释的元素必须是一个将来的日期

@Pattern(value)

被注释的元素必须符合指定的正则表达式

Constraint

详细信息

@Email

被注释的元素必须是电子邮箱地址

@Length

被注释的字符串的大小必须在指定的范围内

@NotEmpty

被注释的字符串的必须非空

@Range

被注释的元素必须在合适的范围内

3.3 SpringBoot多环境配置及配置文件位置

优先级由高到底,高优先级的配置会覆盖低优先级的配置

  1. file:./config/ (当前项目路径config目录下);
  2. file:./ (当前项目路径下);
  3. classpath:/config/ (类路径config目录下);
  4. classpath:/ (类路径config下).

第一种:是可以在多个配置环境下制定不同的模式值 比如端口号 dev开发模式,prod生产模式,以及默认模式 我们可以设定他的 激活方式

  • 编写application-dev.properties 配置server.port=8002
  • 编写application-pro.properties 配置server.port=8001
  • 编写application.properties 配置多环境开发选择spring.profiles.active=dev(激活dev环境)
  • 所以启动主启动器后访问端口为8002

第二种是在yml配置文件下配置 分模块化指定块部分 它是用 — 进行分块

  • 如果不指定spring.profiles.active的话默认端口号为8081 制定了以后只会走dev开发环境所以走的端口号为8082
server:
  port: 8081
spring:
  profiles:
    active: dev
---
server:
  port: 8082

spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: pro

SpringBoot多环境配置三种激活方式

  • 第一种激活方式是直接激活配置spring.proifiles.active=dev
  • 第二种激活版方式是命令行激活 在运行处配置参数-spring.profiles.active=dev
  • 第三种是虚拟机配置 同样 在运行处找到VM option的地方配置 -Dspring.profiles.active=dev

3.4 SpringBoot自动配置原理再总结

debug=true 能看到哪些配置类生效

  • 第一:SpringBoot启动会加载大量的自动配置类(xxxAutoConfiguration
  • 第二:我们看我们需要的功能有没有在SpringBoot默认写好的配置类中
  • 第三:我们再看这个自动配置类配置了哪些组件,我们需要用到的组件是否在其中
  • 第四:给容器自动配置类添加组件的时候,会从Properties获取某些属性(xxxProperties),我们只需要在配置文件中指定这些属性即可