详解 Spring Boot 项目中的配置文件

news/2024/4/20 5:19:52/文章来源:https://blog.csdn.net/xaiobit_hl/article/details/128080102

目录

1. Spring Boot 项目中配日文件的作用是什么

2. Spring Boot 配置文件的两种格式

3. properties 配置文件

3.1 properties 配置文件的基本语法

 3.2 properties 配置文件的分类

3.3 如何读取配置文件

3.4 properties 配置文件的优缺点分析

4. yml 配置文件

4.1 yml 的基本语法

4.2 yml 配置文件的优点

4.3 yml 配置基本数据类型

4.4 yml 配置对象

4.5 yml 读取对象

4.6 yml 配置集合

5. 设置多平台的配置文件


1. Spring Boot 项目中配日文件的作用是什么

配置文件中最主要的两个作用: 连接数据库和用于定位问题的关键日志.

一个项目中没有数据库的话那就谈不上一个完整的项目,假如今天王者出新皮肤了, 你心智勃勃花了一千多块钱买了好几款喜欢的皮肤, 没有数据库的话, 过两天你上线发现皮肤没了, 你心里肯定有一万只 XXX 奔腾而过. 如果没有配置文件 , 程序出问题, 很难查找时, 都无法定位到关键日志, 所以配置文件还是相当的重要的.

配置文件的作用:

  • 连接数据库的信息
  • 用于发现和定位问题的关键日志
  • 设置项目的启动端口
  • 第三方系统的调用密钥等信息 (例如老师在某平台给我们上课时, 他能在平台上拿到我们的数据, 就是通过配置文件中设置的标识来调用第三方接口获取的)

2. Spring Boot 配置文件的两种格式

Spring Boot 中有两种格式的配置文件:

  • properties  (application.properties)
  • yml (application.yml)

Spring Boot 中这两种格式的配置文件的命名方式必须以 application 开头,  否则配置就不会生效, 这就牵扯到了高级框架中的 "约定大于配置" , 我们要做的事情越来越少了, 但是要遵守的约定越来越多了.

【问题】为什么需要两种格式的配置文件呢 ? 仅仅是为了提供更多的选择 ?

1. yml 相比于 properties 在写法上简化了许多 (后面会演示代码)

2. 在跨平台等问题上也是有很大的优势 (后面会讲到)

【问题】两种格式的配置文件如果同时存在, 会以哪种格式为主?

1. 当一个项目中出现了两种格式的配置文件时, properties 格式的配置文件优先级高, 所以会以 properties 格式的配置文件为主. 例如 properties 配置文件中设置了端口为 8081, .yml 配置文件中也设置了端口, 为 8082, 那么最终程序启动时的端口就是 8081, 但是加载完 properties 文件之后, 也会加载 .yml 文件中的配置信息.

2.理论上是这两种格式的配置文件可以出现在一个项目中, 但是一般都会统一配置文件,如果两种格式都写了, 可能会有增加排查问题的风险; 就好比衣服种类有很多, 但是一个餐厅里的服务员一般都会统一服装, 否则会显得杂乱无章, 不正式.

3. properties 配置文件

3.1 properties 配置文件的基本语法

# 设置端口号
server.port=8081
#设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/book?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

properties 配置文件中是以键值对的格式进行配置的, "key" 和 "value" 通过 "=" 来连接.

更多系统配置:  Spring Boot 中更多系统配置

【整个花活】通过配置文件来设置 Spring Boot 项目启动的 log:

1. 在 resource 文件夹下创建一个 banner.txt 文件, 命名必须是 banner.txt , 否则读取不到.

2. 把你想要的 log 复制进去, 然后启动 IDEA 就能看到.

 下载 log 相关网址 : https://www.bootschool.net/ascii-art

 效果图: 

 3.2 properties 配置文件的分类

1. Spring Boot 内置的配置项, 比如 server.port, 等等...

2. 用户自定义的配置项: mykey.key1=zhangsan,  mykey.key2=lisi .....

# 设置端口号
server.port=8081# 用户自定义的配置项
mykey.key1=zhangsan
mykey.key2=lisi

