当前位置: 首页 > news >正文

2023.11.15 关于 Spring Boot 配置文件

目录

引言

Spring Boot 配置文件

 properties 配置文件说明

基本语法

读取配置文件

优点

缺点

yml 配置文件说明 

基本语法

读取配置文件

yml 配置不同数据数据类型及 null

字符串 加单双引号的区别

yml 配置 列表(List) 和 映射(Map)

 yml 读取映射(Map)

读取映射(Map)

读取 映射+列表 组合

总结 

properties 和 yml 配置文件的区别

不同环境中的配置文件 


引言

Spring Boot 配置文件

  • 主要是用来写 "系统配置文件"
  • 例如 端口号设置、数据库连接设置、用户自定义配置文件 等
  • 文件格式有两种


注意:

  • properties 配置文件是最早的配置文件格式,也是 Spring Boot 项目的默认配置文件
  • 如果在 properties 配置文件 和 yml 配置文件中出现了同样的配置
  • 那么 Spring Boot 会以 properties 中的配置为主
  • 因为 properties 配置文件的优先级最高
  • 即 先加载完 properties 配置文件才会加载 yml 配置文件
  • 虽然理论上 properties 配置文件 和 yml 配置文件可以共存,但通常会采取统一的配置文件格式

 properties 配置文件说明

基本语法

  • properties 是以键值对的形式进行配置的
  • key 和 value 之间通过 " = " 连接
# 配置端口号
server.port = 8080# 配置数据库连接信息
spring.datasource.url = mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 1111# 用户自定义配置
myname = xiaolin
  • 通过 "#" 给配置文件添加注释信息
  • 关键字之间的 "." 为层次结构的分隔符,用于表示配置属性的层级关系

读取配置文件

  • 通过 @Value 注解 加上固定格式 "${ }" 来读取配置文件
  • 如果不使用固定格式,直接在()中写字符串,则直接将该字符串赋值给其标记的变量
  • 此处我们读取上述文件中自定义配置的 myname 关键字
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;@Component
public class ReadProperties {@Value("${myname}")private String name;@PostConstructpublic void printName() {System.out.println("我的名字是: " + name);}
}

运行结果:

注意:

  • @PostConstruct 是 Java 中的一个注解,它用于标记一个方法,在实例化一个对象后,该方法会在依赖注入完成后被自动调用
  • 被 @PostConstruct 注解标记的方法不能有任何参数,并且不能声明为静态方法

优点

  • 系统默认的配置文件
  •  properties 配置项的优先级比 yml 高
  • 格式简单(key value 格式)、不容易出错

缺点

  • 写法存在冗余信息


关于 properties 配置文件 的中文编码问题

  • 当你在 properties 配置文件中,使用 # 加上了一些中文注释
  • 那么可能会存在一个问题
  • 当你将当前项目文件关闭之后,再次重新使用 IDEA 打开该文件时,你的中文注释可能会变为乱码

解决步骤

1. 打开当前项目的设置

2. 按下图所示更改配置

3. 配置 下次创建新文件项目 的设置

4. 重复第二步的操作

5. 删除原 application.properties 文件

6.重新再创建一个 application.properties 文件

  • 输入 application.properties,敲击回车键 即可

yml 配置文件说明 

  • yml 格式可读性更高、写法更简洁、便于理解
  • 支持更多的数据类型,如 清单(数组)、散列表、标记等数据形态
  • 支持更多的编程语言,如 Java、Golang、PHP、Python、Ruby、JavaScript、Perl 等

基本语法

  • yml 是树形结构的配置文件,它的基础语法是 "key:value"
  • 注意 key 和 value 之间使用 英文冒号 + 空格 方式组成
  • 空格一定不可省略!!
# 配置端口号
server:port: 8888# 连接数据库
Spring:datasource:url: mysql://127.0.0.1:3306/test?characterEncoding=utf8username: rootpassword: 1111

