文章目录
前言
1.yaml语法讲解
1.1.yam和properties配置文件对比+ .yaml使用
1.2.yaml配置文件语法
1.3.yaml配置文件的赋值操作
1.4 扩展:.yaml方式给实体类赋值(配置随机值或默认值)
1.5 @Value和@ConfigurationProperties注解区别
2.松散绑定与JSR303数据校验
2.1 松散绑定使用案例
2.2 JSR303数据校验及常见校验参数
3.多环境配置及配置文件位置
3.1 配置文件的存放位置优先级
3.2 多环境下多个配置文件的切换
3.3. ym和properties配置文件同时使用情况

前言

本章主要说明:.yml和properties 两种配置文件的使用 + 存取值 + 多配置文件使用…

1. yaml语法讲解

1.1 .yaml和.properties配置文件对比 + .yaml使用

1. 一般配置文件application的后缀有两种方式:官方推荐properties
⑴ 方式一:application.properties
语法结构 :key=value
⑵ 方式二:application.yml
语法结构 :key:空格 value

2. .yaml 存储 与.properties 存储对比
⑴ .yaml可以存储多种形式,而.properties仅可以存储键值对形式。
⑵ 以下演示.yaml存储数据的几种形式
==.yaml配置文件,如下所示↓:==


# 更改项目的端口号
server:
  port: 8081

# 存储普通的键值对
name: linaa
# 存储一个对象
student:
  name: linaa
  age: 13

# 存储一个对象(行内写法)
student2: {name: linzk2,age: 14}

# 存储一个数组
pets:
  - cat
  - dog
  - pig
# 存储一个数组(行内写法)
pets2: {cat2,dog2,pig2}

1.2 .yaml配置文件语法

1. yaml基础语法
⑴ 空格不能省略
⑵ 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级
的。
⑶ 属性和值的大小写都是十分敏感的。

1.3 .yaml配置文件的赋值操作

1. yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!
⑴ 给实体类赋值有三种方式:
- 方式一:@Value  --->以前的用法 
- 方式二:@ConfigurationProperties  --->现在的用法
- 方式三:@PropertySource --->加载指定的配置文件(此方式需要利
- 用@Value来获取配置文件中的值);

⑵ 以上三种方式精通一种即可!

1.3.1 方式一:使用@Value注解直接给实体类一个个赋值

1. 使用@Value注解赋值,演示如下
⑴ 创建一个Dog实体类,并利用@Value注解给属性赋值。
@Component //注册bean
@Getter
@Setter
@ToString
public class Dog {    
    @Value("旺财")    
    private String name;    
    @Value("18")    
    private Integer age;
}

⑵ 在SpringBoot的测试类下,测试使用@Value注入Dog值后的输出情况
@SpringBootTest
public class DemoApplicationTests {
    @Autowired //将狗狗自动注入进来    
    private Dog dog;
    
    @Test    
    public void contextLoads() { 
           System.out.println(dog); //打印看下狗狗对象    
  }
}

↑运行以上程序,输出使用@Value注解给Dog赋值的值,如-"图p1"

springboot项目启动如何通过启动命令切换数据库连接_java


图p1

1.3.2 方式二:使用@ConfigurationProperties注解给实体类赋值

1. 使用.yaml给实体类赋值
⑴ 创建一个实体类Person
@Component //注册bean到容器中,实现被Spring被扫描到
@Getter
@Setter
@ToString
/**
 *  @ConfigurationProperties(prefix = "person")
 * -->这里面的(prefix = "person")是配置文件中值对应的前缀为
 * person,属于配置文件中的层级名称,而不是配置文件名称。
 *       
 *      -->表示通过ConfigurationProperties将里面的person参数
 *      -->与.yaml里面的person下面的参数配置绑定起来,
 *      -->绑定起来这个实体类Person就有注入的值了
 */
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

⑵ 在.yaml配置中设置person的值
person:
  name: linaa
  age: 13
  birth: 2020/11/14
  maps: {k1: v1, k2: v2}
  lists:
    - code
    - music
    - girl
  dog:
    name: 旺财
    age: 3

⑶ 测试

/**
 * 使用以下测试类来测试
 */
@SpringBootTest
public class SpringbootApplicationTests {

   @Autowired
   private Person person;

    @Test
    public void test1() {
        System.out.println(person);
    }
}

↑运行以上test1()方法,查看是否输出.yaml设置的值。
② 以上@ConfigurationProperties注解作用↓:
/* @ConfigurationProperties作用:
 * 将配置文件中配置的每一个属性的值,映射到这个组件中;
 * 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数 prefix = “person” : 
 * 将配置文件中的person下面的所有属性一一对应
 */

