一、概述

我们知道SpringBoot有很多自动配置,但是有时候我们会根据需要去修改这个自动配置,例如修改tomcat的端口等等,所以就需要配置文件来定制我们的配置,在使用SpringBoot的向导创建的时候,自动给我们创建了一个文件resources/application.properties

springboot 打包后 找不到文件_spring

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

  • application.properties
  • application.yml

使用这两个之中的一个即可,后面会介绍优先级问题。

二、Properties语法

Properties语法规则我们应该很熟悉,在很多地方的有应用,他的基本规则介绍key=value

三、YMAL语法

1.简介
  • yaml语法用k(空格):v来表示一个键值对(空格是必须的);
  • 通过空格的方式来控制层级关系,空格数量多少并没有严格规定,只需要左对齐的一列数据这都被认为是同一个层级的
  • 区分大小写
server:
  port: 8082
2.字面量的写法

字符串,布尔类型,数值,日期这些类型直接以k(空格):v形式来写,但是要注意字符串默认不用加双引号,如果加上了引号,双引号和单引号是有区别的

  • 双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
  • 单引号:
3.对象的写法
friends:
  lastName: zhangsan
  age: 20

注意这里的缩进,因为ymal是通过缩进来确定层级关系的,还可以写成一行的形式

friends2: {lastName: hangsan,age: 18}
4.集合(数组)的写法

用-表示数组中的一个元素

pets:
  - cat
  - dog
  - pig

这里如果写对了的话idea会给我们提示:

springboot 打包后 找不到文件_配置文件_02

也有对应的行内写法

pets2: [cat,dog,pig]

四、配置文件值注入

1.@ConfigurationProperties

配置文件值注入就是在配置文件中将一些值注入到组件中,例如有persion实体类

@Component
@ConfigurationProperties(prefix = "persion")
public class persion {
    private String lastName;
    private Integer age;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

在yml配置文件中:

persion:
  lastName: zhangsan
  age: 18
  birth: 2017/12/12
  maps: {k1: v2,k2: v2}
  list:
    - list1
    - list2
  dog:
    name: pet
    age: 12

那么,在persion类上使用@ConfigurationProperties注解,SpringBoot会将本类中的所有属性和配置文件中的相关配置进行绑定,测试一下:

@SpringBootTest
class HelloApplicationTests {

    @Autowired
    private persion persion;

    @Test
    void contextLoads() {
        System.out.println(persion);
    }
}
//输出:
persion{lastName='zhangsan', age=18, birth=Tue Dec 12 00:00:00 CST 2017, maps={k1=v2, k2=v2}, lists=null, dog=Dog{name='pet', age=12}}

如果导入spring-boot-configuration-processor依赖的话再yml配置文件中会有提示信息

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

spring-boot-configuration-processor官方文档

2.@Value

使用@ConfigurationProperties注解可以将配置文件中相关的属性全部的注入到类i中,而使用@Value属性则是单个属性注入,例如:

@Component
//@ConfigurationProperties(prefix = "persion")
public class persion {

    @Value("张三")
    private String lastName;
    @Value("19")
    private Integer age;
    @Value("${persion.birth}")
    private Date birth;
	private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
	//输出
	//persion{lastName='张三', age=19, birth=Tue Dec 12 00:00:00 CST 2017, maps=null, lists=null, dog=null}

在value属性内还可以用表达式的方式来引用配置文件里的内容

3.@PropertySource

这个注解的作用是导入外部的配置文件,如果将所有的注入属性配置都放在application配置文件内,那么会显得很冗余,所以可以使用这个注解来导入外部的配置文件

@Component
@ConfigurationProperties(prefix = "persion")
@PropertySource(value = {"classpath:persion.properties"})
public class persion {

    //@Value("张三")
    private String lastName;
    //@Value("19")
    private Integer age;
   // @Value("${persion.birth}")
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog;

这里需要注意的是不能不写ConfigurationProperties注解,如果不写这个注解,那么将不知道去映射那个属性

4.@ImportResource**

导入Spring的配置文件,让配置文件里面的内容生效,这里还是不推荐,既然SpringBoot就是为了简化Sprin的那种配置繁琐的问题,那么就不用再绕回去使用Spring的配置文件了。

五、配置文件加载顺序

Spring Boot启动会扫描以下位置的application配置文件

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

里还是不推荐,既然SpringBoot就是为了简化Sprin的那种配置繁琐的问题,那么就不用再绕回去使用Spring的配置文件了。

五、配置文件加载顺序

Spring Boot启动会扫描以下位置的application配置文件

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

优先级由高到底,高优先级的配置会覆盖低优先级的配置;并且properties的优先级高于yml。这4个位置的配置文件时互补配置