配置文件

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

  • application.properties

  • 语法结构 :key=value

  • application.yml(官方推荐使用)

  • 语法结构 :key:空格 value

配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;


YAML概述

YAML是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

比较:

xml:

<server>
    <port>8081</port>
</server>

yaml:

server:
  port: 8082

yaml基础语法

语法要求严格!

1、空格不能省略

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

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

yaml:

#普通的key-value
server:
  port: 8082

#对象
student:
  id: 01
  pwd: admin

#行内写法

student2: {id: 01,pwd: admin}

#数组

number:
  - one
  - two
  - four

number2: [one,two,four]

对比:properties

# 只能保存键值对
name =hecn

student.name= hecn
student.id= 0002

yaml注入配置文件

普通的注入方式:

  1. 在springboot项目中的resources目录下新建一个文件 application.yml

  2. 编写一个实体类 hero;

package com.hecn.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

/**
 * @author hecn
 * @site hecn.gitee.io
 * @discription
 */
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hero {
    private int id;
    private double hp;
}
  1. 给bean注入属性值的
package com.hecn.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

/**
 * @author hecn
 * @site hecn.gitee.io
 * @discription
 */
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Hero {
    private int id;
    private double hp;
}
  1. 测试类:
package com.hecn;

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

@SpringBootTest
class Springboot02ConfigApplicationTests {

  @Autowired // 自动注入hero
  Hero hero;

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

输出的结果:Hero(name=德玛西亚之力, hp=1000.0)

yaml注入

  1. 编写实体类
package com.hecn.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

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

/**
 * @author hecn
 * @site hecn.gitee.io
 * @discription
 */
@Component // 注册bean到容器中
@Data
@AllArgsConstructor
@NoArgsConstructor
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 Hero hero;

  // 有参无参构造、get、set方法、toString()方法
}
  1. 编写yaml配置
person:
  name: 张三
  age: 21
  happy: false
  birth: 2000/01/01
  maps: {key1: v1,key2: v2}
  lists:
    - code
    - girl
    - music
  hero:
    name: 赵信
    hp: 178
  1. 通过@ConfigurationProperties(prefix = "person")可以注入到类中
package com.hecn.pojo;

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

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

/**
 * @author hecn
 * @site hecn.gitee.io
 * @discription @ConfigurationProperties作用: 将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉SpringBoot将本类中的所有属性和配置文件中相关
 *     的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
 */
@Component // 注册bean到容器中
@ConfigurationProperties(prefix = "person")
@Data
@AllArgsConstructor
@NoArgsConstructor
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 Hero hero;

  // 有参无参构造、get、set方法、toString()方法
}
  1. IDEA 提示,springboot配置注解处理器没有找到,让我们看文档,我们可以查看文档,找到一个依赖!
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>
  1. 确认以上配置都OK之后,去测试类中测试一下:
package com.hecn;

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

@SpringBootTest
class Springboot02ConfigApplicationTests {


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

  @Test
  void contextLoads() {

    // 打印person信息
    System.out.println(person);
  }
}

结果:Person(name=张三, age=21, happy=false, birth=Sat Jan 01 00:00:00 CST 2000, maps={key1=v1, key2=v2}, lists=[code, girl, music], hero=Hero(name=赵信, hp=178.0))

加载指定的配置文件

@PropertySource :加载指定的配置文件;

@configurationProperties:默认从全局配置文件中获取值;

  1. 在resources目录下新建一个person.properties文件
name=hecn
  1. 然后在代码中指定加载person.properties文件
@Component // 注册bean到容器中
//@ConfigurationProperties(prefix = "person")
@PropertySource(value = "classpath:person.properties")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
  @Value("${name}")
  private String name;
  ......
}
  1. 测试
  2. 结果:Person(name=hecn, age=null, happy=null, birth=null, maps=null, lists=null, hero=null)

配置文件占位符

配置文件还可以编写占位符生成随机数

person:
  name: 张三${random.uuid} # 随机uuid
  age: ${random.int}
  happy: false
  birth: 2000/01/01
  maps: {key1: v1,key2: v2}
  lists:
    - code
    - girl
    - music
  hero:
    name: ${person.hello:other}_英雄
    hp: 178

结果:Person(name=张三0b2797b0-57ab-4d63-b940-3515c601b74f, age=1219869526, happy=false, birth=Sat Jan 01 00:00:00 CST 2000, maps={key1=v1, key2=v2}, lists=[code, girl, music], hero=Hero(name=other_英雄, hp=178.0))

结论:

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

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

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!


SpringBoot      SpringBoot

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!