1.3.3 方式三:@PropertySource + @Value 加载指定的配置文件给实体类赋值

1. 任意命名一个,以.rpoperties结尾的配置文件,并在实体类上指定要将此配置文件读取
到指定的实体类上,并给该实体类赋值,但是注意给实体类赋值还要加上@Value注解要注入进去才可以实现赋值。

⑴ 我们去在resources目录下新建一个person.properties文件
name=linaa

⑵ 然后在我们的代码实体类中指定加载person.properties文件
@PropertySource(value = "classpath:person.properties")
@Component //注册bean
@Getter
@Setter
@toString
public class Person {
    @Value("${name}")
    private String name;
}

⑶ 再次输出测试一下:指定配置文件绑定成功

/**
 * 使用以下测试类来测试
 */
@SpringBootTest
public class SpringbootApplicationTests {
   @Autowired
   private Person person;

    @Test
    public void test1() {
        System.out.println(person);
    }

}
以上测试运行结果:
Person(name = linaa)

1.4 扩展:.yaml方式给实体类赋值(配置随机值或默认值)

1. 配置文件配置随机值或默认值,并赋值给实体类属性
① 创建一个实体类Person
package com.lzk.pojo;

@Component //注册bean到容器中,实现被Spring被扫描到
@Getter
@Setter
@ToString
/**
 *  @ConfigurationProperties(prefix = "person")
 *  --->(prefix = "person")是配置文件中的层级名称而不是配置文件名称。
 *      -->表示通过ConfigurationProperties将里面的person参数
 *      -->与.yaml里面的person下面的参数配置绑定起来,
 *      -->绑定起来这个实体类Person就有注入的值了
 */
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

② .yaml配置文件设置属性的随机值,或者若属性为空设置其默认值
person:
# 随机生成一个UUID值
  name: linzk123${random.uuid}
# 随机生成一个int类型的值
  age: ${random.int}
  birth: 2020/11/14
  maps: {k1: v1, k2: v2}
  hello: happy
  lists:
    - code
    - music
    - girl
  dog:


----------------------------------------下面引用段说明↓:
    name: ${person.hello: hello}_旺财
    age: 3
# 上面'name'中的意思为:如果person下面存在hello这个属性,
则name值取:happy_旺财。
# 如果person下面不存在hello这个属性 ,则name的值为:hello_旺财
# 这就是占位符的使用

------------------------------------------------------

③ 测试
/**
 * 使用以下测试类来测试
 */
@SpringBootTest
public class SpringbootApplicationTests {
   @Autowired
   private Person person;
    @Test
    public void test1() {
        System.out.println(person);
    }
}
↑ 运行以上程序,结果如-"图y1"
Person{name = linzk2315161651sad-165a1s65d165asd-1as65d16sad15sa6 ...其他字段值忽略}

1.5 @Value和@ConfigurationProperties注解区别

1. @Value和@ConfigurationProperties,如-"图vc"

⑴、@ConfigurationProperties只需要写一次即可 , @Value则
需要每个字段都添加@Value注解。

2. @Value和@ConfigurationProperties使用结论:
⑴ 配置yml和配置properties都可以获取到值,强烈推荐 yml;
⑵ 如果我们在某个业务中,只需要获取配置文件中的某个值,
可以使用一下@value;
⑶ 如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,
就直接@configurationProperties,不要犹豫!

springboot项目启动如何通过启动命令切换数据库连接_后端_02


图vc

2. 松散绑定与JSR303数据校验

1. 松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的,
后面跟着的字母默认是大写的。这就是松散绑定。
2. JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性。
3. 复杂类型封装,yml中可以封装对象,使用value就不支持。

2.1 松散绑定使用案例

1. 松散绑定代码演示

⑴ Dog实体类
@Component
@ConfigurationProperties(prefix = "dog")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Dog  {
    private String firstName;
    private Integer age;
}

⑵ 配置文件.yaml
dog:
  first-name: 阿黄
  age: 3

⑶ 测试
@SpringBootTest
public class SpringbootApplicationTests {
    @Autowired
    private Dog dog;
    @Test
    public void contextLoads() {
        System.out.println(dog);
    }
}

↑运行以上程序,输出结果,如-"图p4"

⑷ 松散绑定规则:
- 实体类属性字段使用"驼峰命名"。
- .yaml配置文件的属性字段名字中间使用"-"来命名。

