SpringBoot-统一参数配置

SpringBoot-统一参数配置

SpringBoot工程下,进行统一的配置管理,你想设置的任何参数(端口号、项目根路径、数据库连接信息等等)都集中到一个固定位置和命名的配置文件(application.propertiesapplication.yml)中!

配置文件应该放置在Spring Boot工程的src/main/resources目录下。这是因为src/main/resources目录是Spring Boot默认的类路径(classpath),配置文件会被自动加载并可供应用程序访问


使用SpringBoot提供的key

Spring提供一些固定的Key :: Spring Boot

例如:server.port=8080 启动端口号

server.port=8080

自定义key

我们也可以在配置文件中写一些自定义的key,用@value注解获取key的值

bsy.name=xiaobai
bsy.age=18
@RestController
@RequestMapping("hello")
public class HelloController {
    @Value("${bsy.name}")
    private String name;
    @Value("${bsy.age}")
    private int age;
    }
}

Yaml

application配置文件是SpringBoot为所有的配置提供参数的位置,所以必须保证key不重复

为此,SpringBoot采取了多层命名的方式

然而,properties配置文件写多层命名会特别麻烦,而yml(yaml)格式就很适合写多层命名

server.port=8080
server.servlet.context-path=/
server:
  port: 8080
  servlet:
    context-path: /

yaml格式介绍

YAML 和 YML 是同一个文件格式的不同文件扩展名

YAML(YAML Ain’t Markup Language)是一种基于层次结构的数据序列化格式,旨在提供一种易读、人类友好的数据表示方式。

.properties文件相比,YAML格式有以下优势:

  • 层次结构

  • 自我描述性

  • 注释支持

  • 多行文本

  • 类型支持

  • 更好的可读性


yaml语法说明

  • 数据结构用树形结构呈现,通过缩进来表示层级,

  • 如果key有多个value(集合)通过减号 ” - ” 来表示

  • 键值结构里面的key/value对用冒号 ” : ” 来分隔,如果存在value,需要加空格

  • YAML配置文件的扩展名是yaml 或 yml


配置文件-读取数据

@Value读取数据的方式也是有很多缺点的:

  • key必须写全
  • 只能读取单个值,比如单key多value的集合无法读取

@ConfigurationProperties

为了解决这个问题,SpringBoot提供了@ConfigurationProperties注解

通过prefix属性配置文件中的前缀,分别给属性赋值,这样做有两个好处:

  • 方便
  • 可以给集合赋值
bsy:
  user:
    name: xiaobai
    age: 18
    girlfriend:
      - xiaohong
      - xiaolv
      - xiaohuang
@Data
@ConfigurationProperties(prefix = "bsy.user")
public class user {
    private String name;
    private int age;
    private List<String> girlfriend;
}

动态配置文件

在Spring Boot中,可以使用多环境配置来根据不同的运行环境(如开发、测试、生产)加载不同的配置

SpringBoot支持多环境配置让应用程序在不同的环境中使用不同的配置参数

以下是实现Spring Boot多环境配置的常见方法:

  • 属性文件分离

  • YAML配置文件

  • 命令行参数(动态)

application-dev.yml(开发)

spring:
  jdbc:
    datasource:
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql:///dev
      username: root
      password: root

application-test.yml(测试)

spring:
  jdbc:
    datasource:
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql:///test
      username: root
      password: root

application-prod.yml(生产)

spring:
  jdbc:
    datasource:
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql:///prod
      username: root
      password: root
spring:
  profiles:
    active: dev # 通过更换active的value,实现不同的配置

优先级问题

当application-dev.yml 和 application.yml具有同样配置时,以外部文件(application-dev)为准

多环境配置

因为统一参数配置,application.yml会有特别多的key,把这些key归类提取不同的文件

再通过application.yml统一管理,同时激活多个配置文件

spring:
  profiles:
    active: dev,test