SpringBoot的配置文件(properties与yml)

文章目录

  • 1. 配置文件的作用
  • 2. 配置文件格式
  • 3. 配置文件的使用方法
    • 3.1. properties配置文件
      • 3.1.1. 基本语法和使用
      • 3.1.2. properties优缺点分析
    • 3.2. yml配置文件
      • 3.2.1. 基本语法与使用
      • 3.2.2. yml中单双引号问题
      • 3.2.3. yml配置不同类型的数据类型及null
      • 3.2.4. 配置对象
      • 3.2.5. 配置集合
      • 3.2.6. yml优点分析
  • 4. properties与yml的区别
  • 5. 设置不同环境的配置文件

1. 配置文件的作用

SpringBoot 项目中所有重要的数据都是在配置文件中配置的,比如∶

  • 数据库的连接信息(包含用户名和密码的设置);
  • 项目的启动端口;
  • 第三方系统的调用秘钥等信息;
  • 用于发现和定位问题的普通日志和异常日志;
  • 还可以自定义配置,如配置上传文件的保存地址信息等。

想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。

配置文件中的配置类型有两类,一类是系统配置项,这种配置的格式都是固定的,是给系统(框架)使用的;另一种是用户自定义配置,用户可以随意地规定配置项的格式,又用户自行去设置和读取。

2. 配置文件格式

SpringBoot 项目配置文件有两种,一种是项目创建默认自带的的properties文件,还有一种比较新的yml文件(需要自己添加)。

配置文件是存在于resources目录下的,对于 SpringBoot 项目默认的配置文件,配置文件名必须是application,即application.propertiesapplication.yml文件,如果配置文件名不为application那就不能够被识别加载。

img

properties是可以和yml⼀起存在于⼀个项⽬当中的,yml文件相比于properties文件做了一些优化,如yml文件天然支持中文字符,而properties文件默认是不支持中文字符的,如果不进行字符配置,输入中文字符就会有乱码现象。

application.propertiesapplication.yml两个文件共存时, 虽然两个文件中的配置都会被加载,但如果这两个配置⽂件中出现了同样的配置(比如 properties 和 yml 中都配置了“server.port” ), 那么这个时候会以properties中的配置为主,也就是.properties配置⽂件的优先级最⾼。

虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)。

3. 配置文件的使用方法

properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。

3.1. properties配置文件

3.1.1. 基本语法和使用

🎯基本语法:

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的, 使⽤“#”来添加注释信息。

# key与=与value之间不要加空格
key=value

比如,设置端口号,我们可以使用配置项server.port来设置端口:

server.port=8088

配置修改完毕后,启动程序,就可以看到端口号已经设置成配置文件中所设置的端口号了。
img

还有比如设置数据库,配置项如下:

# 配置数据库 URL
spring.datasource.url="jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false"
# 配置数据库 username
spring.datasource.name="root"
# 配置数据库 password
spring.datasource.password="111111"
# 设置驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

有关更多系统的配置,可以去看看官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

除了设置配置文件的信息除了系统的配置,我们还可以自定义配置,比如:

# 用户自定义配置
custom.name=zhangsan
custom.id=666

🎯此时要读取配置文件中的信息,我们可以使用@Value注解来实现,规则如下:

// 要注意${}不能省略
@Value("${配置信息key}")
private String name;

示例代码:

package com.example.springboot.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@ResponseBody
public class TestController2 {// 自定义配置和系统配置都可以读取@Value("${custom.name}")private String name;@Value("${custom.id}")private String id;@Value("${server.port}")private String port;@RequestMapping("/coustom")public String sayHi() {return "name : " + name + " "+ "id : " + id + " "+ "port : " + port;}
}

浏览器访问结果:
img

3.1.2. properties优缺点分析

优点:

  • 配置文件结构清晰:key=value,不容易出错,适合初学者。

缺点:

  • 写法上比较冗余,臃肿,yml 配置文件能够解决这个问题。img

3.2. yml配置文件

