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;

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

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

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

相关文章

WordPress丸子小程序问题常见解决方案

WordPress丸子小程序问题常见解决方案 下载uniapp&#xff0c;导入项目。修改下图域名为自己的WP博客地址。&#xff08;如下图&#xff09; 发行微信小程序&#xff0c;如果显示不是项目所有者&#xff0c;请重新获取。 重新发行微信小程序&#xff0c;请打开微信开发者工具端…

MySql分区

一、什么是分区 MySQL分区是一种数据库设计和管理技术&#xff0c;它允许你将表分割成独立的、具有特定规则的存储单元。每个分区可以独立地进行管理&#xff0c;包括备份、恢复和优化。分区的主要目的是提高查询性能、简化维护以及实现数据的更有效管理。 以下是MySQL分区的…

深度解析:ERP管理系统背后的逻辑

深度解析&#xff1a;ERP管理系统背后的逻辑企业运营日益复杂化&#xff0c;一套高效且实用的ERP管理系统成为了企业成功的关键因素之一。然而&#xff0c;许多企业对于ERP管理系统的理解仍停留在表面&#xff0c;并未深入理解其背后的逻辑。本文将为您深度解析ERP管理系统背后…

腾讯云服务器价格表查询,腾讯云服务器怎么买便宜?

你是否需要搭建一个属于自己的网站&#xff0c;但是又不知道该如何选择和购买服务器&#xff1f;腾讯云服务器价格表查询&#xff0c;让你轻松了解各款服务器的价格及配置信息&#xff0c;帮助你选择最合适的服务器。同时&#xff0c;我们还为你提供了腾讯云服务器的优惠购买入…

main.js 中的 render函数

按照之前的单组件文件中的写法&#xff0c;我们的写法应该是这样的 import App from ./App.vuenew Vue({el: #app,templete: <App></App>,components: {App}, }) 1、定义el根节点。2、注册App组件。3、渲染 templete 模板 但是在脚手架工程中&#xff0c;他是这…

kubernetes--数据存储

目录 一、数据存储引言&#xff1a; 二、基础存储卷&#xff1a; 1. emptyDir存储卷&#xff1a; 2. hostPath存储卷&#xff1a; 3. nfs共享存储卷&#xff1a; 3.1 配置nfs: 3.2 master节点编写yaml文件&#xff1a; 4. 总结&#xff1a; 三、PVC和PV&#xff1a; 1. PV 的…

Jmeter- Beanshell语法和常用内置对象(网络整理)

在利用jmeter进行接口测试或者性能测试的时候&#xff0c;我们需要处理一些复杂的请求&#xff0c;此时就需要利用beanshell脚本了&#xff0c;BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法&#xff0c;所以它和java是可以无缝衔接的。beans…

python趣味编程-5分钟实现一个测验应用程序(含源码、步骤讲解)

Python测验是用 Python 编程语言编写的,这个关于 Python 编程的简单测验是一个简单的项目,用于测试一个人在给定主题考试中的知识能力。 Python 中的 Quiz项目仅包含用户端。用户必须先登录或注册才能开始Python 测验。 此外,还规定了解决问题的时间。用户应在时间结束前解…

VIM去掉utf-8 bom头

Windows系统的txt文件在使用utf-8编码保存时会默认在文件开头插入三个不可见的字符&#xff08;0xEF 0xBB 0xBF&#xff09;称为BOM头 BOM头文件 0.加上BOM标记&#xff1a; :set bomb 1.查询当前UTF-8编码的文件是否有BOM标记&#xff1a; :set bomb? :set bomb? 2.BOM头:文…

C语言的动态内存管理

目录 一、malloc函数 二、free函数 三、calloc函数 四、realloc函数 五、realloc函数原地扩容和异地扩容测试 六、动态内存管理的注意事项 一、malloc函数 1.头文件&#xff1a;stdlib.h&#xff08;malloc.h&#xff09; 2.函数原型&#xff1a;void * malloc(size_t siz…

