springboot系列之配置文件

Springboot使用一个全局的配置文件,配置文件名是固定的,如application.properties或者application.yaml。
springboot除了使用application.properties作为配置文件以外,还使用了一种yaml格式的文件作为配置文件,如application.yaml。

一、yaml文件

yaml 是YAML Ain't Markup Language 的缩写,有如下两种解读方式:YAML A Markup Language:是一个标记语言; YAML isn't Markup Language:不是一个标记语言;其实就是一种配置文件。
我们以前使用的配置文件大多都是xxxx.xml的文件,xml格式作为配置文件来说是非常笨重的,因为它带有大量的格式化标记。而YAML文件则以数据为中心,因此yaml比json、xml等更适合做配置文件。

例如:采用yaml作为配置文件时:

server:
 port: 8080

采用xml作为配置文件时:

<server>
	<port>8080</port>
</server>

从以上即可看出yaml比xml更加清爽,也更加简洁,yaml主要以数据为中心。


1、yaml基本语法

  • 以键值对的一种形式表示,如Key: value,需要注意的是value和冒号之间必须要有一个空格;

  • 使用缩进表示层级关系,只要是左对齐的一列数据,都是同一个层级的;

  • 属性和值都是大小写敏感的;

  • 缩进时不允许使用Tab键,只允许使用空格;

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

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

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

3、yaml配置举例

# 字面量可以直接如下配置,字面量包含:数字、字符串、布尔、日期
# 字符串需要注意:字符串默认是不使用引号,我们可以使用单引号或者双引号,
# 但单引号会转义特殊字符,双引号则不转义特殊字符,会以特殊字符本身为值
name: jason

# 对象的配置
person:
   name: jason
   age:22
   addr:chengdu
# 对象的行内配置(行内对象冒号之后也要有空格)
person: {name: jason,age: 18,addr: chengdu}

# 配置数组、集合(配置普通字符串)
city:
  - beijing
  - tianjin
  - shanghai
  - chongqing
# 数组行内配置
city: [beijing,tianjin,shanghai,chongqing]

# 配置对象数据,一个 - 代表一个对象
person:
  - name: tom
    age: 18
    addr: beijing
  - name: lucy
    age: 17
    addr: shanghai
# 行内配置
person: [{name: tom,age: 18,addr: beijing},{name: lucy,age: 17,addr: shanghai}]

# 配置Map集合
map:
  key1: value1
  key2: value2

二、将配置文件值注入到组件中

将配置文件中的值注入到组件中有两种方式:@Value注解 和 @ConfigurationProperties注解。

首先来看一下使用@Value 和 @ConfigurationProperties注解进行注入值时的区别:

1、采用@ConfigurationProperties注解注入值

yaml配置文件内容如下:

person:
  age: 14
  name: jason
  id: 1

java bean如下:

@Component
// 将配置文件中配置的每一个属性的值,都映射到这个bean中的属性上
// @ConfigurationProperties注解将会把yaml中的配置的属性和该类中的属性进行一一映射绑定,
// prefix用于表示将配置文件中那个前缀下面的所有属性与这个Person类进行一一映射
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
    private Integer id;
    private String name;
    private Integer age;
}

在使用@ConfigurationProperties注解进行属性映射赋值时,需要注意只有当这个组件是容器中的组件时,才可以使用该注解进行属性映射。

在进行属性映射时,为了能够与bean快速进行匹配时,可以添加如下依赖,将在处理映射时会有自动提示,只需要在pom.xml文件中加入如下依赖:

<!-- 配置文件处理器,导入之后在进行配置映射时会有自动提示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

2、采用@Value注解注入值

@Component
@Data
public class Person {
    @Value("${person.id}")
    private Integer id;
    @Value("${person.name}")
    private String name;
    @Value("${person.age}")
    private Integer age;
}

3、何时使用@ConfigurationProperties注解,何时使用@Value注解

  • 当我们只需要在某个业务逻辑中获取一下配置文件中少量的配置项时,使用@value注解;
  • 当我们专门编写了一个javaBean来和配置文件进行映射时,即需要大量映射属性时,使用@ConfigurationProperties注解。

三、@PropertySource、@ImportResource和@Bean注解

1、@PropertySource注解:作用是加载指定的配置文件,有个value属性用于指定配置文件的位置,如@PropertySource(value="classpath:person.properties"),可以是多个,多个就用{}然后每个之间用逗号分隔即可。

2、@ImportResource注解:作用导入spring配置文件,让配置文件里面的内容生效;

Springboot中没有spring的配置文件,我们自己编写的配置文件它也不能自动识别,这时就需要我们自动导入这个配置文件使其生效,@ImportResource标注在一个配置类上,如@ImportResource(locations="classpath:beans.xml"),可以是多个,多个就用{}然后每个之间用逗号分隔即可。

3、@Bean注解:作用是给容器中添加一个bean组件。


四、配置文件占位符

1、随机数

2、占位符获取之前配置的值,如果没有可以使用冒号:指定默认值

person:
    age: 14
    name: jason
    id: ${person.age} # 把age赋值给id
person.age=14
person.name=jason
# 如果age没有值,则取默认值1
person.id=${person.age:1}

五、Profile

我们在开发的时候会有不同的开发环境,profile文件的作用就是方便我们切换到不同的环境中。我们在编写profile配置文件时,文件名可以是application-{profile}.properties或者application-{profile}.yaml
springboot默认使用的是application.properties配置文件;

1、yaml支持多文档块,也就是说我们将不同的配置写在同一个yaml文件中,采用文档块的形式。如下所示:

2、激活指定的profile

激活profile有如下三种方式:

  • 在配置文件中指定spring.profiles.active=dev
  • 通过命令行的方式指定,如:java -jar xxx.jar --spring.profiles.active=dev;
  • 通过设置虚拟机参数指定:-Dspring.profile.active=dev; 注:需要在IDEA中运行项目时设置。

六、springboot配置文件加载顺序


springboot 会从这四个位置加载全部配置文件,这些配置文件最终会形成互补配置,也就是说如果一个配置项在a配置文件里面没有,而在b文件里面有,则取b文件里面的值。
项目打包好以后,我们也可以使用命令行参数的形式来指定项目启动时要用的配置文件的新位置,指定的配置文件和默认加载的这些配置文件共同起作用形成互补配置;
例如java -jar xxx.jar --spring.config.location=E:/application.properties

以上就是关于springboot配置文件相关的总结。

posted @ 2019-08-22 16:59  jason小蜗牛  阅读(2131)  评论(0编辑  收藏  举报