[Java EE 进阶] SpringBoot 配置文件全解析:properties 与 yml 的使用与实战(1)
配置文件主要是为了解决硬编码(将代码写死)带来的问题 , 把可能会改变的信息 , 放在一个集中的地方 , 当我们启动某个程序时 , 应用程序从配置文件中读取数据 , 并加载运行本文将从配置文件的核心作用出发详细讲解两种格式的语法、使用方式结合实战案例对比差异并补充实用开发技巧帮你高效掌握 SpringBoot 配置文件的使用一.配置文件的价值配置文件的本质是 :解耦可变配置与业务代码在 Spring Boot 中 , 配置文件主要有以下作用配置项目基础信息 : Tomcat 启动端口 , 项目上下文路径配置第三方依赖 : 如数据库连接 URL , 用户名 , 密码 , Redis , MQ 的连接信息配置自定义业务数据 : 如验证码的宽高 , 接口超时时间 , 文件上传大小限制配置日志与环境 : 如日志级别 , 开发/测试/生产环境的差异化配置二. SpringBoot 主流配置文件格式SpringBoot 支持application.properties , application.yml , application.yaml三种配置文件(其中 yml 和 yaml 格式完全一致) ; properties 是默认格式 , yml 是实际开发中使用频率最高的格式加载规则 :SpringBoot 启动时 , 会自动从 resource 目录加载文件properties 和 yml 可并存于一个项目 , 当配置冲突时以 properties 为准实际开发中建议统一使用一种格式三.传统配置 : properties 格式详解properties 是最早器的配置文件格式 , 也是 SpringBoot 创建时默认生成的配置文件 , 其语法简单 , 兼容性高 , 适合简单的键值对配置本章节只对 properties 做简单介绍1.基本语法以键值对形式配置 , key 和 value 通过 连接 , 使用 # 添加注解spring.application.nameSpringIOC # 配置Tomcat端口 server.port9090 # 配置MySQL数据库连接 spring.datasource.urljdbc:mysql://127.0.0.1:3306/testdb?characterEncodingutf8useSSLfalse spring.datasource.usernameroot spring.datasource.passwordroot2.读取配置文件使用 Value(${key})注解即可读取配置文件内容 , 适用于单个零散的配置的读取#自定义配置 my.config.name SpringBootpackage com.boop.springioc.TestNode.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/propertiesConfig) public class propertiesConfig { Value(${my.config.name}) private String configName; RequestMapping(/read) public String readConfig(){ return 从properties读取的配置 configName; } }http://127.0.0.1:8080/propertiesConfig/read3.缺点分析properties 最大的问题是存在大量冗余的 key 前缀四.主流配置 : yml 格式超详解yml 是 YAML(Yey Another Markup Language)的简写 , 是一种树形结构的配置文件 , 采用缩进表示乘积 , 解决了 properties 的冗余问题 , 支持更多的数据类型(对象 , 集合 , Map) , 可读性好 , 是目前 SpringBoot 开发的首选格式1. 核心基础语法采用 key: value 格式 ,冒号后必须跟一个英文空格用缩进表示层级关系, 缩进只能用空格 , 不能用 Tab使用#添加注释大小写敏感2. yml 配置不同的数据类型和 null#字符串 string.value: Hello #布尔值 boolean.value: true #整数 int.value: 10 #浮点数 float.value: 1.232 #null null.value: ~ #空字符串 empty.value: 注意:yml 中字符串可以加单引号或双引号 , 二者的核心区别是 : 是否转移特殊字符(\n , \t)不加单引号 : 默认不专一特殊字符 , 使其变为普通字符串显示单引号 : 强制转义特殊字符 , 使其失去原有含义双引号 : 不转义特殊字符 , 保留其原有含义string: # 不加引号\n作为普通字符串 str1: Hello \n SpringBoot # 单引号\n被转义普通字符串 str2: Hello \n SpringBoot # 双引号\n表示换行保留特殊含义 str3: Hello \n SpringBootpackage com.boop.springioc.TestNode.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/ymlConfig) public class ymlConfig { Value(${string.str1}) private String str1; Value(${string.str2}) private String str2; Value(${string.str3}) private String str3; RequestMapping(/print) public void printString(){ System.out.println(str1); System.out.println(str2); System.out.println(str3); } }http://127.0.0.1:8080/ymlConfig/print报错解析:一般是配置文件中变量的名字和需要注入的名字不相同 , 注意前缀和大小写敏感3. yml 配置读取与 properties 相同my: config: name: SpringIOCpackage com.boop.springioc.TestNode.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/propertiesConfig) public class propertiesConfig { Value(${my.config.name}) private String configName; RequestMapping(/read) public String readConfig(){ return 从properties读取的配置 configName; } }http://127.0.0.1:8080/propertiesConfig/read4.复杂类型的配置 : 对象/List/Map4.1 配置对象有两种写法 :普通缩进和行内两种person1: id: 1 name: zhangsan age: 18 person2: {id: 2,name: Java,age: 165}package com.boop.springioc.TestNode.model; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; Component ConfigurationProperties(prefix person2) //ConfigurationProperties(prefix person1) Data public class Person { private Integer id; private String name; private Integer age; }package com.boop.springioc.TestNode.Config; import com.boop.springioc.TestNode.model.Person; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/ymlConfig) public class ymlConfig { // Autowired private Person p1; RequestMapping(/print) public void printString(){ System.out.println(p1); // System.out.println(str1); // System.out.println(str2); // System.out.println(str3); }读取对象配置 :创建实体类 , 添加Component(交给 Spring 管理) , ConfigurationProperties(prefix person2) (指定 yml 中对应的前缀对象) , 并通过Data 生成 toString()在控制器中通过Autowried 注入实体类 , 即可获取配置值4.2 配置 List通过缩进短横线定义集合元素 , 同样支持两种写法dbtypes1: name: - mysql - sqlserver - db2 dbtypes2: {name:[mysql,java,sql]}package com.boop.springioc.TestNode.Config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; Component ConfigurationProperties(prefix dbtypes1) Data public class ListConfig { private ListString name; }package com.boop.springioc.TestNode.Component; import com.boop.springioc.TestNode.Config.ListConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RequestMapping(/list) RestController public class ListController { Autowired private ListConfig listConfig; RequestMapping(/readList) public String readList(){ return listConfig.toString(); } }http://127.0.0.1:8080/list/readList4.3 配置 Map 集合maptypes3: map: k1: aa k2: bjs l2: kl maptypes4: {map: {k1: kk1, k2: kk2, k3: kk3}}package com.boop.springioc.TestNode.Config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.HashMap; Component ConfigurationProperties(prefix maptypes3) Data public class MapConfig { private HashMapString, String map; }package com.boop.springioc.TestNode.Component; import com.boop.springioc.TestNode.Config.MapConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; RestController RequestMapping(/map) public class mapController { Autowired private MapConfig mapConfig; RequestMapping(/readMap) public String readStudent(){ return mapConfig.toString(); } }http://127.0.0.1:8080/map/readMap5.优缺点优点:可读性高 , 写法简单 , 易于理解支持更多的数据类型支持更多编程语言(Go , Python , Ruby , JS)缺点:不适合写复杂文件注意层级划分五.properties 与 yml 核心对比对比维度propertiesyml语法格式扁平键值对keyvalue树形结构key: value缩进表示层级冗余性存在大量重复 key 前缀冗余度高树形结构无冗余前缀数据类型仅支持基础类型字符串、数字、布尔支持基础类型 对象 / List/Map 等复杂类型读取方式仅 Value 注解基础类型用 Value复杂类型用 ConfigurationProperties格式要求宽松无缩进 / 空格要求严格冒号后必须有空格缩进只能用空格优先级高与 yml 冲突时生效低与 properties 冲突时失效适用场景简单配置、超复杂嵌套配置、需兼容老项目绝大多数日常开发场景、复杂类型配置、追求可读性
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2437283.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!