【Spring】SpringBoot 配置文件

在这里插入图片描述

文章目录

  • 什么是配置文件
  • SpringBoot配置文件
  • 配置文件快速入手
  • 配置文件的格式
  • properties 配置文件说明
    • properties 基本语法
    • 读取配置文件信息
    • properties 配置格式缺点
  • yml 配置文件说明
    • yml 基本语法
      • 使用 yml 连接数据库
    • yml 使用进阶
      • yml 配置不同数据类型
      • 配置对象
      • 配置集合
      • 配置Map
    • 设置不同环境的配置文件
    • YML优缺点

什么是配置文件

配置文件是一种文本文件,通常用于存储程序的参数和设置。它包含了程序运行所需的各种选项和配置信息,例如界面风格、服务器连接信息、默认语言等。这些信息可以通过键值对的形式表示,也可以使用特定的语法和结构描述更复杂的配置信息。

配置文件通常由程序在启动时读取和解析,以自定义程序的行为。例如,在网站开发中,网站的配置文件通常包含了数据库连接信息、安全性设置、日志记录等重要信息。在操作系统中,配置文件则可以用于指定各种系统参数,如网络连接、设备驱动程序等。

配置文件的格式和内容因程序而异,常见的配置文件格式包括INI文件、XML文件、JSON文件等。INI文件是最早的配置文件格式之一,它使用简单的键值对语法来存储配置信息。XML和JSON文件则更加灵活和可扩展,可以描述更复杂的配置信息。

除了使用传统的文本编辑器手动编写配置文件外,现在也有许多工具可以帮助用户轻松地编辑和管理配置文件。例如,一些应用程序具有自己的配置文件编辑器,用户可以通过界面来直观地编辑配置信息。另外,一些配置管理工具则可以帮助用户自动化地管理和维护配置文件,例如版本控制、备份和恢复等。

SpringBoot配置文件

SpringBoot⽀持并定义了配置⽂件的格式,也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的⽬的。

很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:

  • 项目的启动端口
  • 数据库的连接信息(包含用户名和密码的设置)
  • 第三⽅系统的调⽤密钥等信息
  • ⽤于发现和定位问题的普通⽇志和异常⽇志等

每个 Spring 项目都内置了一个 Tomcat 服务器,而 Tomcat 默认使用的端口是 8080,如果 8080 端口被占用或者多个 Spring 项目同时启动的话,就会出现某些程序无法正常启动的情况,所以这时候就可以使用 Spring 的配置文件修改启动的端口。

不仅如此,在日常生活中我们很多时候都会和数据库打交道,而每个人甚至一个人的不同机器上的数据库用户名、密码和 IP 地址都是有区别的,那么当这个项目交给别人的时候就需要在 Spring 配置文件中修改相关的配置。

不仅如此,一些公共的属性以及会根据情况而改变的属性都可以放在这个 Spring 配置文件中,通过使用 Spring 配置文件可以帮助我们解决很多的问题。

配置文件快速入手

我们先通过一个简单的例子来了解配置文件的作用。

我们创建 SpringBoot 项目的时候,会自动生成一个 application.properties 文件,这就是默认的 SpringBoot 配置文件,我们在这个配置文件中修改启动端口号看看结果。

在这里插入图片描述

server.port=9090

这里可以看到启动端口号修改成功了。

在这里插入图片描述
如果我们想要访问这个项目就不能使用 127.0.0.1:8080 了,而要使用 127.0.0.1:9090 地址了。

配置文件的格式

SpringBoot 的配置文件有三种形式:

  • application.properties
  • application.yml
  • application.yaml

yml 是 yaml 的缩写,两个使用方式是相同的。并且这两个配置文件还是生活中使用频率最高的。

当应⽤程序启动时,SpringBoot会⾃动从classpath路径找到并加载
application.properties 和 application.yaml 或者 application.yml ⽂件,当然也可以使用 spring.config.name 指定文件路径和名称。

那么 properties 配置文件和 yml 配置文件有什么区别呢?区别主要体现在语法和使用场景上。properties 配置格式出现的比较早,而 yml 配置格式出现的则比较晚,并且在语法上,yml 配置格式相较于 properties 配置格式来说更加的简介,并且很重要的是:properties 配置文件中如果出现中文的话出现乱码的几率非常大,而 yml 配置格式则对中文的支持度是比较高的。存在两种配置格式,可以一定程度上降低程序员的学习成本。

  1. 理论上讲 .properties 和 .yml 可以并存在于⼀个项⽬中,当 .properties 和 .yml 并存时,两个配置都会加载。如果配置⽂件内容有冲突,则以 .properties 为主,也就是 .properties 优先级更高
  2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)

