告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践

一、Spring配置文件

1.1、什么是Spring配置

Spring配置指的是在Spring框架中定义和管理应用程序组件(如Bean)及其依赖关系的过程

作用:

配置文件主要用于解决硬编码问题,它将可能变更的信息集中存放。程序启动时,会从配置文件中读取数据并加载运行。

1.2、Spring Boot 配置信息

SpringBoot不仅支持多种配置文件格式,还通过标准化配置规范来促进其他框架与SpringBoot的集成,常见的配置信息包括:

  • 项目启动端口
  • 数据库连接信息(含用户名和密码)
  • 第三方系统调用密钥
  • 用于问题排查的常规日志和异常日志

项目启动端口配置

SpringBoot 内置Tomcat 服务器,默认使用8080端口。考虑到该端口可能被其他应用占用,SpringBoot 支持用户自定义端口配置


数据库连接配置

为简化数据库访问,各种持久层框架对JDBC进行了深度封装,使用户仅需少量代码即可完成数据库操作。由于不同应用需要连接不同数据库,这些框架都支持用户自定义数据库连接配置

1.3、Spring Boot支持的配置文件

Spring Boot支持的配置文件有以下几种:

(1)Properties文件:使用 properties 作为文件后缀,采用键值对的方式进行配置 。示例:application.properties

(2)YAML文件:使用.yml 或 yaml 作为文件后缀,采用缩进和冒号来表示结构,支持列表和嵌套结构,具有更易读的特点 。示例:application.yml

(3) XML文件 :使用.xml作为文件后缀,采用XML标签的形式进行配置。可以与Spring Framework的传统配置方式兼容。示例:application.xml

(4) JSON文件 :使用 json 作为文件后缀,采用JSON格式进行配置。示例:application.json

Spring Boot默认使用 src/main/resources 目录下的 application.propertiesapplication.yml 作为配置文件。开发者可根据项目需求选择其中一种格式,按照对应语法规则进行配置即可

此配置文件类型为YAML文件,前篇我们讲过:

修改application.yml 文件:

再次运行程序,我们可以看到Tomcat启动端口号为:9090

1.4、配置文件冲突

当一个项目中既存在 Properties文件,又存在 YAML文件时,并且配置信息有冲突如下:

答案是:

我们再看运行结果: Tomcat 启动端口号为:8776,即为 properties文件中配置的端口号,但是我们在项目配置信息时,尽量只生成一个配置文件,避免因冲突造成的故障

二、Properties配置文件

properties 是早期常用的配置文件格式,也是 SpringBoot 项目默认的配置文件类型

2.1、Properties基本语法

properties采用键值对形式配置,键(key)和值(value)之间通过等号 "=" 连接,使用 '#' 来添加注释,例如:

详细语法讲解请看官方文档: Spring boot配置

2.2、读取配置文件

在配置文件中添加如下内容:

java 复制代码
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
    @Value("${phone.num}")
    private int num;

    @RequestMapping("a")
    public String a(){
        System.out.println(num);
        return "读取到电话号码: "+num;
    }
}

访问URL路径 127.0.0.1:9090/Demo/a 后:

2.3、Properties缺点分析

2.3.1、扩展性有限

Properties文件采用简单的键值对结构,仅支持单层数据,无法直接表达复杂嵌套结构(如JSON/XML支持的树形数据)。当配置项存在层级关系时,需依赖命名约定(如phone.people1.num),可读性和维护性较差

2.3.2、类型支持不足

所有值均以字符串形式存储,需手动转换数据类型。例如数字、布尔值等需额外代码处理,易引发类型转换错误或遗漏

2.3.3、信息冗余

properties 配置是以key -value的形式配置的,会有很多的冗余的信息,如下:

三、YAML配置文件

yaml 通常简写为 yml,这是实际开发中最常见的写法。yml 和 yaml 的使用方式完全一致。

3.1、yml基本语法

YML 采用树形结构的配置文件格式,其基本语法规则为 "key: value" ;其中 key 和 value 之间必须使用英文冒号加空格分隔,该空格不可省略。基本语法示例如下:

3.2、yml配置不同数据类型

3.2.1、正常接收参数

上述代码中,空字符串可以空着不写,但是为了避免造成误会,我们可以加上引号表示空字符串,此处单引号或者双引号都一样

yml 读取配置的方式与 properties 相同,使用 @Value 注解即可,具体实现代码如下:

访问URL后:

3.2.2、不同类型接收参数
java 复制代码
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
    @Value("${float.value}")
    private int value;
    @PostConstruct
    public void getList(){
        System.out.println("尝试整形接收浮点型变量:"+value);
    }
}