yml 是 YMAL(Yet Another Markup language)的缩写,翻译为另一种标记语言

3.2.1. 基本语法与使用

🎯基本语法:

yml 是树型结构配置文件,特别需要注意的是 key 和 value 之间需要使用英文冒号加空格,空格一定是不能省略的。

# :后面空格一定不能省
key: value

此时,将上面的propertise转换成yml格式看一下。

# 配置端口
server:port: 8088
# 配置数据库
spring:datasource:url: "jdbc:mysql://127.0.0.1:3306/tr?characterEncoding=utf8&useSSL=false"username: "root"password: "111111"
# 自定义配置信息
custom:name: zhangsanid: 666

这里读取 yml 配置文件的方式和 properties 配置文件是一样的,就不再演示了。

3.2.2. yml中单双引号问题

我们尝试将配置文件中的配置信息设置成如下字样:

string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."

我们将这些配置信息注入到一个类,我们尝试来读取它们,这个代码 @Controller 在 Spring Boot 启动时候会把 YmlString 对象注⼊到框架中,当注⼊到框架中时会执⾏ @PostConstruct 初始化方法,就是此时读到的配置信息。

@Controller
public class YmlString {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@PostConstructpublic void postConstruct() {System.out.println("string.str1:" + str1);System.out.println("string.str2:" + str2);System.out.println("string.str3:" + str3);}
}

控制台输出结果:
img

这就说明,被双引号包裹的值,是按照原语义执行的,而被单引号包裹值(特殊字符)会发生转义,像上面的例子就是\n转义成了\\n,所以就输出了\n,最终就只是一个普通的字符串。

至于不加双引号的输出结果是因为 yml 中字符串默认是不加引号的,就直接输出了。

3.2.3. yml配置不同类型的数据类型及null

格式如下:

# 字符串
string.value: Hello
# 布尔值,truefalse
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制
# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法
# Null,~代表null
null.value: ~

使用:

package com.example.springboot.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class TestController3 {@Value("${string.value}")private String str;@Value("${boolean.value}")private boolean bool;@Value("${float.value}")private float flo;@Value("${null.value}")private Integer nul;@PostConstructpublic void postConsrtuct() {System.out.println("str: " + str);System.out.println("bool: " + bool);System.out.println("flo: " + flo);System.out.println("nul: " + nul);}
}

运行结果:

img

3.2.4. 配置对象

对于 ym l配置文件,还能进行对象的配置,如设置一个Student对象:

方式1:

student:id: 1name: 张三age: 18

方式2:

student: {id: 1,name: 张三,age: 18}

此时从配置文件读取自定义的对象,就不可以使用 @Value 注解来读取了,需要使用@ConfigurationProperties注解来进行对象的读取,并且对应的类必须有getter和setter方法。

🍂示例:

学生类:

我们这里就不自己写getter和setter方法了,我们使用 Lombok 框架中的 @Data 注解即可,其中就包含了get,set 和 toString,免去了手动创建的步骤了。

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {private int id;private String name;private int age;
}

使用类:

package com.example.springboot.controller;import com.example.springboot.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.annotation.PostConstruct;@Controller
public class ConfigController {@Autowiredprivate Student student;@PostConstructpublic void postConsrtuct() {System.out.println(student);}
}

运行结果:
img

3.2.5. 配置集合

yml 还能配置集合

🎯比如配置 list 集合,配置方式如下:

方式1:

dbtypes:name:- mysql- sqlserver- db2

方式2(推荐):

dbtypes: {name: [mysql, sqlserver, db2]}

获取与对象的获取方式一模一样,只是现在需要类里面的一个属性为集合对象。

获取示例:
与配置文件对应的对象。

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Data
@ConfigurationProperties(prefix = "dbtypes")
@Component
public class ConfigList {private List<String> name;
}

使用类:

package com.example.springboot.controller;import com.example.springboot.model.ConfigList;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.Resource;@Controller
public class ConfigController {@Resourceprivate ConfigList configList;@PostConstructpublic void postConstruct() {System.out.println(configList.getName());}
}