properties 配置文件说明

properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项⽬默认的配置⽂件。

properties 基本语法

properties 配置格式是以键值对的形式存在的,key 和 value 之间通过“=”连接。并且 key 和 value 之间可以存在多个空格。

# 配置启动端口号
server.port=9090

# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?charEncoding=utf8&userSSL=false
spring.datasource.name=root
spring.datasource.password=123456

配置文件中使用 # 添加注释信息。

读取配置文件信息

在项目中,如果想要主动读取配置文件中的信息的话,可以使用 @Value 注解来实现。

mykey=zhangsan
package com.example.springconfiguration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PropertiesController {
    @Value("mykey")
    private String key;

    @RequestMapping("/getkey")
    public String getKey() {
        return "获取到key:" + key;
    }
}

在这里插入图片描述
这是为什么呢?我们的 mykey 不是 zhangsan 吗?为什么获取到的是 mykey 呢?

这是因为 Spring 将@Value 中的 “mykey” 当作了 value 赋值给了 key,那么我们该如何才能获取到 key mykey 中的 value 值呢?

要想获取到 @Value key 中的 value 值,需要使用 ${} 来获取到这里面的 key 的 value 值。

@Value("${mykey}")

在这里插入图片描述

properties 配置格式缺点

为什么说 properties 配置格式对中文不是很友好呢?我们来看看:

mykey=张三

在这里插入图片描述
为什么就肯定说是 properties 配置文件的问题而不是我们前端接收到响应之后出现的问题呢?我们打断点看看。

在这里插入图片描述
这里我们读取到 mykey 的时候就是乱码,而是我的 idea 也是默认是 UTF-8 格式,是支持中文的,所以说 properties 配置文件中尽量不要出现中文

不仅如此,通过观察 properties 配置文件中的信息,我们会发现里面的内容是比较冗余的。

在这里插入图片描述

以上只是 properties 的两个显著的缺点。

yml 配置文件说明

yml 是 YAML 的缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔。光看 yml 的翻译就可以看出来 yml 的理想是非常远的“语言”。我们先来看看 yml 配置文件的基本语法。

yml 基本语法

yml 配置文件对于语法要求是非常严格的,他虽然也是以键值对的形式存在的,但是 key 和 value 之间必须以 冒号 + 空格 相连接,这个空格是不能省略的。

如果配置成功,那么属性就会有高亮提示。
在这里插入图片描述
这种灰色,就说明该属性没有配置成功,也就是语法存在问题。
在这里插入图片描述
在这里插入图片描述
空格可以有多个。

使用 yml 连接数据库

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&userSSL=false
    username: root
    password: 123456

这种 yml 配置方式显示出了层级关系并且节省了很多代码:url、username和password属性属于datasource,而 datasource 则属于 spring。

yml 使用进阶

yml 的使用不止有这些,还有其他更厉害的用法。

yml 配置不同数据类型

前面 properties 配置格式差不多所有的配置都是字符串类型,而在 yml 配置格式中还存在布尔类型、整数类型、浮点数类型以及Null类型。

# 字符串
string.value: hello

# 布尔类型
boolean.value: true
boolean.value1: false

# 整数类型
int.value: 10

# 浮点数
float.value: 3.14159

# Null  ~ 代表null
null.value: ~

那么 yml 配置文件的属性如何读取呢?这些基本的数据类型是和 properties 配置格式是一样的,都是使用 @Value 注解来获取到指定的配置。

package com.example.springconfiguration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PropertiesController {
    @Value("${string.value}")
    private String stringValue;

    @Value("${boolean.value}")
    private boolean flg1;

    @Value("${boolean.value1}")
    private boolean flg2;

    @Value("${int.value}")
    private int intValue;

    @Value("${float.value}")
    private float floatValue;

    @Value("${null.value}")
    private String nullValue;

    @RequestMapping("/getkey")
    public String getKey() {
        return stringValue + " | " + flg1 + " | " + flg2 + " | "
                + intValue + " | " + floatValue + " | " + nullValue;
    }
}