3.3 如何读取配置文件

通过使用 @Value 注解来实现, 基本格式:  

@Value("${server.port}")

【代码示例】

自定义配置项:

key1=zhangsan
key2=lisi

读取配置文件:

@RestController
public class TestController {// 读取自定义配置项@Value("key1")private String key1;// 读取系统配置项@Value("${server.port}")private Integer port;@RequestMapping("/key")public String readKey() {return "key1: " + key1 + " | port: " + port;}
}

运行程序, 此时在浏览器输入 URL, 就能拿到相关 key 对应的 value 值。

 

【注意事项】

还是那句话, "约定大于配置", 我们一定要遵守这种写法: ${},  如果我们写成这样 @Value("key1"), 那么读取的时候, 虽然不会报错, 但是它会将 key1 当做字符串赋值给 key1, 那么此时你再运行程序, 就会输出以下结果, 就拿不到自定义配置中 key 对应的 value 值了.

 

 

3.4 properties 配置文件的优缺点分析

【优点】

  • 格式简单, 不易出错.
  • 写法上更加直观

【缺点】

  • 写法不够灵活, 不够简便, 例如下面的数据库相关配置, 同样的前缀信息, 需要写多遍.

  •  乱码问题:

使用 properties 格式的配置文件, 我们加注释的中文, 以及头比较铁的时候, 给键或值写成中文的时候, 我们关闭项目后再打开项目时, 这些中文就会乱码; 甚至是我没关闭项目, 我通过 @Value 等注解的方式去读的时候, 也有可能出现乱码的问题,而且是不可逆的, 因为 IDEA 会默认给 properties 配置文件设置 IOS-8859-1 的编码格式. 而 yml 格式的配置文件就不存在这个问题, 它默认是 UTF-8 的编码格式.

如何解决 propeties 配置文件乱码问题:

第一步: 进入当前项目的 settings 和 新项目的 settings

第二步: 按照下图的方式去更改当前项目的 settings 和新项目的 settings.

4. yml 配置文件

yml YAML 的缩写, 全称 -> Yet Another Markup Language.  中文意思为 "另一种语言".

4.1 yml 的基本语法

yml 不像 properties 那中键值对的方式, 而是树形结构的格式, 基本格式 : 

写法规范注意: 

  • 一级目录下: 键和值之间的冒号后面要有空格, 千万不能省略!!
  • 多级目录下: 从第二级目录开始, 相较于上一级目录, 最前面要带有 tab 键

对比数据库连接的写法后, 发现 yml 的写法省略了重复的前缀信息, 写法上更加简便了.

 

单从写法简便这一点上来说, yml 还不足以打败 properties, 那么下面来分析 yml 还有哪些优点: 

4.2 yml 配置文件的优点

1. yml 可读性高, 写法上相较于 properties 更加简洁的, 语法和 JSON 高度相似.

2. yml 支持更多的数据类型, 它不仅支持基本数据类型, 它还可以表达数组, 散列表, 标量等数据形态, 还特别适合用来表达数据结构(各种集合), 各种配置文件等等.

3. yml 支持更多的编程语言, 它是跨语言的, 它不仅仅只是在 Java 中可以使用, 还可以在 Golang, PHP, Python, Ruby, JavaScript 等语言中使用. (质的提升)

4.3 yml 配置基本数据类型

前边演示了 String 类型, 其他像 boolean, int, float, 甚至 null 都是 类似的.

【代码示例】

# 布尔类型
boolean: false# 整数
int.value1: 20
int.value2: 0b1010_0111_0100_1010_11010  # 二进制# 浮点型
float.value: 3.14# null
null.value: ~

yml 配置 String 类型注意事项:

yml 在配置 String 类型的时候有三种写法

  • 默认不用加单双引号
  • 加单引号
  • 加双引号

【代码示例】

yml 配置文件 

 

读取配置文件(和 properties 相同)

@RestController
public class TestController {@Value("${key2}")private String key2;@Value("${String.str1}")private String str1;@Value("${String.str2}")private String str2;@Value("${String.str3}")private String str3;@RequestMapping("/key")public String readKey() {System.out.println();System.out.println("String.str1: " + str1);System.out.println("String.str2: " + str2);System.out.println("String.str3: " + str3);return "key2: " + key2;}
}

