目录:

1、springboot配置文件简介2、yaml 语法
    2.1、字面量
    2.2、对象、map
    2.3、list 或 set
3、yml配置文件属性的获取(配合@ConfigurationProperties使用)
4、@ConfigurationProperties与@Value区别
5、@PropertySource、@ImportResource
6、配置文件占位符
7、Profile多环境支持
8、配置文件的加载位置
9、外部配置加载顺序

1、springboot配置文件简介    <--返回目录

  springboot使用一个全局的配置文件application.properties或application.yml。配置文件放在src/main/resources目录或类路径/config下。

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

  全局配置文件可以对一些默认配置进行修改,比如修改项目端口 server.port=8081。

 

2、yaml 语法    <--返回目录

  yaml 支持三种数据结构

    - 对象:键值对的集合

    - 数组:一组按次序排列的值

    - 字面量:单个的、不可再分的值

  yaml 基本语法

    - 使用缩进表示层级关系

    - 缩进时不允许使用tab键,只允许使用空格

    - 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

    - 大小写敏感

 

2.1、字面量    <--返回目录

    K: V :字面直接写。字符串默认不用加单引号或双引号。

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

        name: "zs \n lisi" => 输出 zs 换行 lisi

      '': 单引号会转义特殊字符,特殊字符最终只是一个普通的字符串数据

        name: 'zs \n lisi' => 输出 zs \n lisi

2.2、对象、map    <--返回目录

friends: 
    lastName: zs
    age: 10

  或行内写法

friends: {lastName: zs, age: 10}

2.3、list 或 set    <--返回目录

pets:
    - cat
    - dog

  或行内写法

pets: [cat, dog]

 

3、yml配置文件属性的获取(配合@ConfigurationProperties使用)    <--返回目录

  依赖(springboot版本2.1.1.RELEASE)

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

  bean 类

@Component
@ConfigurationProperties(prefix="person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date date;
    
    private Map<String, Object> map;
    private List<String> list;
    private Dog dog;
    
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Boolean getBoss() {
        return boss;
    }
    public void setBoss(Boolean boss) {
        this.boss = boss;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public Map<String, Object> getMap() {
        return map;
    }
    public void setMap(Map<String, Object> map) {
        this.map = map;
    }
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public Dog getDog() {
        return dog;
    }
    public void setDog(Dog dog) {
        this.dog = dog;
    }
    @Override
    public String toString() {
        return "Person [lastName=" + lastName + ", age=" + age + ", boss=" + boss + ", date=" + date + ", map=" + map
                + ", list=" + list + ", dog=" + dog + "]";
    }
}

  yml配置

person: 
  last-name: 张三
  age: 10
  date: 2020/11/19
  boss: false
  map: {k1: v1, k2: v2}
  list: [aaa, bbb]
  dog: 
    name: 小黄
    age: 10

  测试类

package com.oy;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.oy.bean.Person;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestPerson {
    
    @Autowired
    private Person person;
    
    /**
     * Person [lastName=张三, age=10, boss=false, date=Thu Nov 19 00:00:00 CST 2020, 
     * map={k1=v1, k2=v2}, list=[aaa, bbb], dog=Dog [name=小黄, age=10]]
     */
    @Test
    public void printPerson() {
        System.out.println(person);
    }

}

 

4、@ConfigurationProperties与@Value区别    <--返回目录

 松散语法:person.lastName  或 person.last-name  或 person.last_name

 

5、@PropertySource、@ImportResource    <--返回目录

  @PropertySource:导入properties资源文件

  java bean

@Validated
@PropertySource("classpath:person.properties")
@Component
@ConfigurationProperties(prefix="person")
public class Person {
    private String lastName;
   @NotNull
    private Integer age;
    // getXxx和setXxx省略
}

  person.properties

person.lastName=zs

  测试代码

package com.oy;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.oy.bean.Person;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestPerson {
    
    @Autowired
    private Person person;
    
    @Test
    public void printPerson() {
        System.out.println(person);
    }

}

 

  @ImportResource:导入spring的配置文件,让配置文件里面的内容生效。

@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
}

 

6、配置文件占位符    <--返回目录

  配置文件使用占位符

person.lastName=${random.uuid}
person.age=${random.int}
person.dog.name=${person.hello:hello}_dog

  ${person.hello:hello}_dog: 首先去取person.hello这个属性,找不到取冒号“:”后面的默认值。

${random.uuid}:随机数 ${random.int}, ${random.long}, ${random.int(10)}, ${random.int[1024,65535]}等

 

7、Profile多环境支持    <--返回目录

springboot 应用其他配置文件的值 springboot外部配置文件yml_jar

 

 激活方式:

  - 命令行: java -jar xxx.jar --spring.profiles.active=dev

  - 配置文件(application.properties): spring.profiles.active=dev

  - jvm参数: -Dspring.profiles.active=dev

 

8、配置文件的加载位置    <--返回目录

   springboot启动会扫描一下位置的application.properties或者application.yml文件作为springboot的默认配置文件

项目根目录/config
项目根目录/
classpath:/config
classpath:/

  优先级由高到低,高优先级的配置会覆盖低优先级的配置。springboot会从这四个位置全部加载主配置文件,形成"互补配置"。

  注意:springboot的那个打包插件默认不会将项目目录下的其他文件打进jar包。

 

9、外部配置加载顺序    <--返回目录

springboot 应用其他配置文件的值 springboot外部配置文件yml_jar_02

 

  优先级由高到低,形成"互补配置"。

  命令行参数配置例子:java -jar demo.jar --server.port=8081  --spring.profiles.active=dev。

  对上述6-9的总结:由jar包外向jar包内进行寻找;优先加载带profile的。

  如果需要配置的命令行参数过多,可以考虑在jar包外(与jar同一级目录)添加配置文件,比如

springboot 应用其他配置文件的值 springboot外部配置文件yml_spring_03

---