在使用 int 类型接收 yml 配置文件中 float.value 的值时,会出现类型匹配异常。因此,在接收参数时需要注意将参数转换为兼容的数据类型

3.3、配置对象

我们还可以在yml中配置对象,如下:

此时无法通过**@Value** 注解读取配置对象,需要使用 @ConfigurationProperties注解来实现,具体代码如下:

java 复制代码
@ConfigurationProperties(prefix = "hero")
@Component
@Data
public class Hero {
    private String name;
    private int age;
    private String hobby;
}
java 复制代码
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
    @Autowired
    private Hero hero;
    @RequestMapping("hero")
    public String getHero(){
        return hero.toString();
    }
}

运行程序并访问URL:127.0.0.1:8080/Demo/hero 后得:

@ConfigurationProperties 注解会将配置文件中以"hero "为前缀的配置项自动映射到 Hero 类的对应属性上。随后,Spring 会将这些值注入到 PropertiesDemo 类的 Hero对象中,从而得到上述最终的配置结果,当然上述配置文件中的对象也可看作为一个一个的参数按照 3.2.1 目录的方法步骤进行获取

3.4、配置集合

yml配置文件也可以配置 list 集合,代码如下:

java 复制代码
list:
  name:
    - aaa
    - bbb
    - ccc
    - ddd
    - eee

集合的读取方式与对象相同,都是通过 @ConfigurationProperties注解来实现的

java 复制代码
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
    @Autowired
    private ListConfig listConfig;
    @PostConstruct
    public void getList(){
        System.out.println(listConfig.toString());
    }
}

观察结果:

此处我们可以观察到,在输出 list集合后, 此程序还未启动完成,为什么呢?

3.5、配置Map

yml 配置文件还可以配置 Map,代码如下:

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

Map 的读取方式与上述对象和集合也相同,也是通过 @ConfigurationProperties注解来实现的

java 复制代码
@Data
@ConfigurationProperties("maptypes")
@Component
public class MapConfig {
    private HashMap<String,String> map;
}
------------------------------------------
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {
    @Autowired
    private MapConfig mapConfig;
    @PostConstruct
    public void getList(){
        System.out.println(mapConfig.toString());
    }
}

观察结果:

3.6、yml的优缺点

3.6.1、优点

(1)语法简洁明了,可读性强,写法简单,易于理解

(2)数据类型支持丰富,能直观地表达对象、数组、集合等多种数据结构

(3)跨语言兼容性好,不仅适用于Java,还支持Golang、Python、Ruby、JavaScript等多种编程语言

3.6.2、缺点

(1)不适合编写复杂配置文件

(2)格式要求严格,细小的空格或缩进错误都可能导致解析失败

四、本章总结

properties 文件采用 key=value 的键值对格式配置,而 yml 文件则采用树形结构配置方式

读取配置文件时,可使用 @Value 注解,注解内需以 "${}" 的格式指定配置项

yml 文件通过换行缩进来表示层级关系 ,key 和 value 之间需用英文冒号加空格分隔 ,且空格不可省略

properties 是早期默认的配置文件格式,存在一定数据冗余问题,yml 能有效解决冗余问题,但不太适合复杂配置场景

yml 和 properties 可以共存于同一项目,但建议统一使用其中一种配置文件类型

相关推荐
谦行3 分钟前
前端视角 Java Web 入门手册 5.10:真实世界 Web 开发—— 单元测试
java·spring boot·后端
hhua012315 分钟前
理解“无界队列”与“有界队列”及其适用场景
java·队列
LZQqqqqo18 分钟前
C# 接口(interface 定义接口的关键字)
java·开发语言·c#
寒水馨25 分钟前
Java 9 新特性解析
java·开发语言·新特性·java9·jdk9
SimonKing31 分钟前
甩掉手动赋值!MyBatis-Plus 自动填充实战秘籍
java·后端·程序员
liulun1 小时前
SkSurface---像素的容器:表面
网络·网络协议·rpc
火车叨位去19491 小时前
鱼皮项目简易版 RPC 框架开发(六)----最后的绝唱
网络·网络协议·rpc
都叫我大帅哥1 小时前
Java PriorityQueue:小顶堆大智慧,优先队列全揭秘
java
都叫我大帅哥1 小时前
TOGAF实施治理阶段:你的项目守护神,还是架构警察?
java
吹个口哨写代码1 小时前
防止包含 XSS 攻击风险的内容提交成功
java·服务器·前端