运行结果:
img

🎯再比如配置 map 集合,配置方式如下:

方式1:

tes:map:1: 张三2: 李四

方式2:

tes:maps: {1: 张三,2: 李四}

获取示例:
与配置文件对应的对象:

package com.example.springboot.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;@Data
@ConfigurationProperties(prefix = "tes")
@Component
public class ConfigMap {private Map<Integer, String> map;
}

使用类:

package com.example.springboot.controller;import com.example.springboot.model.ConfigMap;
import org.springframework.stereotype.Controller;import javax.annotation.PostConstruct;
import javax.annotation.Resource;@Controller
public class ConfigController2 {@Resourceprivate ConfigMap configMap;@PostConstructpublic void postConstruct() {System.out.println(configMap.toString());}
}

运行结果:

img

3.2.6. yml优点分析

  1. yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
  2. yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。
  3. 它使⽤空⽩ 符号缩进和⼤量依赖外观的特⾊,特别适合⽤来表达或编辑数据结构、各种配置⽂件等。
  4. yml ⽀持更多的编程语⾔,它不⽌是 Java 中可以使⽤在 Golang、PHP、Python、Ruby、 JavaScript、Perl 中。

4. properties与yml的区别

  1. 语法不同:properties 是 以key = value 的形式配置的键值类型的配置文件,而 yml 使用的是类似于 json 格式的树型配置方式进行配置的,yml 层级之间使用的是换行缩进的方式配置的,key 和 value 之间使用英文冒号:加空格的方式设置的,且空格不可省略。
  2. properties 为早期并且默认的配置文件格式,但配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余问题。
  3. yml 通用性更好,支持更多语言,如 Java、Go、Python,如果是云服务器开发,可以使用一份 yml 配置文件作为 Java 和 Go 的共同配置文件。
  4. yml 和 properties 可以共存,但一个项目中建议使用统一的配置类型文件。
  • yml 相较于 properties 支持更多的数据类型,如对象和集合。

5. 设置不同环境的配置文件

在日常开发中,通常会使用至少三个不同的环境:开发环境(dev)、测试环境(test)和生产环境(prod);每个环境的配置都不相同,包括数据库、端口、IP 地址等信息;那么如何区分这些环境,如何打包呢?

Spring Boot 中提供了很好的多环境整合支持,可以在打包和运行时自由切换不同的环境。

为了方便管理不同环境的配置,可以将它们放在不同的配置文件中,此时我们就需要创建不同环境的配置文件了,例如application-dev.propertiesapplication-test.propertiesapplication-prod.properties

需要注意的是,配置文件的命名必须遵循application-name.propertiesapplication-name.yml的格式,其中的name可以自定义,用于区分不同的环境。

因此,在整个项目中,需要有四个配置文件,包括application.properties(主配置文件,是必须存在的)和三个不同环境的配置文件。

img

此时创建了各个环境的配置文件条件下,还需要告诉 SpringBoot 你要运行哪个环境,主要有两种指定方式。

🎯方式1:在主配置文件中指定

可以在主配置文件(application.properties或者application.yml)中指定,内容如下:

# 指定运行环境为测试环境(application.properties)
spring.profiles.active=test# 指定运行环境为生产环境(application.xml)
spring:profiles:active: pord

此时,SpringBoot 首先默认会加载application.properties文件,而这个的文件配置又告诉 SpringBoot 去找指定环境的配置文件。

🎯方式2:运行 jar 的时候指定

SpringBoot 内置的环境切换能够在运行Jar包的时候指定环境,命令如下:

java -jar xxx.jar --spring.profiles.active=test

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

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

相关文章

CS5263替代停产IT6561连接DP转HDMI音视频转换器ASL 集睿致远CS5263设计电路原理图

