1. 配置文件格式

Spring Boot 提供两种类型的配置文件:

  • application.properties
  • application.yml
  • application.yaml

Spring Boot 的默认配置文件位置为:src/main/resources/application.properties
image.png
根据我们引入的不同 starter 模块,可以配置:容器端口名、数据库连接信息、日志级别等各种配置信息。
例子:配置 Tomcat 端口号:
image.png
Spring Boot 的配置文件除了可以使用传统的 properties 文件,还支持现在被广泛推荐使用的 YAML 文件。例子:配置 Tomcat 端口号:
image.png
image.png
两种配置文件使用其中一种即可。
SpringBoot 程序的配置文件名必须是 application ,只是后缀名不同而已。
配置文件优先级:application.properties > application.yml > application.yaml

2. yaml 文件语法

2.1 简介

YAML(YAML Ain’t Markup Language),一种数据序列化格式。这种格式的配置文件在近些年已经占有主导地位。

  1. u:
  2. name: jack
  3. age: 18
  4. tel: 13888888888

优点:

  • 容易阅读yaml 类型的配置文件比 xml 类型的配置文件更容易阅读,结构更加清晰
  • 容易与脚本语言交互
  • 以数据为核心,重数据轻格式 yaml 更注重数据,而 xml 更注重格式

YAML 文件扩展名:

  • .yml (主流)
  • .yaml

上面两种后缀名都可以,以后使用更多的还是 yml 的。

2.2 语法

  • 大小写敏感
  • 属性层级关系使用多行描述,每行结尾使用冒号结束
  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)空格的个数并不重要,只要保证同层级的左侧对齐即可。
  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
  • 表示注释

核心规则:数据前面要加空格与冒号隔开
数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔,例如:

  1. u:
  2. name: jack
  3. age: 18
  4. tel: 13888888888
  5. subject:
  6. - Java
  7. - Python
  8. - 大数据

2.3 读取配置数据

使用 @Value 注解

  1. @RestController
  2. public class HelloBootController {
  3. @Value("${u.name}")
  4. private String name;
  5. @GetMapping("/prop")
  6. public Map<String,Object> prop() {
  7. Map<String,Object> map = new HashMap<>();
  8. map.put("name",name);
  9. return map;
  10. }
  11. }

使用 Environment 对象

@RestController
public class HelloBootController {

    @Value("${u.name}")
    private String name;

    @Autowired
    private Environment env;

    @GetMapping("/prop")
    public Map<String,Object> prop() {
        Map<String,Object> map = new HashMap<>();
        map.put("name",name);
        map.put("age",env.getProperty("u.age"));
        return map;
    }
}

自定义对象

SpringBoot 还提供了将配置文件中的数据封装到我们自定义的实体类对象中的方式。具体操作如下:

  • 将实体类 bean 的创建交给 Spring 管理。在类上添加 @Component 注解
  • 使用 @ConfigurationProperties 注解表示加载配置文件在该注解中也可以使用 prefix 属性指定只加载指定前缀的数据
  • 在 其它控制器中进行注入

添加依赖

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

编写配置类:

@Component
@ConfigurationProperties(prefix = "u")
public class UserConfig {
    private String name;
    private String age;
    private String tel;
    private String[] subject;

    ....
}

控制器注入

@RestController
public class HelloBootController {

    @Value("${u.name}")
    private String name;

    @Autowired
    private Environment env;

    @Autowired
    private UserConfig userConfig;

    @GetMapping("/prop")
    public Map<String,Object> prop() {
        Map<String,Object> map = new HashMap<>();
        map.put("name",name);
        map.put("age",env.getProperty("u.age"));
        map.put("subject",userConfig.getSubject());
        return map;
    }
}

3. 配置文件优先级

SpringBoot 中4级配置文件放置位置:

  • 1级:classpath:application.yml
  • 2级:classpath:config/application.yml
  • 3级:file :application.yml
  • 4级:file :config/application.yml

级别越高优先级越高。

4. 多环境配置

以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上将环境的配置改为线上环境的。
来回的修改配置会很麻烦,而 SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。
image.png
application.yml

# 多环境配置
spring:
  profiles:
  # 使用哪个环境配置
    active: prd

application-dev.yml 开发环境

server:
  port: 8081

application-test.yml 测试环境

server:
  port: 8082

application-prd.yml 测试环境

server:
  port: 8083

5. 命令行启动参数

java –jar xxx.jar --spring.profiles.active=test
java –jar xxx.jar --server.port=88
java –jar springboot.jar --server.port=88 --spring.profiles.active=test

命令行设置的端口号优先级高与配置文件的优先级。

常见问题

yaml 没有语法提示:可以使用一下方式解决:
image.png
image.png
image.pngimage.png
选择不能识别的yml文件:
image.png
image.png
最终效果:
image.png
image.png