告别配置混乱!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.properties 或 application.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、读取配置文件
在配置文件中添加如下内容:
@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、不同类型接收参数
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Value("${float.value}")private int value;@PostConstructpublic void getList(){System.out.println("尝试整形接收浮点型变量:"+value);}
}
在使用 int 类型接收 yml 配置文件中 float.value 的值时,会出现类型匹配异常。因此,在接收参数时需要注意将参数转换为兼容的数据类型
3.3、配置对象
我们还可以在yml中配置对象,如下:
此时无法通过@Value 注解读取配置对象,需要使用 @ConfigurationProperties 注解来实现,具体代码如下:
@ConfigurationProperties(prefix = "hero")
@Component
@Data
public class Hero {private String name;private int age;private String hobby;
}
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Autowiredprivate 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 集合,代码如下:
list:name:- aaa- bbb- ccc- ddd- eee
集合的读取方式与对象相同,都是通过 @ConfigurationProperties注解来实现的
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Autowiredprivate ListConfig listConfig;@PostConstructpublic void getList(){System.out.println(listConfig.toString());}
}
观察结果:
此处我们可以观察到,在输出 list 集合后, 此程序还未启动完成,为什么呢?
3.5、配置Map
yml 配置文件还可以配置 Map,代码如下:
maptypes:map:k1: v1k2: v2k3: v3
Map的读取方式与上述对象和集合也相同,也是通过 @ConfigurationProperties 注解来实现的
@Data
@ConfigurationProperties("maptypes")
@Component
public class MapConfig {private HashMap<String,String> map;
}
------------------------------------------
@RestController
@RequestMapping("Demo")
public class PropertiesDemo {@Autowiredprivate MapConfig mapConfig;@PostConstructpublic 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 可以共存于同一项目,但建议统一使用其中一种配置文件类型