STM32_SPI总线驱动OLED详细原理讲解

目录 这里写目录标题 第13章 Cortex-M4-SPI总线13.1 SPI总线概述13.1.1 SPI总线介绍13.1.2 SPI总线接口与物理拓扑结构13.1.3 SPI总线通信原理13.1.4 SPI总线数据格式 13.2 IO口模拟SPI操作OLED13.2.1 常见的显示设备13.2.2 OLED显示屏概述13.2.3 OLED特征13.2.4 显示原理13.2.…

模拟实现一个Linux中的简单版shell

exec系列接口中的环境变量 在之前我们学习了exec系类函数的功能就是将一个程序替换成另外一个程序。 然后就会出现下面的问题&#xff1a; 首先父进程对应的环境变量的信息是从bash中来的&#xff0c;因为我们自己写的父进程在运行的时候首先就要成为bash的子进程。这里我们将…

基于单片机的温度控制器系统设计

**单片机设计介绍&#xff0c; 基于单片机的温度控制器系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的温度控制器系统是一种利用单片机来检测环境温度并控制温度的系统。它通常由以下几个部分组成&#xff…

12v24v60v高校同步降压转换芯片推荐

12V/24V/60V 高校同步降压转换芯片推荐&#xff1a; 对于需要高效、稳定、低噪音的降压转换芯片&#xff0c;推荐使用WD5030E和WD5105。这两款芯片都是采用同步整流技术&#xff0c;具有高效率、低噪音、低功耗等优点&#xff0c;适用于各种电子设备。 WD5030E是一款高效率…

Web前端—小兔鲜儿电商网站底部设计及网站中间过渡部分设计

版本说明 当前版本号[20231116]。 版本修改说明20231116初版 目录 文章目录 版本说明目录底部&#xff08;footer&#xff09;服务帮助中心版权 banner侧边栏圆点 新鲜好物&#xff08;goods&#xff09;标题 底部&#xff08;footer&#xff09; 结构&#xff1a;通栏 >…

阿里云ESSD云盘、高效云盘和SSD云盘介绍和IOPS性能参数表

阿里云服务器系统盘或数据盘支持多种云盘类型&#xff0c;如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等&#xff0c;阿里云服务器网aliyunfuwuqi.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延…

Accelerate 0.24.0文档 三:超大模型推理(内存估算、Sharded checkpoints、bitsandbytes量化、分布式推理)

文章目录 一、内存估算1.1 Gradio Demos1.2 The Command 二、使用Accelerate加载超大模型2.1 模型加载的常规流程2.2 加载空模型2.3 分片检查点&#xff08;Sharded checkpoints&#xff09;2.4 示例&#xff1a;使用Accelerate推理GPT2-1.5B2.5 device_map 三、bitsandbytes量…

shell脚本学习06(小滴课堂)

fi是结束循环的意思。 这里脚本1&#xff1a;代表着脚本和1.txt文件处于同一目录下。 脚本2为绝对路径的写法。 在使用./进行启动时&#xff0c;我们需要给文件赋予执行权限。 把文件名改为2.txt: 什么都没有返回&#xff0c;说明文件已经不存在。 可以使用脚本2 if else的方式…

基于单片机的智能家居安保系统(论文+源码)

1.系统设计 本次基于单片机的智能家居安保系统设计&#xff0c;在功能上如下&#xff1a; 1&#xff09;以51单片机为系统控制核心&#xff1b; 2&#xff09;温度传感器、人体红外静释电、烟雾传感器来实现检测目的&#xff1b; 3&#xff09;以GSM模块辅以按键来实现远/近程…

Jenkinsfile+Dockerfile前端vue自动化部署

前言 本篇主要介绍如何自动化部署前端vue项目 其中&#xff0c;有两种方案&#xff1a; 第一种是利用nginx进行静态资源转发&#xff1b;第二种方案是利用nodejs进行启动访问&#xff1b; 各个组件版本如下&#xff1a; Docker 最新版本&#xff1b;Jenkins 2.387.3nginx …