运行结果: 

 【结论】

1. 字符串默认不⽤加上单引号或者双引号.
2. 单引号会转义特殊字符,特殊字符最终只是⼀个普通的字符串数据.
3. 双引号不会转义字符串⾥⾯的特殊字符;特殊字符会作为本身想表示的意思.

4.4 yml 配置对象

yml 配置对象有两种写法: 1. 原始写法 2. 行内写法

1. 原始写法:

student:id: 1name: zhangsanage: 18

2. 行内写法:

student: {id: 1,name: zhangsan,age: 18}

4.5 yml 读取对象

读取对象的时候, 我们不再使用 @Value("${}") 注解了, 因为这个注解每次只能读到一个 value, 如果我们要读的对象有一百个属性, 我们是不可能去写一百遍重复的代码的. 此时我们需要使用到 @ConfigurationProperties 注解来实现.

基本格式:

@ConfigurationProperties(prefix = "student") 

【代码示例】 读取上述 student 对象

Bean 对象

@Data
@Component
@ConfigurationProperties(prefix = "student") 
// 读取 yml 中的 student 属性, 赋值给 Student 对象
public class Student {private Integer id;private String name;private Integer age;
}

@ConfigurationProperties 注解的作用就是从 yml 中读取 student 属性, 然后复制给 bean 对象.

@RestController
public class TestController {@Autowiredprivate Student student;@RequestMapping("/student")public String readKey() {return "userId: " + student.getId() + " | userName: " + student.getName();}
}

 运行程序, 通过 url 访问:

 yml 读取对象的注意事项

1. yml 配置对象的时候, 键名不能出现大写, 也不能出现下划线, 只能小写或者写成 stu-name.

2. 读取配置文件的实体类不能没有 setter 方法, @ConfigurationProperties 注解在实现时是通过 setter 将配置文件中的内容赋值给字段的. (可以通过 Generate 生成 Getter 和 Setter 方法, 或者通过 lombok 中的 @Data 注解来设置)

3. @ConfigurationProperties 需要配置五大类注解使用.

4.6 yml 配置集合

yml 配置集合也有两种格式: 1. 原始写法 2.行内写法

1. 原始写法

mylist:dbtype:- mysql- sqlserver- db2

2. 行内写法

mylist: {dbtype: [mysql,sqlserver,db2]}

4.7 yml 读取集合

yml 读取集合和读取对象的方式是类似的, 也是通过 @ConfigurationProperties 注解来实现的.

【代码示例】读取上述 mylist 集合

Bean 对象

@Data
@Component
@ConfigurationProperties(prefix = "mylist2")
public class MyList {private List<String> dbtype;  // 泛型可加可不加
}

读取集合:

@RestController
public class TestController {@Autowiredprivate MyList mylist;@RequestMapping("/student")public String readKey() {return "list-Size: " + mylist.getDbtype().size()+ " | list.get(0): " + mylist.getDbtype().get(0);}
}

启动服务器, 浏览器输入 url :

5. 设置多平台的配置文件

对于公司级别的环境而言, 最小的公司一般都会分三种环境来进行管理:

多平台配置文件设置

  • 开发环境的配置文件 [application-dev.yml]
  • 测试环境的配置文件 [application-text.yml]
  • 生产环境的配置文件 [application-prod.yml]

【注意】不同环境配置文件的命名必须以 application- 开头

【如何设置多平台的配置文件】

1. 使用一份 yml 配置文件, 不同的环境, 通过修改和注释来解决.(麻烦)

就拿数据库连接来说, 假如我连接的是开发环境的数据库, 我数据库的信息写好了, 我下次再连接测试环境的数据库, 我又把开发环境的数据库的相关信息给注释掉, 再去写我连接测试数据库的信息. 这样会面临两个问题:

  • 极端一点来说, 万一我配置文件连接了生产环境上的数据库, 我手动修改, 就总是会有改错的风险的, 如果改错了, 就会污染生产环境的库.
  • 第二, 不同环境的配置可能会非常繁琐, 改来改去有时候可能不止改一点点代码, 难度太大.