在这里插入图片描述
值得注意的是,在 yml 配置格式中,字符串的表现形式有三种,一种是不加引号、一种是加单引号、还有一种就是加双引号,与 properties 配置格式不同,因为 properties 配置格式都是字符串类型,所以从等号后面的第一个非空格字符开始就会被当成是字符串。

properties 配置格式

mykey1=abcde
mykey2='abcde'
mykey3="abcde"
@RestController
public class PropertiesController {
    @Value("${mykey1}")
    private String mykey1;

    @Value("${mykey2}")
    private String mykey2;

    @Value("${mykey3}")
    private String mykey3;
    @RequestMapping("/getkey")
    public String getKey() {
        return mykey1 + " | " + mykey2 + " | " + mykey3;
    }
}

在这里插入图片描述
yml 配置格式

string1: abcde
string2: 'abcde'
string3: "abced"
@RestController
public class YmlController {
    @Value("${string1}")
    private String string1;

    @Value("${string2}")
    private String string2;

    @Value("${string3}")
    private String string3;
    @RequestMapping("/getymlkey")
    public String getKey() {
        return string1 + " | " + string2 + " | " + string3;
    }
}

在这里插入图片描述
根据输出的内容可以看到,yml 中表示字符串的方式有三种,但是这三种方式又有一些区别。

string1: abc \n de
string2: 'abc \n de'
string3: "abc \n ed"
@RestController
public class YmlController {
    @Value("${string1}")
    private String string1;

    @Value("${string2}")
    private String string2;

    @Value("${string3}")
    private String string3;
    @RequestMapping("/getymlkey")
    public String getKey() {
        System.out.println(string1);
        System.out.println(string2);
        System.out.println(string3);
        return string1 + " | " + string2 + " | " + string3;
    }
}

在这里插入图片描述
可以看到没有引号和单引号的用法基本上是一样的,但是双引号就会有区别,没有引号和单引号会将字符串中的一些特殊符号进行转义,使之呈现出跟字符串里面一样的内容,而双引号则不会进行转义。

配置对象

yml 中不仅能配置一些基本的数据类型,还可以配置对象。啊?我没听错吧?yml 配置格式还能配置对象?没错,你没听错,我们 yml 就是这么厉害。那么在 yml 中如何配置对象呢?

student:
  id: 123
  name: zhangsan
  age: 18

类似上面的配置格式就是 yml 配置对象,当然也可以使用行内写法(跟上面的写法作用是一致的)。

student1: {id: 234, name: lisi, age: 20}

那么如何取出配置的对象呢?这时候就不能使用 @Value 注解了,需要使用 ConfigurationProperties 注解,并且取出也需要借助类来读取。

package com.example.springconfiguration;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private int id;
    private String name;
    private int age;
}

仅仅只是通过类来读取也是不行的,还需要保证类中的属性名称和 yml 配置文件中的对象的属性名称一致,并且类中为这些属性提供了 getter 和 setter 方法。

这是 ConfigurationProperties 注解的参数,如果不指定参数的名称的话,默认就是value/prefix。
在这里插入图片描述

package com.example.springconfiguration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class StudentController {
    @Autowired
    private Student student;

    @RequestMapping("/readStudent")
    public String readStudent() {
        return student.toString();
    }
}

在这里插入图片描述

配置集合

yml 配置文件还可以配置集合。

dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

读取 yml 配置文件中的集合同样是依赖 ConfigurationProperties 注解和类以及类中的 getter 和 setter 方法。

package com.example.springconfiguration;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class ListConfig {
    private List<String> name;
}

package com.example.springconfiguration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ListController {
    @Autowired
    private ListConfig listConfig;

    @RequestMapping("/readList")
    public String readList() {
        return listConfig.toString();
    }
}

在这里插入图片描述

配置Map

yml 配置格式还可以配置 Map 类型的属性。

maptypes:
  map:
    k1: China
    k2: America
    k3: Japanese

行内写法:

maptypes2: {map: {k1: China, k2: America, k3: Japanese}}

读取 Map 类型配置也是依赖 ConfigurationProperties 注解和类以及类中的 getter 和 setter 方法。

package com.example.springconfiguration;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
@ConfigurationProperties(prefix = "maptypes")
@Data
public class MapConfig {
    private Map<String, String> map;
}

