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

发布于:2025-07-27 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、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、读取配置文件

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

@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;
    @PostConstruct
    public 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 {
    @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 集合,代码如下:

list:
  name:
    - aaa
    - bbb
    - ccc
    - ddd
    - eee

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

@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,代码如下:

maptypes:
  map:
    k1: v1
    k2: v2
    k3: v3

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

@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 可以共存于同一项目,但建议统一使用其中一种配置文件类型


网站公告

今日签到

点亮在社区的每一天
去签到