2. 不同的运行环境, 设置不同的配置文件.(更优)

而我们使用不同环境对应不同的配置文件, 这样就优雅方便很多了, 我不同的环境, 有着不同的代码, 不需要去修改, 只需要在主配置文件中去设置它需要运行的平台就行了.所以我们一般都是主配置文件搭配我们所需要的配置环境一起去使用的.

【代码示例】

测试环境配置文件 application-test.yml

server:port: 7777Spring:datasource:url: jdbc:mysql://yyyy:3306/book?characterEncoding=utf8username: rootpassword: aaaaa

开发环境配置文件 application-prod.yml

server:port: 8888Spring:datasource:url: jdbc:mysql://127.0.0.1:3306/book?characterEncoding=utf8username: rootpassword: 123456

生产环境配置文件 application-prod.yml

server:port: 9999Spring:datasource:url: jdbc:mysql://xxxx:3306/book?characterEncoding=utf8username: rootpassword: bbbbbb

在主配置文件中设置运行环境:

# 运行环境设置
Spring:profiles:active: prod

active 后面写 prod, test 和 dev, 就表示当前主配置文件要搭配那个运行环境来使用.

以生产环境为例, 启动程序, 观察端口号来区别运行环境.

  • 7777: 测试环境
  • 8888: 开发环境
  • 9999: 生产环境

 观察结果可以对应上当前环境是生产环境, 测试环境和开发环境都是类似的做法.


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_38653.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BP神经网络PID从Simulink仿真到PLC控制实现(含博途PLC完整SCL源代码)

单神经元自适应PID控制博途PLC完整源代码,请参看下面的文章链接: 博途PLC单神经元自适应PID控制_RXXW_Dor的博客-CSDN博客_单神经元pid控制1、单神经元作为构成神经网络的基本单位,具有自学习和自适应能力,且结构简单易于计算,传统的PID具有结构简单、调整方便和参数整定…

【软件测试】8年资深测试说出来我们的心声......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 执着于手动的功能测…

SSM毕设项目 - 基于SSM的毕业设计管理系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.2.1 系统开发流程3.3.2 教师登录流程3.3.3 系统操作流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新…

【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 与传统的影视行业相比&#xff0c;诞生于移动互联网时代的短视频是个全新行业&#xff0c;它制作方便又容易传播&#xff0c;一出现就成为大街小巷的时髦潮流。 各行各业的人们均可通过短视频展示自己&#xff0c;短小精悍的视频…

社区系统项目复盘-6

文章目录什么是Elasticsearch&#xff1f;Spring是怎么整合Elasticsearch的&#xff1f;开发社区搜索功能Elasticsearch实现全文搜索功能什么是Elasticsearch&#xff1f; Elasticsearch简介 一个分布式的、Restful风格的搜索引擎支持对各种类型的数据的检索搜索速度快&#xf…

基于粒子群算法和遗传算法优化的高速列车横向悬挂

目录 前言 1.高速列车模型 2.优化算法优化模糊PID流程 3.普通PID、优化算法模糊PID仿真对比 3.1 模糊控制器设计 3.2 仿真结果 3.2.1粒子群优化PID 3.2.2粒子群优化模糊PID 3.2.3遗传算法优化模糊PID 4.总结 前言 高速列车&#xff0c;是指最高行驶速度在200km/h 及以…

小知识· Zigbee 简介

1. 介绍 ZigBee是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术 ZigBee建立在IEEE 802.15.4标准&#xff08;定义了PHY和MAC层&#xff09;之上&#xff0c;ZigBee联盟对其网络层和应用层进行了标准化 ZigBee协议栈可分为五层 - 物理层&#xff08;PHY&a…

多进程并发服务器

TCP三次握手建立连接错误处理模块&#xff1a;wrap.c,函数声明&#xff1a;wrap.h并发服务器模型&#xff08;多进程&#xff0c;多线程&#xff09; 转换大小写程序 服务端 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #incl…