package com.example.springconfiguration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MapController {
    @Autowired
    private MapConfig mapConfig;

    @RequestMapping("/readMap")
    public String readMap() {
        return mapConfig.toString();
    }
}

在这里插入图片描述

设置不同环境的配置文件

有可能我们一个项目中针对不同的情况会有不同的配置,那么我们是否要每到一个新环境就将另一个配置文件中的内容复制到当前使用的配置文件中吗?其实没必要,一个 Spring 项目中允许存在多个配置文件,并且我们可以指定使用哪个配置文件。

但是需要注意的是,spring 中的配置文件必须以 application-xxx.yml 格式命名。比如 application-dev.ymlapplication-prod.yml,如果需要切换的话,只需要在 application.yml 配置文件中加入

spring:
	profiles:
		active: dev  # application-xxx.yml  这里填 - 后面的字符

在这里插入图片描述
在这里插入图片描述

假设我们这里使用 application-dev.yml 配置文件。

在这里插入图片描述

YML优缺点

优点:

  1. 易读性强:YAML采用缩进和符号的方式表示层次结构,使得配置文件易于阅读和理解。
  2. 数据结构丰富:YAML支持多种数据结构类型,如标量、数组、映射等,可以方便地表示各种数据结构。
  3. 支持多语言:YAML的语法简洁,易于学习,支持多种编程语言进行解析和读取。

缺点:

  1. 错误易引入:由于YAML的缩进规则严格,如果缩进不一致或者符号使用不当,会导致解析错误。
  2. 安全性问题:由于YAML易于阅读和编写,可能存在被篡改的风险。在安全敏感的应用中,需要采取额外的安全措施。
  3. 依赖外部库:在某些编程语言中,需要依赖特定的第三方库才能解析和读取YAML文件。这可能会增加开发者的负担。

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

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

相关文章

构建外卖系统:从技术到实战

在当今高度数字化的社会中&#xff0c;外卖系统的开发变得愈发重要。本文将从技术角度出发&#xff0c;带领读者一步步构建一个基础的外卖系统&#xff0c;并涵盖关键技术和实际代码。 1. 技术选型 1.1 后端开发 选择Node.js和Express框架进行后端开发&#xff0c;搭建一个灵…

Java框架基础--maven,http,postman

maven Maven 提供了一个标准的构建生命周期和一组约定的目录结构&#xff0c;以简化和规范项目的构建过程。它主要用于 Java 项目&#xff0c;但也可以用于其他类型的项目。提高了项目的可维护性、可重复性和一致性&#xff0c;简化了构建和依赖管理的复杂性&#xff0c;使得开…

docker-compose部署openldap

前段时间在本地搭建了一套gitlab geo测试环境&#xff0c;因为需要集成ldap&#xff0c;所以特意搭建下&#xff0c;特此作为笔记记录下。 文章目录 1. 前置条件2. 编写docker-openldap.yml文件3. 登录4. 使用创建组创建用户登录测试 1. 前置条件 安装docker-compose 安装docke…

python 用hyperlpr3 进行车牌识别

开源项目 https://github.com/zeusees/HyperLPR 下面按装相关的模块 pip install opencv-python pip install hyperlpr3 pip install cvlib代码 download_image_from_url 将网上图片存本地。 import urllib.request import cv2 import hyperlpr3 as lpr3 import matplotlib.…

Gateway集成方法以及拦截器和过滤器的使用

前提&#xff1a;请先创建好一个SpringBoot项目 1. 引入依赖 SpringCloud 和 alibabaCloud 、 SpringBoot间对版本有强制要求&#xff0c;我使用的springboot是3.0.2的版本。版本对应关系请看&#xff1a;版本说明 alibaba/spring-cloud-alibaba Wiki GitHub <dependency…

windows安装npm教程

NPM&#xff08;Node Package Manager&#xff09;是一个用于管理和共享JavaScript代码包的工具。它是Node.js生态系统的一部分&#xff0c;广泛用于构建JavaScript应用程序和库。 以下是NPM的主要功能和用途&#xff1a; 1.代码包管理 NPM允许开发者在项目中安装、更新、卸载…

Bellman_Ford算法总结

