实际上配置文件application.properties还有application.yaml(application.yml)
我自己实际使用中,就是感觉用yaml能省不少,但是要注意换行空格符号,举个例子有两个属性:server.port 和server.name

propertise

server.port=8081
server.name=zp

yaml

server:
  prot: 8080
  name:zp

如果我们平时配置的名字够长够多,XXX.YYY.ZZZ.MMM.NNN实际上yaml能少些不少,但是可读性没有propetise那么好可读。

yaml的语法:
(说明:语法要求严格)

1、空格不能省略

2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。

3、属性和值的大小写都是十分敏感的。

字面量:普通的值 [ 数字,布尔值,字符串 ]

字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;

k: v

注意:双引号和单引号的使用不同

“ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;

比如 :name: “kuang \n shen” 输出 :kuang 换行 shen

‘’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出

比如 :name: ‘kuang \n shen’ 输出 zhang: \n san

对象、Map(键值对)
#对象、Map格式
k: 
    v1:
    v2:

数组( List、set )
用 - 值表示数组中的一个元素,比如:

pets:
 - cat
 - dog
 - pig

实际上转化的行内写法

pets: [cat,dog,pig]

关于读取配置文件

使用@Value

先有一个Dog实体类,并用@Value设置值

package com.example.demo.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component  //注册bean到容器中
public class Dog {
    @Value("阿黄")
    private String name;
    @Value("18")
    private Integer age;

    //有参无参构造、get、set方法、toString()方法


    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类

@SpringBootTest
class DemoApplicationTests {

//	@Test
//	void contextLoads() {
//	}


	@Autowired //将狗狗自动注入进来
	Dog dog;

	@Test
	public void contextLoads() {
		System.out.println(dog); //打印看下狗狗对象
	}

}

Java 生产yml文件 yml文件写法_spring boot

使用yaml + @ConfigurationProperties

先定义一个Person对象在yaml文件上,如下:

person:
  name: zp
  age: 29
  happy: false
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - girl
    - music
  dog:
    name: 旺财
    age: 1

然后再有一个person实体类

/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@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 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;
    }

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

测试类写测试方法,注入相关bean

@Autowired
	Person person; //将person自动注入进来

	@Test
	public void contextLoads1() {
		System.out.println(person); //打印person信息
	}

输出

Java 生产yml文件 yml文件写法_Java 生产yml文件_02

@PropertySource 和@configurationProperties对比

@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;

@Value和@ConfigurationProperties

Java 生产yml文件 yml文件写法_配置文件_03


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

2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下

3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性

4、复杂类型封装,yml中可以封装对象 , 使用value就不支持

结论:

配置yml和配置properties都可以获取到值 , 强烈推荐 yml;

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接推荐使用@configurationProperties!