Mybatis Plus 多租户id使用

本文就不多逼逼&#xff0c;直接进入正题。 什么是多租户 多租户技术&#xff08;Multi-TenancyTechnology&#xff09;又称多重租赁技术&#xff0c;简称SaaS&#xff0c;是一种软件架构技术&#xff0c;是实现如何在多用户环境下 &#xff08;此处的多用户一般是面向企业用…

Java SPI机制的使用和理解

前言&#xff1a; SPI(Service Provider Interface)&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;Java中 SPI 机制主要思想是将装配的控制权移到程序之外&#xff0c;在模块化设计中这个机制尤其重要&#xff0c;其核心思想就是解耦 1、大家都知道API&#xff0c;却…

【C++】STL —— map和set的模拟实现

目录 一、基础铺垫 二、基本结构分析 1. 节点结构分析 2. 模板参数中仿函数分析 三、正向迭代器 四、封装完成的红黑树 五、map的模拟实现 六、set的模拟实现 一、基础铺垫 在前面的博客中我们了解了map和set的基本使用&#xff0c;以及对二叉搜索树、AVL树和红黑树的…

IPv6进阶:IPv6 过渡技术之 NAT64(IPv6 节点主动访问 IPv4 节点-地址池方式)

实验拓扑 PC1是IPv4网络的一个节点&#xff0c;处于Trust安全域&#xff1b;PC2是IPv6网络的一个节点&#xff0c;处于Untrust安全域。 实验需求 完成防火墙IPv4、IPv6接口的配置&#xff0c;并将接口添加到相应的安全域&#xff1b;在防火墙上配置NAT64的IPv6前缀3001::/64&…

【毕业设计】30-基于单片机矿井瓦斯_气体浓度_烟雾浓度报警设计(原理图+源代码+仿真+答辩论文+答辩PPT)

【毕业设计】30-基于单片机矿井瓦斯/气体浓度/烟雾浓度报警设计&#xff08;原理图源代码仿真答辩论文答辩PPT&#xff09; 文章目录【毕业设计】30-基于单片机矿井瓦斯/气体浓度/烟雾浓度报警设计&#xff08;原理图源代码仿真答辩论文答辩PPT&#xff09;任务书设计说明书摘要…

网络套接字编程(UDP协议)

文章目录预备知识socket&#xff08;网络套接字&#xff09;编程接口简单的UDP网络程序增加多用户可以互相通信预备知识 网络字节序 大端存储&#xff1a;数据的高字节内容保存在内存的低地址处&#xff0c;数据的低字节内容保存在内存的高地址处 小端存储&#xff1a;数据的高…

global关键字、python实现ATM简单功能

目录 一.局部变量、全局变量 二.global关键字 演示 三.编写ATM程序 要求 详细步骤 存在问题 改进 完整代码 一.局部变量、全局变量 1.什么是局部变量 作用范围在函数内部&#xff0c;在函数外部无法使用 2.什么是全局变量 在函数内部和外部均可使用 3.如何将函数内定…

[附源码]SSM计算机毕业设计校园自行车租售管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

高等数学(第七版)同济大学 习题10-3 (前9题)个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题10-3&#xff08;前9题&#xff09; 函数作图软件&#xff1a;Mathematica 1.化三重积分I∭Ωf(x,y,z)dxdydz为三次积分&#xff0c;其中积分区域Ω分别是\begin{aligned}&1. \ 化三重积分I\iiint_{\Omega}f(x, \ y, …

【C++】类型转换

目录 一、C语言风格类型转换 二、C风格类型转换 1.static_case 2.reinterpret_case 3、const_case 4、dynamic_case 三、RTTI 总结 一、C语言风格类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返…

【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十章 LCD触摸…

Vue.js 加入高德地图的实现方法

一、功能需求 1.根据输入内容进行模糊查询&#xff0c;选择地址后在地图上插上标记&#xff0c;并更新经纬度坐标显示 2.在地图点击后&#xff0c;根据回传的左边更新地址信息和坐标显示 二、准备 1.申请高德地图账号&#xff0c;创建应用 2.在应用管理中 获得key 和安全密…