开发者

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

目录
  • 一、Spring配置文件
    • 1.1、什么是Spring配置
    • 1.2、Spring Boot 配置信息
    • 1.3、Spring Boot支持的配置文件
    • 1.4、配置文件冲突
  • 二、Properties配置文件
    • 2.1、Properties基本语法
    • 2.2、读取配置文件
    • 2.3、Properties缺点分析
      • 2.3.1、扩展性有限
      • 2.3.2、类型支持不足
      • 2.3.3、信息冗余
  • 三、YAML配置文件
    • 3.1、yml基本语法
      • 3.2、yml配置不同数据类型
        • 3.2.1、正常接收参数
        • 3.2.2、不同类型接收参数
      • 3.3、配置对象
        • 3.4、配置集合
          • 3.5、配置Map
            • 3.6、yml的优缺点
              • 3.6.1、优点
              • 3.6.2、缺点
          • 四、本章总结

            一、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 作为配置文件。开发者可根据项目需求选择其中一种格式,按照对应语法规则进行配置即可

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

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

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

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

              php;       修改 application.yml 文件:

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

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

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

            1.4、配置文件冲突

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

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

            答案是:

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

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

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

            二、Properties配置文件

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

            2.1、Properties基本语法

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

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

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

            2.2、读取配置文件

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

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

            @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 后:

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

            2.3、Prandroidoperties缺点分析

            2.3.1、扩展性有限

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

            2.3.2、类型支持不足

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

            2.3.3、信息冗余

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

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

            三、YAML配置文件

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

            3.1、yml基本语法

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

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

            3.2、yml配置不同数据类型

            3.2.1、正常接收参数

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

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

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

                     访问URL后:

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

            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 的值时,会出现类型匹配异常。因此,在接收参数时需要注意将参数转换为兼容的数据类型

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

            3.3、配置对象

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

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

                    此时无法通过@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 后得:

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

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

            3.4、配置集合

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

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

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

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

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

                    观察结果:

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

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

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

            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());
                }
            }

                     观察结果:

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

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

            到此这篇关于Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践记录(告别配置混乱)的文章就介绍到这了,更多相关Spring Boot Properties 与 YAML内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

            0

            上一篇:

            下一篇:

            精彩评论

            暂无评论...
            验证码 换一张
            取 消

            最新开发

            开发排行榜