ASL集睿致远CS5263是一款DP1.4到HDMI2.0b转换器芯片&#xff0c;设计用于将DP1.4源连接到HDMI2.0b接收器。 CS5263功能特性&#xff1a; DP接口包括4条主通道、辅助通道和HPD信号。接收器支持每通道5.4Gbps&#xff08;HBR2&#xff09;数据速率。DP接收机结合了HDCP1.4和HDCP…

接口测试工具——Postman测试工具 Swagger接口测试+SpringBoot整合 JMeter高并发测试工具

目录 Postman测试工具接口测试工具swaggerKnife4j1.引入依赖2.配置3.常用注解4.接口测试 JMeter什么是JMeter?JMeter安装配置1.官网下载2.下载后解压3.汉语设置 JMeter的使用方法1.新建线程组2.设置参数3.添加取样器4.设置参数&#xff1a;协议&#xff0c;ip&#xff0c;端口…

使用Nginx解决跨域问题

前言&#xff1a; 项目是公司的老项目&#xff0c;只有部署在服务器上的时候&#xff0c;项目才可以正常运行&#xff08;接口是通的&#xff09;&#xff1b;现在需求&#xff1a;在现有的项目代码上进行修改&#xff0c;请求接口是第三方给的。接口是正常的&#xff0c;通过A…

stm32f407 ADC学习记录

主要特性&#xff1a; ● 可配置 12 位、10 位、8 位或 6 位分辨率 ● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断 ● 单次和连续转换模式 ● 用于自动将通道 0 转换为通道“ n ”的扫描模式 ● 数据对齐以保持内置数据一致性&#xff08;16位的数据…

Python pycparser(c文件解析)模块使用教程

文章目录 安装 pycparser 模块模块开发者网址获取抽象语法树1. 需要导入的模块2. 获取 不关注预处理相关 c语言文件的抽象语法树ast3. 获取 预处理后的c语言文件的抽象语法树ast 语法树组成1. 数据类型定义 Typedef2. 类型声明 TypeDecl3. 标识符类型 IdentifierType4. 变量声明…

Jmeter快捷方式和应用图标设置

很多人在安装Jmeter,安装到本机却没有icon&#xff0c;每次使用的时候&#xff0c;每次打开应用都要找目录&#xff0c;不太方便。 【解决问题】 使用bin路径下的一个.bat文件&#xff0c;创建快捷方式。 【操作步骤】 Step1、将Jmeter 安装bin路径下的jmeter.bat 发送快捷方…

用node.js搭建一个视频推流服务

由于业务中有不少视频使用的场景&#xff0c;今天来说说如何使用node完成一个视频推流服务。 先看看效果&#xff1a; 这里的播放的视频是一个多个Partial Content组合起来的&#xff0c;每个Partial Content大小是1M。 一&#xff0c;项目搭建 &#xff08;1&#xff09;初…

微信小程序纯前端从阿里云OSS下载json数据-完整版

起因 因为云开发开始收费(貌似很久了),准备改造在以前的小程序,数据转到oss上,小程序使用原生,不算专业领域, 所以先百度.... 网上的教程真的是千篇一律,大部分开局就是require(ali-oss); 好点的npm install ali-oss --save开局,拼凑操作到最后发现要用云开发,因为云…

在Orangepi5开发板3588s使用opencv获取摄像头画面

先感谢香橙派群的管理员耐心指导&#xff0c;经过不断的调试修改最后成功通过opencv调用mipi摄像头获取画面 就记录分享一下大概步骤希望大家少踩点坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我用的固件系统是ubuntu2022.0.4 固件是&#x…

【jwt】JWT原理,JWT是用来解决什么问题的,如何自定义生成JWT数据,并且实现jwt数据的解码

JWT&#xff1a; JSON Web Token 1. jwt概述 用户登录成功后&#xff0c;服务端 如何知道客户端的每次请求对应的是哪个用户呢&#xff1f;怎么做&#xff1a;目前有两种方式实现. 1.1. 一是通过sessionId的方式&#xff0c;登录成功后服务端返回sessionId给客户端&#xff0…

Linux_10_进程、系统性能和计划任务

