SpringBoot学习(三)YAML语法、JSR303校验、多环境开发切换

文章目录

      • 一、YAML语法
        • 1、YAML解释
        • 2、YAML基础语法
        • 3、使用YAML注入配置文件
        • 4、使用指定的`properties`配置文件加载属性
      • 二、JSR303检验
      • 三、多环境开发

一、YAML语法

1、YAML解释

百度百科:

YAML是一个可读性高,用来表达数据序列化的格式。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
开发的这种语言时,YAML 的意思是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

2、YAML基础语法

  • 传统的xml配置
server.port=8511
  • yaml配置
server:
  port: 8512

yaml语法规范:

  1. 空格不能省略
  2. 层级关系通过缩进来控制,比如上面的server.port,server下的一个缩进就代表port是server的一个属性。

3、使用YAML注入配置文件

  1. 新建实体类 PersonDog,使用lombok

lombok依赖:

<dependency>
     <groupId>org.projectlombokgroupId>
     <artifactId>lombokartifactId>
dependency>

实体类:Person

package com.zyh.pojo;

import lombok.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component //把类注册到容器中
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
public class Person {

    private String name;
    private int age;

}

Dog

package com.zyh.pojo;

import lombok.*;
import org.springframework.stereotype.Component;

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

@Component
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class Dog {
    private String name;
    private int age;
    private boolean security;
    private Date birthday;
    private Map<String,Object> maps;
    private List lists;
    private Person host;
}

  1. 编写一个application.yaml配置文件来给对象注入属性值
dog:
  name: 旺财
  age: 3
  #boolean值
  security: true
  #Date
  birthday: 2017/9/9
  #Map
  maps: {k1: v1,k2: v2}
  #List
  lists:
    - run
    - jump
    - sing
  #自定义对象  
  host:
    name: zyh
    age: 20
  1. 我们在yaml中写好值后,在实体类使用@ConfigurationProperties(prefix = "dog")中导入值。

@ConfigurationProperties(prefix = "dog")的作用:

将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应

package com.zyh.pojo;

import lombok.*;
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
@ConfigurationProperties(prefix = "dog")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class Dog {
    private String name;
    private int age;
    private boolean security;
    private Date birthday;
    private Map<String, Object> maps;
    private List lists;
    private Person host;
}

  1. 添加spring-boot注解处理器的依赖
<dependency>
     <groupId>org.springframework.bootgroupId>
     <artifactId>spring-boot-configuration-processorartifactId>
     <optional>trueoptional>
dependency>
  1. 在SpringBoot测试类中测试:
package com.zyh;

import com.zyh.pojo.Dog;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot02YamlApplicationTests {

    //注入对象
    @Autowired
    private Dog dog;
    @Test
    void contextLoads() {
        System.out.println(dog);
    }
}

执行结果:
在这里插入图片描述

4、使用指定的properties配置文件加载属性

  1. 新建一个properties文件
name=zhaoyuhang
age=23
  1. 在实体类中导入属性值
package com.zyh.pojo;

import lombok.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component //把类注册到容器中
@PropertySource(value = "classpath:zhaoyuhang.properties")//导入配置文件
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
public class Person {
    //使用@Value读取配置文件中的属性值
    @Value("${name}")
    private String name;
    @Value("${age}")
    private int age;

}

  1. 测试:
package com.zyh;

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

@SpringBootTest
class Springboot02YamlApplicationTests {

    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

执行结果:
SpringBoot学习(三)YAML语法、JSR303校验、多环境开发切换_第1张图片

@ConfigurationpPropertie和@Value对比

@ConfigurationpPropertie @Value
功能 批量注入配置文件中的属性 只能注入单个属性
El表达式 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

二、JSR303检验

JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 。

  
@Validated    //使用JSR303校验

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

空检查
@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 对象是否符合正则表达式的规则
 

测试:实体类中添加JSR303校验

package com.zyh.pojo;

import lombok.*;
import org.hibernate.validator.constraints.Length;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Component //把类注册到容器中
@ConfigurationProperties(prefix = "person")
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
//JSR303校验
@Validated
public class Person {
    //使用@Value读取配置文件中的属性值
    @Size(min = 6,max = 15)
    @NotNull
    private String name;
    private int age;

}

测试类测试:

package com.zyh;

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

@SpringBootTest
class Springboot02YamlApplicationTests {
    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

执行结果:运行报错
SpringBoot学习(三)YAML语法、JSR303校验、多环境开发切换_第2张图片

三、多环境开发

我们在创建一个SpringBoot项目的时候,默认的配置文件是properties格式的,但在SpringBoot中我们一般都使用yaml配置。

我们在编写配置文件的时候,文件名可以是application.properties或application.yaml
但是我们可以在编写一些测试和开发的环境
例如:
application-dev.properties
application-test.properties

这就是使用properties配置文件的弊端,必须手动编写多个配置文件来配置多环境开发,但如果使用yaml配置,就无须在编写那么多的配置文件,只需要在主配置文件中使用三个中划线分开即可。

server:
  port: 8081
spring:
  profiles:
    active: dev # 切换环境
---
server:
  port: 8082
spring:
  profiles: test #配置环境的名字
---
server:
  port: 8083
spring:
  profiles: dev

开启服务:运行端口为选择的dev环境端口。
SpringBoot学习(三)YAML语法、JSR303校验、多环境开发切换_第3张图片

你可能感兴趣的:(SpringBoot)