读取配置文件

  • 与 properties 读取配置文件相同,使用 @Value 注解
  • 此处读取上述配置的端口号
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadYml {@Value("${server.port}")private Integer port;@PostConstructpublic void printPort() {System.out.println("配置的端口号是: " + port);}
}

运行结果:


yml 配置不同数据数据类型及 null

# 字符串
string.value: nihao# 布尔值 true or false
boolean.value1: true
boolean.value2: false#整数
int.value1: 20
#二进制
int.value2: 0b1100_1110_1010_1000_1111#浮点数
float.value1: 2.716
#科学计数法
float.value2: 2716e-3# ~ 代表 null
null.value: ~

字符串 加单双引号的区别

  • 在 yml 中,不加引号的效果与加单引号的效果相同
  • 均会将特殊字符自动转义成原始字符
  • 双引号则区别于前面两者
  • 即不会将特殊字符自动转义成原始字符,例如 \n 在双引号中表示换行

实例理解

  • yml 中配置文件如下所示
string:str1: hello \n world!str2: 'hello \n world!'str3: "hello \n world!"
  • 通过 @Value 注解分别读取
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadYml {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@PostConstructpublic void printString() {System.out.println(str1);System.out.println(str2);System.out.println(str3);}
}

运行结果:


yml 配置 列表(List) 和 映射(Map)

# name list列表
name-list1:- 小林- 小王- 小美# name list列表 写法二(行内写法)
name-list2: [小林,小王,小美]
  •  上述示例中 name-list1 和 name-list2 是一个包含三个字符串的 元素列表(List)
  • 其中 " - 小林 ","小林" 和 "-" 符号直接必须有空格,其他亦是如此
# student map映射 写法一
student1:id: 1name: xiaolinage: 20# student map映射 写法二 (行内写法)
student2: {id: 1,name: xiaolin,age: 20}
  •  上述示例中 student1 和 student2 是一个包含三个键值对的映射 (Map)
  • 此处的 映射(Map) 可以简单理解为 yml 中的 student "对象" 
# name map映射 + list列表
name-map3:class1:- 小林- 小王class2: 小美# name map映射 + list列表 写法二 (行内写法)
name-map4: {class1: [小林,小王], stu2: 小美}
  • 上述示例中 name-map3 和 name-map4 是一个 映射(Map),其包含两个键值对
  • 键 class1 对应的值是一个列表(List),包含两个字符串元素:"小林" 和 "小王"
  • 键 class2 对应的值是一个字符串 "小美"
# name list列表 + map映射
name-list3:- name: 小林age: 20- name: 小王age: 19# name list列表 + map映射 写法二 (行内写法)
name-list4: [{name: 小林, age: 20}, {name: 小王, age: 19}]
  • 上述示例中 name-list3 和 name-list4 是一个列表(List),其包含两个映射(Map)
  • 每个映射(Map)都有 name 和 age 两个键值对

 yml 读取映射(Map)

  • 在 yml 配置文件中读取映射(Map)不能使用 @Value 注解
  • 需使用 @ConfigurationProperties 注解来读取
  • 此注解的参数是一个键值对形式,形如 prefix = "映射名称"
  • 或不写键值对形式,直接写 映射名称 也 OK
  • 该注解需要搭配与该映射相对应的实体类
  • 该实体类有如下要求:
  • 属性名必须要以 yml 配置中的 key 值一致
  • 必须要有 setter 和 getter 方法,因为需要这两个方法初始化实体类对象

读取映射(Map)

 实例理解

  • 为了读取上述的 student1 映射(Map)
  • 此处我们创建一个 Student 实体类
  • 此处我们使用 LomBok 的 @Data 注解来提供 setter 和 getter 方法
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;//# student map映射 写法一
//    student1:
//    id: 1
//    name: xiaolin
//    age: 20//@ConfigurationProperties("student1") 写成该形式也是 OK 的
@ConfigurationProperties(prefix = "student1")
@Component
@Data
public class Student {public int id;public String name;public int age;
}
  • 此处我们创建 ReadStudent 类来调用该实体类
