2023.11.15 关于 Spring Boot 配置文件

news2024/12/23 23:30:41

目录

引言

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;

    @PostConstruct
    public 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=utf8
    username: root
    password: 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;

    @PostConstruct
    public 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;

    @PostConstruct
    public 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: 1
  name: xiaolin
  age: 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 {

    @Autowired
    private Student student;

    @PostConstruct
    public 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 {
    @Autowired
    private NameMap3 nameMap3;

    @PostConstruct
    public 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 即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机应用从零开始(四)

51单片机应用从零开始&#xff08;一&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;二&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;三&#xff09;-CSDN博客 详解 KEIL C51 软件的使用建立工程-CSDN博客 详解 KEIL C51 软件的使用设置工程编绎与连接程序…

SQL注入学习--GTFHub(布尔盲注+时间盲注+MySQL结构)

目录 布尔盲注 手工注入 笔记 Boolean注入 # 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 时间盲注 手工注入 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 MySQL结构 手工注入 sqlmap注入 笔记 union 联合注入&#xff0c;手工注入的一般步骤 …

python趣味编程-5分钟实现一个Flappy Bird游戏(含源码、步骤讲解)

Python 中的 Flappy Bird 游戏可以免费下载开源代码,它是为想要学习 Python 的初学者创建的。 该项目系统使用了 Pygame 和 Random 模块。 Pygame 是一组跨平台的 Python 模块,专为编写视频游戏而设计。 Python 中的 Flappy Bird 代码 – 项目信息 项目名称:Python 中的 Fl…

解决Jira导出csv最大限度是1000的问题

JIRA为了防止过多影响性能&#xff0c; 设置了导出CSV的上线为1000&#xff0c;影响了搜索结果导出以及RestAPI。 可以通过以下配置参数修改此限制&#xff1a; 通过JIRA管理界面的"高级设置 “设置以下参数 系统管理 > 系统 > 一般设置>高级设置找到 jira.sea…

qt Rectangle 使用Gradient设置渐变方向 制作渐变进度条

1.Gradient方向可查看官网 Gradient.Horizontala horizontal gradient Gradient.Verticala vertical gradient ​​ ProgressBar {id: batteryvalue: 0.5width: 150height: 20anchors.centerIn: parentbackground: Rectangle {implicitWidth: battery.widthimplicitHeight:…

Github小彩蛋显示自己的README,git 个人首页的 README,readme基本语法

先上效果&#x1f447; 代码在下面&#xff0c;流程我放最下面了&#xff0c;思路就是创建一个和自己同名的仓库&#xff0c;要公开&#xff0c;创建的时候会提示小彩蛋你的reademe会展示在你的首页&#xff0c;或许你在这个readme里面的修改都会在你的主页上看到了&#x1f44…

excel导入 Easy Excel

依旧是框架感觉有东西&#xff0c;但是确实是模拟不出来&#xff0c;各种零零散散的件太多了 controller层 ApiOperation(value "导入Excel", notes "导入Excel", httpMethod "POST", response ExcelResponseDTO.class)ApiImplicitParams({…

python+requests接口自动化完整项目设计源码

前言 有很多小伙伴吵着要完整的项目源码&#xff0c;完整的项目属于公司内部的代码&#xff0c;这个是没法分享的&#xff0c;违反职业道德了&#xff0c;就算别人分享了&#xff0c;也只适用于本公司内部的业务。 所以用例的代码还是得自己去一个个写&#xff0c;我只能分享…

【Android】使用XML资源文件存储配置项:降低代码耦合性并提高可重用性

前言 在Android开发中&#xff0c;我们经常需要存储一些配置项。 例如在创建Retrofit实例时&#xff0c;需要指定baseUrl。如果需要修改替换整个项目中的baseUrl&#xff0c;那将会是一件很痛苦的事情。 为了方便管理和维护这些配置项&#xff0c;我们可以使用资源文件来存储…

文旅媒体有哪些?如何邀请到现场报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 中国文旅产业在近年来得到了持续而快速的发展。从产业端看&#xff0c;中国文旅产业呈现出新的发展趋势&#xff0c;其中“文旅”向“文旅”转变成为显著特点。通过产业升级和空间构建&a…

设计模式-适配器-笔记

适配器模式Adapter 动机&#xff08;Motivation&#xff09; 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将“一些现存的对象”放在新的环境中应用&#xff0c;但是新环境要求的接口是在这些现存对象所不满足的。 如何应对这种“迁移的变化”&#xff1…

Vue23全局事件总线

Vue2&3全局事件总线 Vue2全局事件总线 功能&#xff1a;可以解决所有组件之间通信传数据的问题原理&#xff1a;通过一个共享对象&#xff0c;将所有组件全部绑定到对象上&#xff0c;即可通过这个对象实现组件与组件之间的传递数据&#xff0c;而这个共享对象叫做全局事件…

CSDN每日一题学习训练——Python版(简化路径,不同的二叉搜索树)

版本说明 当前版本号[20231116]。 版本修改说明20231116初版 目录 文章目录 版本说明目录简化路径题目解题思路代码思路参考代码 不同的二叉搜索树题目解题思路代码思路参考代码 简化路径 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路…

YOLOv8改进 | ICLR 2022 |ODConv附修改后的C2f、Bottleneck模块代码

论文地址&#xff1a;论文地址点击即可跳转阅读 代码地址&#xff1a;文末提供复制粘贴的代码块 一、本文介绍 这篇文章给大家带来的是发表于2022年ICLR的ODConv(Omni-Dimensional Dynamic Convolution)中文名字全维度动态卷积&#xff0c;该卷积可以即插即用&#xff0c;可…

【flink理论】动态表:关系查询处理流的思路:连续查询、状态维护;表转换为流需要编码编码

文章目录 一. 使用关系查询处理流的讨论二. 动态表 & 连续查询(Continuous Query)三. 在流上定义表1. 连续查询2. 查询限制2.1. 维护状态2.2. 计算更新 四. 表到流的转换1. Append-only 流2. Retract 流3. Upsert 流 本文主要讨论了&#xff1a; 讨论通过关系查询处理无界流…

MySQL 1、初识数据库

一、什么是数据库&#xff1f; 以特定的格式保存好的文件&#xff0c;我们就叫做数据库。 提供较为便捷的数据的存取服务的软件集合、解决方案&#xff0c;我们就叫它数据库。 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库。 文件或数据库都可以存储数据&#…

基于单片机设计的水平仪(STC589C52+MPU6050)

一、前言 【1】项目背景 水平仪是一种常见的测量工具&#xff0c;用于检测物体或设备的水平姿态。在许多应用中&#xff0c;如建筑、制造和航空等领域&#xff0c;保持设备的水平姿态是非常重要的。为了实现实时的水平检测和显示&#xff0c;基于单片机设计的水平仪是一个常见…

LeetCode(26)判断子序列【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 判断子序列 1.题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;…

设计模式解码:软件工程架构的航标

引言 软件工程领域的设计模式&#xff0c;就像是建筑师手中的设计蓝图&#xff0c;它们是经验的总结&#xff0c;指导开发者如何在面对层出不穷的编程难题时&#xff0c;构建出既稳固又灵活的软件结构。就像一座经过精心设计的大厦能够经受住风雨的考验一样&#xff0c;一个利用…

通讯录实现之进阶版将通讯录数据保存在文件中(完整代码)

我们在之前的博客中已经写过两版通讯录了&#xff1a; 第一版是用C语言实现了通讯录&#xff0c;但是通讯录的存储人数信息是固定的&#xff0c;用完就没有了 感兴趣的可以转到对应博客看一下&#xff0c;附带链接&#xff1a;第一版通讯录 第二版是在第一版的基础上动态开辟…