SpringBoot的yaml配置及应用

环境问题:

  1. SpringBoot单元测试Junit5与idea版本会有问题,导致无法单元测试!
    解决方案:加pom.xml文件中的依赖。
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.5.2</version>
</dependency>
  1. 为了使idea中不会对@ConfigurationProperties注解不报红,需要导入依赖!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

3.JSR303数据校验需要导入的依赖!

<dependency><!--数据校验依赖,为了实现@Email注解-->
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

1.banner修改SpringBoot的启动图案

在resources目录下创建一个banner.txt文件

(¸¸.♥➷♥•*¨)¸.•´¸.•*¨) ¸.•*¨)                               
(¸.•´(¸. ¸.•´¸.•*¨) ¸.♥➷•*¨)                               
─▀██▀─▄███▄─▀██─██▀██▀▀▀█─                                 
──██─███─███─██─██─██▄█──conquers                    
──██─▀██▄██▀─▀█▄█▀─██▀█──all ♥➷♥                         
─▄██▄▄█▀▀▀─────▀──▄██▄▄▄█                                  
¸.•´¸.•*¨) ¸♥.•*¨) (¸.•´¸♥➷♥¸.•´♥¸.•´♥¸.•*¨)♥.•*¨)¸.•*♥¸ 

就可以修改SpringBoot启动时的图案显示

2.yaml(yml)文件

说明:语法要求严格!

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

实例:

  1. 创建一个实体类
package com.chen.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;


@Component/*相当于<Bean id="" ...> 类注入功能*/
@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;

    public Person() {
    }

    public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> maps, List<Object> lists, Dog dog) {
        this.name = name;
        this.age = age;
        this.happy = happy;
        this.birth = birth;
        this.maps = maps;
        this.lists = lists;
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", happy=" + happy +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getHappy() {
        return happy;
    }

    public void setHappy(Boolean happy) {
        this.happy = happy;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}

  1. 在resources目录中创建一个application.yaml文件
person:
  name: cjs${random.uuid}
  age: ${random.int}
  happy: false
  birth: 2021/11/6
  maps: {k1: v1,k2: v2}
  lists:
    -code
    -music
    -girl
  dog:
    name: ${person.name:chen}_cjs
    age: 5
  1. 在默认的test的类里自动装配实体类,并测试结果
package com.chen;

import com.chen.pojo.Dog;


import com.chen.pojo.Person;
import com.chen.pojo.TestUser;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot02ConfigApplicationTests {
    @Autowired/*Spring自动装配对象*/
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }



}

可以发现,在yml文件的数据可以赋值到对象对应的属性中。
@ConfigurationProperties(prefix = "person")这个注解是绑定类与yml的
prefix的值要对应实例化的参数名!

yaml与properties配置文件的区别:

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

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

3. JSR303的数据校验

创建一个实体类:

package com.chen.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.*;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@Validated/*一定要开这个注解,才能进行JSR303的数据校验*/
@ConfigurationProperties(prefix = "user")
public class TestUser {
    @NotNull(message = "名字不能为空")
    private String username;
    @Max(value = 120,message = "你的岁数真大啊")
    private int age;
    @Email(message = "邮箱格式错误")
    private String email;
    @Past(message = "生日输入有误")
    private Date birth;

}

创建对应的yml文件:

user:
  username: cjs
  age: 100
  email: 1983691635@qq.com
  birth: 2000/12/25

测试类:

package com.chen;

import com.chen.pojo.Dog;


import com.chen.pojo.Person;
import com.chen.pojo.TestUser;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot02ConfigApplicationTests {
    @Autowired/*Spring自动装配对象*/
    private TestUser user;
    @Test
    void contextLoads() {
        System.out.println(user);
    }



}

可以看到,利用JSR303的数据校验来对实体类中的数据进行多种的检验。
注意:一定要在实体类上加上@Validated注解,才能开启数据校验。

4.多环境切换

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境。

创建yaml文件:

server:
  port: 8082
#选择要激活那个环境块
spring:
  profiles:
    active: dev

---

server:
  port: 8083
spring:
  profiles: dev

---
server:
  port: 8084
spring:
  profiles: test

---

运行SpringBoot主程序,发现端口号改变了。

结论,可以通过修改active中的值,来修改SpringBoot的端口号,
同理,在开发中我们可以利用这种方式来修改程序环境!

5.配置文件加载位置

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

上一篇:python//Jan.21th,2020//bfs


下一篇:SQL优化方案