SpringBoot中的配置文件

  • 一、application.properties
  • 二、application.yml
  • 1、yaml基础语法
  • 2、yaml支持的三种数据结构:
  • 三、配置文件值注入
  • (1)@Value
  • (2)@ConfigurationProperties将属性注入到实体类中
  • (3)@Value和@ConfigurationProperties的区别:
  • (4)@PropertySource
  • (5)@ImportResource
  • 四、配置文件占位符
  • 五、Profile
  • (1)多profile文件形式:
  • (2)yml的文档块模式
  • (3)命令行的方式
  • (4)虚拟机参数配置
  • 六、配置文件加载位置


  • SpringBoot全局配置文件有两种写法且配置文件名称是固定的,配置文件主要用来修改SpringBoot自动配置的默认值。
  • 配置文件在src/main/resources目录或者类路径/config

一、application.properties

语法结构 :key=value

server.port=8080

二、application.yml

语法结构 :

key:
	value

yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中
,比json、xml等更适合做配置文件。以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yml和xml;

传统xml配置:

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

yaml配置:(更加简洁,更能凸显出数据)

server:
  prot: 8080

1、yaml基础语法

  • 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
  • 属性和值的大小写十分敏感。
  • 缩进时不允许使用Tab键,只允许使用空格,缩进的空格数目不重要。
  • 冒号后面要跟空格来分开键值。

2、yaml支持的三种数据结构:

  • 对象:键值对的集合
  • 数组:一组按次序排列的值
  • 字面量:单个的、不可再分的值

(1) 对象(或Map键值对)

#对象、Map格式
k: 
    v1:
    v2:

对象的属性和值得关系,注意缩进;

student:
    name: lisi
    age: 3

写成一行:

student: {name: lisi,age: 3}

(2)数组(或 List、set )

- 值表示数组中的一个元素,比如:

pets:
 - cat
 - dog
 - pig

写成一行:

pets: [cat,dog,pig]

(3)字面量
数字、字符串、布尔、日期

字符串

  • 默认不使用引号
  • 可以使用单引号或者双引号,单引号会转义特殊字符
  • “ ” 双引号,不会转义字符串里面的特殊字符 ;
    比如 :name: “kuang \n shen” 输出 :kuang 换行 shen
  • '' 单引号,会转义特殊字符
    比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen

(4)文档分隔
多个文档用- - - 隔开

三、配置文件值注入

application.yml:

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

配置文件值注入有两种方式@Value和@ConfigurationProperties。

(1)@Value

@Component 
public class Person {
	@Value("${person.name}")
    private String name;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean happy;
}

(2)@ConfigurationProperties将属性注入到实体类中

@Component 
@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;
}

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

需要导入:

<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

(3)@Value和@ConfigurationProperties的区别:

@ConfigurationProperties

@Value

功能

批量注入配置文件种的属性

一个个注入

松散绑定

支持

不支持

SpEL

不支持

支持

JSR303校验

支持

不支持

复杂类型封装

支持

不支持

1)松散绑定:
如果配置文件中person的一个属性为firstName,那么松散绑定也就意味着在使用@ConfigurationProperties注入属性时,以下方式都是等价的:

person.firstName:
person.first-name:
person.first_name:
PERSON_FIRST_NAME:

2)SpEL:
@Value支持spring的表达式语言:

@Value("#{11*2}")
    private Integer age;

3)JSR303校验
使用@ConfigurationProperties时支持JSR303数据校验,使用@Validated注解

@Component 
@Validated
@ConfigurationProperties(prefix = "person")
public class Person {
	@Email   //name必须是邮箱格式
    private String name;
}

4)复杂类型封装

@Component 
public class Person {
	@Value("${person.maps}")
    private Map<String,Object> maps;
}

对于上面这样,使用@Value注入复杂类型的值,就会报错。

注意:

  • 如果我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接使用@configurationProperties
  • 如果只是在应用中需要使用配置文件中的某项值,就直接使用@Value就好了。

(4)@PropertySource

  • 可以使用@PropertySource ,加载指定的配置文件,只能用于properties文件
@PropertySource(value = "classpath:person.properties")
  • @configurationProperties:默认从全局配置文件中获取值;
@ConfigurationProperties(prefix = "person")

(5)@ImportResource

导入Spring配置文件,并让内容生效。

@SpringBootApplication

@ImportResource(locations={"classpath:beans.xml"})

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

四、配置文件占位符

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

person:
    name: lisi${random.uuid} # 随机uuid
    age: ${random.int}  # 随机int
    happy: false
    birth: 2000/01/01
    maps: {k1: v1,k2: v2}
    hello: hello
    lists:
      - code
      - girl
      - music
    dog:
      name: ${person.hello:other}_旺财
      age: 1

name: ${person.hello:other}_旺财:如果person.hello存在则输出:hello对应的值,若不存在则输出othor。这里冒号指定的就是默认值。

五、Profile

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数来快速切换环境。

(1)多profile文件形式:

格式:application-{profile}.properties/yml:

例如:

  • application-dev.properties //开发环境
  • application-test.properties //测试环境
  • application-prod.properties //生产环境

默认使用application.properties中的配置,如果要激活某个环境就需要在默认配置文件application.properties/yml 中配置spring.profiles.active=dev

(2)yml的文档块模式

server:
  port: 8081
spring:
  profiles:
    active: dev  
---
server:
  port: 8082
spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: prod

(3)命令行的方式

1)在启动时,指定配置文件。

spring boot 配置文件 集合类型 spring boot的配置文件有哪些?_spring

2)-jar的方式运行时指定配置文件

java -jar springBoot.jar --spring.profiles.active=prod

(4)虚拟机参数配置

spring boot 配置文件 集合类型 spring boot的配置文件有哪些?_jar包_02

六、配置文件加载位置

1、配置文件的默认加载位置

SpringBoot启动会扫描以下位置的application.properties或者
application.yml文件作为Spring boot的默认配置文件。

  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/

以上是按照优先级从高到低的顺序,高优先级配置内容会覆盖低优先级配置内容,且各配置文件的内容也会互补(会加载上面位置中所有的配置文件)。

spring boot 配置文件 集合类型 spring boot的配置文件有哪些?_jar包_03


注意:

  • 1、2属于工程包下的配置文件,打jar包时并不会将它们打包进来,jar包文件中只会包含类路径下的配置文件3、4.

2、外部配置文件的加载

(1)项目打包好之后,我们也可以通过命令行参数的方式使用spring.config.location来改变默认配置。

java -jar springboot.jar --spring.config.location=C:/application.properties

(2)命令行参数:多个参数时,中间可以用空格分开。

java -jar springboot.jar --server.port=8095

(3)也可以在jar包外部写配置文件:

spring boot 配置文件 集合类型 spring boot的配置文件有哪些?_配置文件_04

  • jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  • jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  • jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  • jar包内部的application.properties或application.yml(不带spring.profile)配置文件