【SpringBoot 配置文件】properties 与 yml 的基础用法、格式及优缺点

文章目录

    • 一、配置文件的格式
    • [二、properties 配置文件](#二、properties 配置文件)
      • [2.1 读取配置文件](#2.1 读取配置文件)
      • [2.2 properties 缺点](#2.2 properties 缺点)
    • [三、yml 配置文件](#三、yml 配置文件)
      • [3.1 yml 基本语法](#3.1 yml 基本语法)
      • [3.2 配置不同数据类型及 null](#3.2 配置不同数据类型及 null)
      • [3.3 读取配置](#3.3 读取配置)
      • [3.4 配置对象](#3.4 配置对象)
      • [3.5 配置集合](#3.5 配置集合)
      • [3.6 配置Map](#3.6 配置Map)
      • [3.7 yml 优缺点](#3.7 yml 优缺点)

在 Spring Boot 开发中,配置文件是连接 "代码逻辑" 与 "环境参数" 的核心纽带 ------ 小到数据库地址、端口号,大到对象属性、集合参数,几乎所有动态信息都要靠它来管理。

一、配置文件的格式

Spring Boot 支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到SpringBoot的目的。很多项目或者框架的配置信息也放在配置文件中。

Spring Boot 配置文件有以下三种:

  1. application.properties
  2. application.yml
  3. application.yaml

yml 是 yaml 的简写,使用方式是一样的。实际开发中使用最多的是 1 和 2 .

当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.properties ,application.yml ,application.yaml 文件。

二、properties 配置文件

properties 是创建SpringBoot 项目默认的文件。是以键值的形式配置的,key 和 value 之间是以 " = " 连接的,示例:

java 复制代码
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
spring.datasource.username=root
spring.datasource.password=root

2.1 读取配置文件

在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解实现,@Value 注解使用 " ${ } " 的格式读取,示例:

java 复制代码
/**
 * 读取配置项mykey
 */
@RestController
@RequestMapping("/prop")
public class ReadPropertiesController {

    @Value("${my.key}")
    private String mykey;

    @Value("${server.port}")
    private Integer serverPort;

    @RequestMapping("/read")
    public String read(){
        return "mykey: " + mykey;
    }

    @PostConstruct //初始化,在项目创建启动完成之前执行这个方法
    public void read2(){
        System.out.println("server.port: " + serverPort);
    }
}

可以得到自定义配置项mykey的值以及端口号。@PostConstruct ,这个注解可以使得在项目创建启动之前执行当前方法。,便于查看获取配置项值。

通过 @Value 注解获取到默认配置端口号:8080。

2.2 properties 缺点

properties 配置是以key-value形式配置的。可以看出配置中有很多的冗余信息:

可以使用 yml 配置文件的格式化。

三、yml 配置文件

3.1 yml 基本语法

yml 是树形结构的配置文件,基础语法是" key: value ";key 与 value 之间使用英文冒号加空格的方式组成,该空格不可以省略。示例:

java 复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/testdb?
    username: root
    password: root

3.2 配置不同数据类型及 null

数据类型 键名 说明
字符串 string.value Hello 直接写字符串内容
布尔值 boolean.value true / false 取值为true或false
整数 int.value 10 整数数字格式
浮点数 float.value 3.14159 带小数的数字格式
Null null.value ~ YAML中用~表示null
空字符串 empty.value ' ' 用引号包裹表示空字符串

示例:

java 复制代码
# 字符串类型
string:
  value: Hello
  value2: Hello YAML  # 带空格的字符串无需引号也可识别

# 布尔类型
boolean:
  value: true
  value1: false

# 整数类型
int:
  value: 10
  value2: -20         # 补充:负整数写法

# 浮点数/小数类型
float:
  value: 3.14159
  value2: -9.8        # 补充:负浮点数写法

# null 空值类型
null:
  value: ~

# 空值相关区分
empty:
  value: ''           # 空字符串
  value1:             # 无值,效果等价于空字符串

3.3 读取配置

yml 读取配置的方式和 properties 相同,使用 @Value 注解,使用方式相同。示例同上。

value 值加单双引号区别:

字符串默认不用加单引号或双引号,但是加单双引号可表示不同的含义:

  • 单引号会转义特殊字符,使其失去特殊功能,始终是⼀个普通的字符串。
  • 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义。

3.4 配置对象

可以在 yml 中配置对象,示例:

java 复制代码
userinfo:
  name: zhangsan
  age: 20

这时不能用 @Value 来读取配置对象,而是使用 注解 @ConfigurationProperties 来读取,示例:

java 复制代码
@Data
@Configuration
@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {
    private String name;
    private int age;
}
java 复制代码
@RestController
@RequestMapping("/yml")
public class ReadYmlController {

    @Autowired
    private UserInfo userInfo;

    @PostConstruct
    private void read(){
        System.out.println(userInfo);
    }
}

获取到配置对象:

3.5 配置集合

配置文件也可以配置list集合

示例:

java 复制代码
# 配置集合
dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

集合读取和对象一样,也是使用 @ConfigurationProperties注解。

java 复制代码
@Data
@Configuration
@ConfigurationProperties(prefix = "dbtypes")
public class DataType {
    private List<String> name;
}
java 复制代码
@RestController
@RequestMapping("/yml")
public class ReadYmlController {

    @Autowired
    private DataType dataType;

    @PostConstruct
    private void read(){
        System.out.println("dbtypes: " + dataType);
    }
}

获取到集合:

3.6 配置Map

配置文件也可以配置 map ,如下:

java 复制代码
# 配置map
maptypes:
  map:
    k1: v1
    k2: v2
    k3: v3

Map 的读取和 对象一样 使用 @ConfigurationProperties 注解获取,如下:

java 复制代码
@Data
@Configuration
@ConfigurationProperties(prefix = "maptypes")
public class DataType {
    private Map<String,String> map;
}
java 复制代码
@RestController
public class ReadYmlController {

    @Autowired
    private DataType dataType;

    @PostConstruct
    private void read(){
        System.out.println("dbtypes: " + dataType);
    }
}

获取到Map:

3.7 yml 优缺点

优点:

  1. 特定条件下可读性高,易于理解。
  2. 支持更多的数据类型,可以简单表达对象,数组,集合,Map等等。
  3. 支持更多的编程语言,不止是在Java 中可以使用。

缺点:

  1. 不适合写复杂的配置文件,例如多层嵌套
  2. 对格式有较强的要求(少写一个空格会发生大错误)
相关推荐
玄〤13 小时前
Spring MVC 讲解:从初始化流程到请求参数与 JSON 处理全解析(黑马课程ssm笔记总结)(day5)
java·spring·json·mvc
廋到被风吹走14 小时前
【Java】【JVM】垃圾回收深度解析:G1/ZGC/Shenandoah原理、日志分析与STW优化
java·开发语言·jvm
xrkhy14 小时前
Java全栈面试题及答案汇总(3)
java·开发语言·面试
SunnyDays101114 小时前
Java 高效实现 CSV 转 PDF
java·csv转pdf
隐形喷火龙14 小时前
SpringBoot 异步任务持久化方案:崩溃重启不丢任务的完整实现
java·spring boot·后端
我是koten14 小时前
K8s启动pod失败,日志报非法的Jar包排查思路(Invalid or corrupt jarfile /app/xxxx,jar)
java·docker·容器·kubernetes·bash·jar·shell
Andy工程师14 小时前
Filter 的加载机制 和 Servlet 容器(如 Tomcat)的请求处理流程
spring boot
WX-bisheyuange14 小时前
基于Spring Boot的库存管理系统的设计与实现
java·spring boot·后端
明天好,会的14 小时前
分形生成实验(三):Rust强类型驱动的后端分步实现与编译时契约
开发语言·人工智能·后端·rust