SpringBoot的配置文件(properties与yml)

news2024/12/22 18:05:58

文章目录

  • 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: zhangsan
  id: 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;

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


    @PostConstruct
    public 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: 1
  name: 张三
  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 {
    @Autowired
    private Student student;

    @PostConstruct
    public 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 {
    @Resource
    private ConfigList configList;
    
    @PostConstruct
    public 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 {
    @Resource
    private ConfigMap configMap;

    @PostConstruct
    public 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.coloradmin.cn/o/887491.html

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

相关文章

百日筑基篇——Linux中文本工具应用(Linux入门六)

百日筑基篇——Linux中文本工具应用&#xff08;Linux入门六&#xff09; 文章目录 前言一、文本搜索工具 **grep**二、流式文本处理工具 **sed**三、文本处理工具 **awk**总结 前言 在Linux中&#xff0c;通常会使用一些工具来处理文本以获得所需的内容。而Linux中的文本处理…

python编程小游戏 五子棋,python编程小游戏简单的

大家好&#xff0c;本文将围绕python编程小游戏如何停止展开说明&#xff0c;python编程小游戏日语教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python编程小游戏超级玛丽需要先了解以下几个事情。 今天分享一个有趣的Python游戏库freegames&#xff0c;它里面包含经…

前端新手学习路线

文章目录 前端学习路线&#xff01;特点符号表大纲前言 - 学编程需要的特质一、前端入门⭐️ 开发工具浏览器编辑器文档笔记 ⭐️ HTML⭐️ CSS⭐️ JavaScript✅ ES6 特性 二、巩固基础前端基础知识计算机基础✅ 算法和数据结构✅ 计算机网络✅ 操作系统 软件开发基础✅ 设计模…

Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?

上文我们已经学到&#xff0c; 一个Topic&#xff08;主题&#xff09;会有多个Partition&#xff08;分区&#xff09;为了保证高可用&#xff0c;每个分区有多个Replication&#xff08;副本&#xff09;副本分为Leader 和 Follower 两个角色&#xff0c;Follower 从Leader同…

【数据结构】实现顺序表

目录 一.介绍顺序表二.实现顺序表1.创建多文件2.顺序表的存储方式3.函数的声明4.初始化顺序表5.清理顺序表6.打印顺序表7.扩容8.尾插8.尾删9.头插10.头删11.查找12.修改13.在pos位置插入13.在pos位置删除 三.全部代码1.SeqList.h2.SeqList.c3.Test.c 一.介绍顺序表 顺序表是用…

【佳佳怪文献分享】使用点云从半监督到全监督房间布局估计

标题&#xff1a;From Semi-supervised to Omni-supervised Room Layout Estimation Using Point Cloud 作者&#xff1a;Huan-ang Gao, Beiwen Tian, Pengfei Li, Xiaoxue Chen, Hao Zhao, Guyue Zhou , Yurong Chen and Hongbin Zha 来源&#xff1a;2023 IEEE Internation…

Android系统-线程-消息处理机制

引言&#xff1a; Android应用消息处理机制是怎么样的呢&#xff1f; 跟Native&#xff0c;Linux底层都有些什么关系呢&#xff1f; 概念与理解&#xff1a; Android应用程序是通过消息来驱动的。 1&#xff09;应用程序的每一个线程在启动的时候&#xff0c;都可以首先在内…

Swagger-ui在idea中的使用

1.添加依赖 <!--添加swagger2相关概念--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--添加swagger-ui相关功能--><de…

【贪心+堆】CF1701 D

Problem - 1701D - Codeforces 题意&#xff1a; 思路&#xff1a; 手推样例可知&#xff1a; 一开始想的是&#xff0c;把这些区间按右端点排序&#xff0c;然根据排序后的贪心 事实上不是这样的&#xff0c;而是要把有可能的区间扔进堆里&#xff1a; 感觉这种带堆的贪心&…

【TI-CCS笔记】工程编译配置 bin文件的编译和生成 各种架构的Post-build配置汇总

【TI-CCS笔记】工程编译配置 bin文件的编译和生成 各种架构的Post-build配置汇总 TI编译器分类 在CCS按照目录下 有个名为${CG_TOOL_ROOT}的目录 其下就是当前工程的编译器 存放目录为&#xff1a; C:\ti\ccs1240\ccs\tools\compiler按类型分为五种&#xff1a; ti-cgt-arm…

J‘meter 连接 MySQL 数据库脚本

1、创建线程组 2、创建 JDBC Connection Configuration 3、创建 JDBC Request 4、最终创建的目录 5、重点来了 5.1 在百度中下载个 MySQL-connector-Java-8.0.28.jar&#xff0c;放在 jmeter 的 bin 目录下 5.2 在测试计划中&#xff0c;将 jar 包添加到脚本中 5.3 输入参…

如何查看mysql中各个表的数据大小

1.SHOW VARIABLES LIKE datadir; 这会显示 MySQL 数据目录的路径。在这个路径下&#xff0c;你可以找到每个数据库的文件夹&#xff0c;每个数据库文件夹中会包含各个表的 .ibd 文件。 2.进入对应的目录 3.进入对应的db&#xff0c;例如我自己的db为test 4.如果我们想以M为单…

在Gazebo中添加悬浮模型后,利用键盘控制其移动方法

前段时间写了文章&#xff0c;通过修改sdf、urdf模型的方法&#xff0c;在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落&#xff1a;在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落&#xff1a;修改sdf、urdf模型_sagima_sdu的博客-CSDN博客 今天讲…

2401. 最长优雅子数组;1111. 有效括号的嵌套深度;2134. 最少交换次数来组合所有的 1 II

2401. 最长优雅子数组 核心思想&#xff1a;滑动窗口。如何知道当前值与以前的值是否and为0很重要&#xff0c;这是这道题目的关键&#xff0c;and操作会把1变成0&#xff0c;但是不会把0变成1&#xff0c;所以当前值x要和前面的值两两and为0意味着&#xff0c;你要使前面的值…

Vim的插件管理器之Vundle

1、安装Vundle插件管理器 Vim可以安装插件&#xff0c;但是需要手动安装比较麻烦&#xff0c;Vim本身没有提供插件管理器&#xff0c;所以会有很多的第三方的插件管理器&#xff0c;有一个vim的插件叫做 “vim-easymotion”&#xff0c;在它的github的安装说明里有列出对于不同…

比ChatGPT更强的星火大模型V2版本发布!

初体验 测试PPT生成 结果&#xff1a; 达到了我的预期&#xff0c;只需要微调就可以直接交付&#xff0c;这点比ChatGPT要强很多. 测试文档问答 结果&#xff1a; 这点很新颖&#xff0c;现在类似这种文档问答的AI平台收费都贵的离谱&#xff0c;星火不但免费支持而且效果也…

vue项目报错:node:internal/modules/cjs/loader:1080

运行项目报错&#xff1a; 原因&#xff1a; 看划线的地方&#xff0c;中文乱码导致找不见模块了 解决方案 将路径上的中文改为英文即可&#xff0c;项目命名最好只有英文、下划线&#xff08;_&#xff09;、数字、横杠&#xff08;-&#xff09;等英文符号组成

MATLAB图形窗口固定

起因是上次作图的时候写了&#xff1a; clc clear close all 这三个典型的刷新语句 清空工作区、命令行并且关闭图窗 就导致每次我把图窗拉到合适的位置观察&#xff0c;再一次点击运行都会重新刷新在出生点&#xff08;x&#xff09; 所以想把图窗固定在某个位置 显然更…

解决爬虫上下行传输效率问题的实用指南

嗨&#xff0c;大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我们经常会面临上下行传输效率低下的问题。在处理大量数据时&#xff0c;如果传输效率不高&#xff0c;可能会导致爬虫任务速度慢&#xff0c;甚至中断。今天&#xff0c;我将和大家分享一些解决爬虫上下…

深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)

目录 深度优先搜索&#xff08;DFS、深搜&#xff09;和广度优先搜索&#xff08;BFS、广搜&#xff09; 深度优先搜索&#xff08;简称“深搜”或DFS&#xff09; 广度优先搜索 总结 深度优先生成树和广度优先生成树 非连通图的生成森林 深度优先生成森林 广度优先生成…