import com.example.demo.enity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadStudent {@Autowiredprivate Student student;@PostConstructpublic void printStudent() {System.out.println(student.toString());}
}

运行结果:

读取 映射+列表 组合

实例理解

  • 先创建一个对应的 nameMap3 类,并在该类中定义一个用于存储列表的属性
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;//# name map映射 + list列表
//      name-map3:
//        class1:
//          - 小林
//          - 小王
//        class2: 小美@ConfigurationProperties("name-map3")
//@ConfigurationProperties(prefix = "name-map3")
@Component
@Data
public class NameMap3 {private List<String> class1;private String class2;
}
  • 再创建一个 ReadNameMap3 类来调用 nameMap3 类的属性 calss1 和 class2
import com.example.demo.enity.NameMap3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;@Component
public class ReadNameMap3 {@Autowiredprivate NameMap3 nameMap3;@PostConstructpublic void printNameList1() {System.out.println(nameMap3.toString());}
}

运行结果:

总结 

properties 和 yml 配置文件的区别

  • 数据格式:properties 是以 key=value 的形式配置的键值类型的配置文件,而 yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,且 value 前的空格不可省略
  • 数据类型:yml 支持更多的数据类型
  • 通用性:yml 的通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使用一份 配置文件作为 Java 和 Go 的共同配置文件
  • 优化:properties 作为早期并默认的配置文件格式,存在一定的冗余数据,使用 yml 可以很好的解决冗余问题

不同环境中的配置文件 

  •  在实际工作中,一般会存在两种环境
  • 分别为 生产环境 和 开发环境
  • 针对这两种环境,我们需要使用不同的 yml 配置文件
  • application-dev.yml (开发环境)
  •  application-prod.yml (生产环境)
  • 此处的文件开头 "application-" 是固定的,其分隔符后可自定义名称
spring:profiles:active: dev
  • 在 application.yml 配置文件中加上 该代码 便可实现运行 dev 即开发环境的配置文件
  • 如果想运行 生产环境,将 dev 替换为 prod 即可

相关文章:

  • 基于Vue+SpringBoot的农村物流配送系统 开源项目
  • 使用composer安装ffmpeg的步骤
  • 数组相关面试题--5.合并两个有序数组
  • LEEDCODE 220 存在重复元素3
  • 数据分析场景下,企业如何做好大模型选型和落地?
  • 通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件
  • 12 Go的接口
  • System.lineSeparator() 解决 append(“\r\n“) 换行符抛异常:No such file or diretory
  • 【C++】:STL——标准模板库介绍 || string类
  • how to find gcc openbug
  • 【计算机网络】TCP协议
  • 【Kingbase FlySync】命令行:同步软件安装部署,并实现KES到KES实现同步迁移
  • 基于pytest-bdd的项目目录结构和命名规范
  • 用照片预测人的年龄【图像回归】
  • 我记不住的getopt_long的那些参数和返回值
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 基本功--面试宝典
  • Java方法详解
  • laravel 用artisan创建自己的模板
  • mongo索引构建
  • NSTimer学习笔记
  • PHP CLI应用的调试原理
  • sessionStorage和localStorage
  • Vue UI框架库开发介绍
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 高度不固定时垂直居中
  • 京东美团研发面经
  • 看域名解析域名安全对SEO的影响
  • 前嗅ForeSpider采集配置界面介绍
  • 小程序button引导用户授权
  • 小程序开发中的那些坑
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • MPAndroidChart 教程:Y轴 YAxis
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • $jQuery 重写Alert样式方法
  • (1)(1.9) MSP (version 4.2)
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C++20) consteval立即函数
  • (C语言)fread与fwrite详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (九十四)函数和二维数组
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET Core跨平台微服务学习资源
  • .Net 知识杂记
  • .NET开源项目介绍及资源推荐:数据持久层
  • .sys文件乱码_python vscode输出乱码
  • @angular/cli项目构建--Dynamic.Form
  • [145] 二叉树的后序遍历 js