目录 1 进程和内存管理1.1 什么是进程1.2 进程结构1.3 进程相关概念1.3.1 物理地址空间和虚拟地址空间1.3.2 用户和内核空间1.3.3 C代码和内存布局之间的对应关系1.3.4 进程使用内存问题1.3.4.1 内存泄漏: Memory Leak1.3.4.2 内存溢出: Memory Overflow1.3.4.3 内存不足: OOM …

【STM32RT-Thread零基础入门】 5. 线程创建应用(线程创建、删除、初始化、脱离、启动、睡眠)

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、线程管理接口介绍二、任务&#xff1a;使用多线程的方式同时实现led闪烁和按键控制喇叭&#xff08;扫描法&#xff09;1. RT-Thread相关接…

STM32 FLASH 读写数据

1. 《STM32 中文参考手册》&#xff0c;需要查看芯片数据手册&#xff0c;代码起始地址一般都是0x8000 0000&#xff0c;这是存放整个项目代码的起始地址 2. 编译信息查看代码大小&#xff0c;修改代码后第一次编译后会有这个提示信息 2.1 修改代码后编译&#xff0c;会有提示…

ant-design-vue在ios使用AUpload组件唤起了相机,HTML的 `capture` 属性

在使用ant design vue组件的上传组件AUpload的时候有一个问题&#xff0c;直接按照demo写&#xff0c;在ios上会唤起相机&#xff0c;但是实际上我们的需求是弹出选择相册/相机这个弹框。 解决办法是加一个 cupture"null"这个属性即可 <a-upload:capture"nu…

注册中心Eureka和Nacos,以及负载均衡Ribbon

1.初识微服务 1.1.什么是微服务 微服务&#xff0c;就是把服务拆分成为若干个服务&#xff0c;降低服务之间的耦合度&#xff0c;提供服务的独立性和灵活性。做到高内聚&#xff0c;低耦合。 1.2.单体架构和微服务架构的区别&#xff1a; 单体架构&#xff1a;简单方便&#…

【后端必看】Redis 最佳实践

文章目录 1. Redis 键值设计1.1 优雅的 key 结构1.2 拒绝 BigKeyBigKey的危害如何发现BigKey①redis-cli --bigkeys② scan 扫描③第三方监控④网络监控 如何删除 BigKey 1.3 恰当的数据类型总结&#xff1a; 2. 批处理优化3. 服务器端优化-持久化配置4. 服务器端优化-慢查询优…

浅谈OCR中的David Shepard

在OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;中&#xff0c;David Shepard是一种早期的OCR技术&#xff0c;也被称为Shepards Method。 David Shepard是该OCR方法的原始作者。这种方法基于边界追踪算法&#xff0c;用于识别印刷体文本…

简单线性回归:预测事物间简单关系的利器

文章目录 &#x1f340;简介&#x1f340;什么是简单线性回归&#xff1f;&#x1f340;简单线性回归的应用场景使用步骤&#xff1a;注意事项&#xff1a; &#x1f340;代码演示&#x1f340;结论 &#x1f340;简介 在数据科学领域&#xff0c;线性回归是一种基本而强大的统…

关于视频监控平台EasyCVR视频汇聚平台建设“明厨亮灶”具体实施方案以及应用

一、方案背景 近几年来&#xff0c;餐饮行业的食品安全、食品卫生等新闻频频发生&#xff0c;比如某火锅店、某网红奶茶&#xff0c;食材以次充好、后厨卫生被爆堪忧&#xff0c;种种问题引起大众关注和热议。这些负面新闻不仅让餐饮门店的品牌口碑暴跌&#xff0c;附带的连锁…

postman测试后端增删改查

目录 一、本文介绍 二、准备工作 &#xff08;一&#xff09;新建测试 &#xff08;二&#xff09;默认url路径查看方法 三、增删改查 &#xff08;一&#xff09;查询全部 &#xff08;二&#xff09;增加数据 &#xff08;三&#xff09;删除数据 &#xff08;四&…