springboot项目启动如何通过启动命令切换数据库连接_spring_03


图p4

2.2 JSR303数据校验及常见校验参数

1. 使用@Validated实现数据校验
- Springboot中可以用@validated来校验数据,
如果数据异常则会统一抛出异常,方便异常中心统一处理。
我们这里来写个注解让我们的name只能支持Email格式。

⑴ 实体类Person
@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated  //数据校验
public class Person {
    @Email(message="邮箱格式错误") //name必须是邮箱格式    
    private String name;
 }

⑵ .yaml配合文件设置person的值
person:
  name: linzk123
  age: 13
  birth: 2020/11/14
  maps: {k1: v1, k2: v2}
  lists:
    - code
    - music
    - girl
  dog:
    name: 旺财
    age: 3
    
⑶ 测试
@SpringBootTest
public class SpringbootApplicationTests {
    @Autowired
    private Person person;
    @Test
    public void contextLoads() {
        System.out.println(person);
    }
}
↑ 运行上面测试类,报错name不是一个合法邮箱。

---------------------------------------------------

2. 常见的校验参数
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;

---------------------------------------------------

3. 几种用于校验的注解
⑴ 空检查
@Null       验证对象是否为null
@NotNull    验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank   检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty   检查约束元素是否为NULL或者是EMPTY.    
Booelan检查
@AssertTrue     验证 Boolean 对象是否为 true  
@AssertFalse    验证 Boolean 对象是否为 false  

⑵ 长度检查
@Size(min=, max=) 
-->验证对象(Array,Collection,Map,String)长度是否在给定的范
围内  
@Length(min=, max=) string is between min and max included.

⑶ 日期检查
@Past       验证 Date 和 Calendar 对象是否在当前时间之前  
@Future     验证 Date 和 Calendar 对象是否在当前时间之后  
@Pattern    验证 String 对象是否符合正则表达式的规则

⑷ 其余更多自行查找官方文档资料..

3. 多环境配置及配置文件位置

3.1 配置文件的存放位置优先级

1. "项目下"和"资源下"的配置文件位置说明,如-"图ap1"
2. 配置文件加载位置顺序,优先级:
⑴ springboot 启动会扫描以下位置的application.properties或者
application.yml文件,作为Spring boot的默认配置文件:

优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件

--->以上↑程序读取配置文件的优先级,从上到下,由高到底,
--->高优先级的配置会覆盖低优先级的配置。

springboot项目启动如何通过启动命令切换数据库连接_后端_04


图ap1

3.2 多环境下多个配置文件的切换

3.2.1 多环境切换(.properties配置文件)

1. 配置文件指定规则
⑴ 我们在主配置文件编写的时候,文件名可以是:
--> application-{profile}.properties/yml.
--> 用来指定多个环境版本.

2. 多个配置文件创建举例:
⑴ 例如:
application-test.properties 代表测试环境配置
application-dev.properties 代表开发环境配置
application.properties 默认的配置文件

⑵ 但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;
我们需要通过这个application.properties默认的配置文件来选择指定需要激活/切换的环境:
- 比如在三个配置文件中,都指定了不同的端口号,他默认会使用application.properties的端口号。
- 比如在默认的配置文件中要指定使用dev环境,我们就需要在默认的application.properties配置文件中
输入:pring.profiles.active=dev
- 我们启动SpringBoot,就可以看到已经切换到dev下的配置了;

3.2.2 多环境切换(.yml配置文件)

1. 如果想使用.yml也创建多个配置文件,以此来切换环境。使用.yml更方便
- 首先如果有一个主配置文件和两个副配置文件。
- 我们只需要在主配置文件中,以"---"隔开,就可以在一个文件中配置多个配置文件。
2. 案例演示
- 和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件!
- 即.yml在一个配置文件中就可以实现三个配置文件的创建。
server:  
    port: 8081
#选择要激活那个环境块
spring:  
    profiles:    
    active: prod
---
server:  
    port: 8083
spring:  
    profiles: dev #配置环境的名称

---
server:  
    port: 8084
spring:  
    profiles: prod  #配置环境的名称
    
↑上面是在同一个.yml配置文件输入了三个配置文件的内容,
我们在.yml配置文件中以"---"隔开,就能在一个配置文件中创建多个.yml的配置文件。
-->即:一个.yml文件就完成需创建多个.properties配置文件才可完成的事。

3.3 .yml和.properties配置文件同时使用情况

1. 注意:如果yml和properties同时都配置了端口,
并且没有激活其他环境 , 默认会使用properties配置文件的!