知识概览 Bellman_Ford算法适合解决存在负权边的最短路问题&#xff0c;时间复杂度为O(nm)。在存在负权边的最短路问题中&#xff0c;Bellman_Ford算法的效率虽然不如SPFA算法&#xff0c;但是Bellman_Ford算法能解决SPFA算法不能解决的经过不超过k条边的最短路问题。 例题展示…

Java对象内存布局和对象头

Java对象内存布局和对象头 在 HotSpot 虚拟机中&#xff0c;对象在内存中的布局分为三块区域&#xff1a;对象头&#xff0c;实例数据和对齐填充。 对象头中包含两部分&#xff1a;MarkWord 和 类型指针。如果是数组对象的话&#xff0c;对象头还有一部分是存储数组的长度。 …

什么是OAuth2.0

前言 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方移动应用或分享他们数…

【python】Ubuntu下安装spyder及matplotlib中文显示

一、查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy尝试用cat /etc/debian_version命令&#xff0c;竟然可以显示出来Debian的版本。 $ cat /etc/debian_version …

北斗三号海上人员落水报警及示位搜救系统

海洋水上作业中&#xff0c;人员落水问题时有发生&#xff0c;过去救援人员很难获取落水人员呼救信息、确定落水人员位置、事故发生时间以及事态严重程度&#xff0c;以给予最及时的救援&#xff0c;管理人员都对此无计可施&#xff0c;缺乏有效技术手段是目前海上事故救援效率…

如何使用JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

2023年小型计算机视觉总结

在过去的十年中&#xff0c;出现了许多涉及计算机视觉(CV)的项目&#xff0c;无论是小型的概念验证项目还是更大规模的生产应用。应用计算机视觉的方法是相当标准化的: 1、定义问题(分类、检测、跟踪、分割)、输入数据(图片的大小和类型、视野)和类别(正是我们想要的) 2、注释…

WEB 3D技术 three.js 通过分组顶点 给同一个物体设置多个材质

上文 WEB 3D技术 three.js 集合体 讲解三角形构建图形 顶点概念 顶点值重用 我们讲到 一个元素是由多个面组成的 那么 我们是不是可以一个物体用多个材质&#xff1f; 简单说 一个面用一种材质 我们还是在官网中搜索 geome 如下图选择 然后 找到 groups 顶点组 它能够将我们的…

Abaqus随机单元删除插件:Random Element Del - AbyssFish

插件介绍 Random Element Del - AbyssFish 插件可在Abaqus软件内对自建网格部件进行指定区域内的随机单元删除&#xff0c;可用于生成指定孔隙率或模拟缺陷等。 插件使用中指定需要进行删除的部件&#xff0c;这里的部件需要为网格部件。设定删除单元的比例参数&#xff08;…

使用Java语言统计一行字符串的数据

方法 创建字符串接收器&#xff0c;接收用户输入的字符串&#xff0c;然后将其转换为字符串数组&#xff0c;安装字符对应的字节码进行判断。 代码 import java.io.*; public class StaticsChar {public static void main(String[] args) throws IOException{String zifuch…

如何使用Docker部署Dashy并无公网ip远程访问管理界面

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

2023年全球前端大技术大会(GMTC北京站2023)-核心PPT资料下载

一、峰会简介 大会以“业务至上&#xff0c;效率为王”为主题&#xff0c;策划了 1 个主会场&#xff0c;10 个技术专场。会议议题包含前端 DevOps 实践、低代码、大前端监控、跨端技术选型、团队可持续发展、IoT 动态应用开发、移动端性能与效率优化、TypeScript、大前端技术…

【期末复习】微信小程序复习大纲( 1- 5 章)

前言&#xff1a; 这周开始进入期末复习周&#xff0c;没时间看C/C、linux等知识了&#xff0c;先把期末考试必考的知识捋一遍。 目录 第一章 微信小程序入门 一、填空题 二、判断题 三、选择题 四、简答题 第二章 微信小程序页面制作 一、填空题 二、判…

三叠云工程劳务管理,优化建筑施工管理,提升效率与质量

随着建筑行业的蓬勃发展&#xff0c;工程施工现场管理变得愈发复杂。传统的人员管理方式已经无法满足企业快速发展的需求。如何提高施工效率、优化人力资源管理成为了建筑企业亟待解决的问题。逐渐走向数字化的工程建设行业&#xff0c;急需一种足以匹配这一时代变革、高效管理…