SpringBoot 有两种格式的全局配置文件

SpringBoot 使用任何一种全局配置文件功能都是一样的,配置文件名是固定的,作用都是修改 SpringBoot 自动配置的默认值

1)application.properties   Spring initializr 默认自动生成 properties 配置文件

2)application.yml     SpringBoot 还支持 YAML配置文件

 

一、YAML简介

yml 是YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件

yml 和 xml 相比,少了一些结构化的代码,使数据更直接,一目了然。

ym l和 json 呢?没有谁好谁坏,合适才是最好的。yml的语法比json优雅,注释更标准,适合做配置文件。json作为一种机器交换格式比yml强,更适合做api调用的数据交换。

1、YAML文件的语法格式   参考文章:yaml语法规范

key:(空格)value 

注意不能用tab代替空格。

    3)大小写敏感(严格区分大小写),支持字面值,对象,数组三种数据结构,也支持复合结构。

在值里用 “不会转义特殊字符,\n会换行”,‘会转义特殊字符,\n会输出’

‘#’ 表示注释,只能单行注释,从#开始处到行尾

   

    字面值:字符串,布尔类型,数值,日期。字符串默认不加引号,单引号会转义特殊字符。日期格式支持 yyyy/MM/dd HH:mm:ss

 

    对象或 Map 集合:由键值对组成,表示方法有两种:

       ① 换行缩进:由形如 key:(空格)value 的数据组成。冒号后面的空格是必须要有的,每组键值对占用一行,且缩进的程度要一致

       ② 行内写法(利用大括号):{k1: v1,....kn: vn}

     

deployment的yaml生成 yaml properties_注解@Vuale

    

deployment的yaml生成 yaml properties_注解@Vuale_02

    数组或 List 集合:也有两种表达方式:

       ① 换行缩进:由形如 -(空格)value 的数据组成。短横线后面的空格是必须要有的,每组数据占用一行,且缩进的程度要一致

       ② 行内写法(利用中括号):[v1,v2,...vn]

 

    复合结构:上面三种数据结构任意组合

 

二、Properties简介

1、properties文件的编写语法

1)properties文件是一个文本文件

2)properties文件的语法有两种:

    一种是注释:注释前面加上#号。

    一种是属性配置:以“键=值”的方式书写一个属性的配置信息。

3)properties文件的一个属性配置信息值可以换行,但键不可以换行。值换行用“\”表示。

4)properties文件的属性配置键值前后的空格在解析时候会被忽略。

5)properties文件可以只有键而没有值。也可以仅有键和等号而没有值,但无论如何一个属性配置不能没有键。

6)父属性和子属性之间是以“.”进行区分。

 

三、全局配置文件中配置数据与JavaBean绑定

(1)通过注解@ConfigurationProperties从全局配置文件中获取数据

1、创建两个JavaBean:User和Address,并添加注解

        通过SpringBoot提供的注解 @ConfigurationProperties(prefix = "") 

        

deployment的yaml生成 yaml properties_配置文件_03

    

deployment的yaml生成 yaml properties_配置文件_04

2、在pom.xml中引入配置依赖

        要在YAML配置文件中配置User类的属性数值时,这个依赖会给我们自动代码提示

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

3、使用任意一个配置文件中配置内容:

        1)application.properties 

server.port=80
#user类
user.id=2001
user.username=李四
user.pazzword=lisi123
user.birthday=2019/05/08
user.list=aaa,bbb,ccc
user.map.key1=value1
user.map.key2=value2
user.address.id=2001
user.address.detail=浙江杭州

        2)application.yml

server:
  port: 80
  #user类
user:
  id: 1001
  username: 张三
  pazzword: zhangsan123
  age: 18
  sex: true
  birthday: 2019/05/07 10:42:01
  list:
    - list1
    - list2
    - list3
  map:
    key1: value1
    key2: value2
  address:
    id: 1002
    detail: 浙江杭州

如果集合里面是对象时,如:List<Address> lists

lists:
    - id: 1002
      detail: 浙江杭州
    - id: 1003
      detail: 浙江义乌

4、在spring boot的测试单元上测试(SpringBoot 的单元测试支持对象注入比junit安逸多了)

     

deployment的yaml生成 yaml properties_配置文件_05

 

deployment的yaml生成 yaml properties_注解@Vuale_06

  

 

(2)通过注解@Vuale从全局配置文件中获取数据

spring提供了一个@Value注解,获取全局配置文件中的某个配置项的数据

@Value("${}")    获取全局配置文件的数据

@Value("#{}")    #{} 里面写 spring表达式,可以计算后注入数据

@Value("")  直接写字面量的普通值注入数据

@Component
//@ConfigurationProperties(prefix = "user")
public class User implements Serializable {
    private static final long serialVersionUID = 5423119138162218022L;

    @Value("${user.id}")
    private long id;
    @Value(value = "${user.username}")
    private String username;
    @Value(value = "${user.pazzword}")
    private String pazzword;
    @Value("#{10+18}")
    private int age;
    @Value("true")
    private boolean sex; //ture-男, false-女
    @Value("2019/05/10")
    private Date birthday;
    private List<String> list;
    private Map<String, Object> map;
    private Address address;

    get/set方法
}

运行测试类:

  

deployment的yaml生成 yaml properties_配置文件_07

两个注解的的区别:

    @ConfigurationProperties:是和JavaBean的所有属性绑定

    @Value:是一个一个属性绑定

   

    @ConfigurationProperties:不支持spring表示式的写法

    @Value:支持spring的表达式的写法,#{12+13}

   

    @ConfigurationProperties:支持JSR303数据校验

    @Value:不支持JSR303数据校验

 

    @ConfigurationProperties:支持复杂类型的绑定,比如Map,List

    @Value:不支持复杂的类型绑定,比如${user.map}是读不出数据的

四、在 resources目录下,自定义 user.properties 文件

    项目启动并不会自动的加载该自定义配置文件,

    如果在 XML 配置中,通过如下方式引用该 properties 文件:

<context:property-placeholder location="classpath:user.properties"/>

    如果在 Java 配置中,通过 @PropertySource 来引入该 properties 文件:

@Component
@PropertySource("classpath:user.properties")
@ConfigurationProperties(prefix = "user")
public class User implements Serializable {
    ...
}

      此时,当项目启动时,就会自动加载 user.properties 文件。这只是 Spring 中属性注入的用法,和 Spring Boot没有任何关系。然后使用按需选择@ConfigurationProperties还是@Vuale注解。

 

结论或建议:

    1)当有JavaBean与全局配置文件里的数据对应的时候,就使用@ConfigurationProperties注解

    2)当只是需要配置文件中某一个值的时候,就使用@Value注解

    3)在resources目录下创建两个配置文件,一个为application.yml配置文件,另一个为application.properties配置文件;

    结论:在同一目录下,properties配置优先级 > YAML配置优先级。//所以我们在jar包启动时带上properties写法的配置可以覆盖配置