【Spring】Spring配置文件

目录

​什么是配置文件?

配置文件的作用

SpringBoot配置文件

配置文件格式

配置文件的优先级

properties配置文件说明

properties基本语法

读取配置文件

properties缺点

yml配置文件说明

yml基本语法

使用yml连接数据库

yml配置不同数据类型及null

 注意事项

@PostConstruct

配置对象

配置集合

配置Map

yml配置文件的优缺点

优点

缺点

总结


什么是配置文件?

配置文件是一种存放应用程序或系统配置的文件,包含了程序运行时所需要的各种选项和配置信息,例如字体样式、默认语言等。它允许开发者和用户在不修改代码的情况下,调整应用程序的行为和性能。配置文件通常以文本形式存在,格式可以是XML、JSON、YAML(yml)、INI、Properties等。

配置文件的作用

配置文件主要是为了解决硬编码代码的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。

使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互

硬编码指的是将数据直接嵌入到程序或者其他可执行对象的源代码中,也就是我们常说的将“代码写死”。

SpringBoot配置文件

SpringBoot支持并定义了配置文件的格式,也是在另一个层面达到了规范其他框架集成到SpringBoot的目的。

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

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

SpringBoot中,内置了Tomcat服务器,默认端口号是8080,但在用户电脑上8080端口号可能会被其他应用程序占用,此外,如果启动多个SpringBoot项目,那么端口号也需要不同,所以SpringBoot需要支持让用户自定义端口号。

配置文件格式

在SpringBoot中,有三种不同形式的配置文件

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

yml是yaml的缩写,实际开发中出现的频率最高。yaml和yml使用方式是一样的,都是键值对的形式,所以后面我们只讲yml。

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

配置文件的优先级

  • 理论上,application.properties 和 application.yml 是可以同时存在同一个项目中的,当这两个配置文件都存在,两个配置都会加载。如果配置文件内容有冲突,以application.properties 为主,即 application.properties 的优先级更高。
  • 虽然在理论上两个配置文件可以共存,但在实际的业务中,我们都是采用一种统一的配置文件,这样可以更好的维护(降低故障率)

properties配置文件说明

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

properties基本语法

properties是以键值对的形式配置的,key和value之间用“=”来连接。

示例:

#配置项目端口号
server.port=9090
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=false
#配置数据库用户名
spring.datasource.username=root
#配置数据库密码
spring.datasource.password=root
#配置数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

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

读取配置文件

在项目中,如果我们想要读取到配置文件中的内容,需要使用 @Value 注解并且在注解中使用“${}”的格式来读取

my.text=hello world
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/pro")
@RestController
public class PropertiesController {@Value("${my.text}")private String key;@RequestMapping("/text1")public String getValue() {return "获取到的value为:" + key;}
}

properties缺点

properties配置是以键值对的形式配置的,我们通过观察,可以看到里面有些代码比较冗余。

此外,properties配置格式对中文也是不友好,我们把value值换为中文,再来试一下:

my.text=你好 世界

 

为什么会这样,我们可以打断点看一下:

可以看到,key的值是四个问号。 但是idea默认的字符集是UTF-8,是支持中文的,为了防止这种情况发生,所以我们在properties配置文件中尽量不要出现中文

接下来,我们来讲一下yml配置文件。

yml配置文件说明

yml是yaml的缩写,全程是 Yet Another Markup Language 翻译过来就是“另一种标记语言”。

yml基本语法

yml是树形结构的配置文件,基本语法是:key: value(注意:冒号后面是有空格的,不能省略!!!

key后+(冒号+空格

我们可以看到,正确的写法的key是会有高亮提示的(橙色,当然应该可以设置成其他颜色),而对于错误的写法,key还是灰色

此外,只要冒号有空格隔开,就是正确的写法,至于空格的数量,是不限的,当然按照规范来写的话,最好就一个。

使用yml连接数据库

spring: datasource:url: jdbc:mysql://localhost:3306/beantext?characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

可以看到,相对properties配置文件的写法,yml配置文件的写法不仅能够体现出层级关系还能节省不必要的代码

此外,yml还有其他操作。

yml配置不同数据类型及null

# 字符串
string.value: hello# 布尔类型
boolean.value: true
boolean.value1: false# 整数类型
int.value: 10# 浮点数
float.value: 3.14159# Null  ~ 代表null
null.value: ~# "" 空字符串
# '' 单引号也表示空字符串
# 冒号后面什么都不加也可以表示空字符串。但这种方式不直观,更多的表示是使用引号括起来
empty:value1: ''value2: ""value3:

那么yml配置文件的属性应该如何获取?

其实跟properties配置文件获取属性的操作一样,都是要使用 @Value 注解来进行获取的。

package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/pro")
@RestController
public class PropertiesController {@Value("${string.value}")private String value;@Value("${boolean.value}")private Boolean value1;@Value("${boolean.value1}")private Boolean value2;@Value("${int.value}")private Integer value3;@Value("${float.value}")private Float value4;@Value("${null.value}")private String value5;@RequestMapping("/getValue")public String getValue() {return "获取到的value为:" + value+" | "+value1+" | "+value2+" | "+value3+" | "+value4+" | "+value5;}
}

 注意事项

字符串默认不用加上单引号或者双引号,如果加英文的双引号可以表示特殊的含义,而如果加英文的单引号则不会表示特殊的含义

我们来看个例子来理解这段话的意思:

string:value1: Hello \n SpringBootvalue2: 'Hello \n SpringBoot'value3: "Hello \n SpringBoot"
package com.example.demo.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/pro")
@RestController
public class PropertiesController {@Value("${string.value1}")private String value1;@Value("${string.value2}")private String value2;@Value("${string.value3}")private String value3;@RequestMapping("/getValue")public String getValue() {System.out.println(value1);System.out.println(value2);System.out.println(value3);return "OK";}
}

可以看到,不加引号的和加单引号的不会让“\n”进行换行,而加双引号的依旧会让"\n"进行换行操作。

我们可以得出结论:

  • 字符串默认不用加上单引号或双引号;
  • 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通的字符串;
  • 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义

可能会有点绕,\n本义是换行

使用单引号会转义,就是说不再换行了,\n只是一个普通的字符串;

使用双引号不会转义,就是说\n依旧是它本身的含义,即换行。

这里我们来了解一个新的注解:@PostConstruct

@PostConstruct

@PostConstruct可以标注在方法上,被标注的方法会在Spring容器完成Bean的实例化和依赖注入之后自动执行。所以我们这里可以偷个懒,后面的讲解我们就使用这个注解来帮我们完成测试。

需要注意:

  • 用该注解修饰的方法必须是非静态方法;
  • 不能有参数;
  • 返回类型通常是void

配置对象

yml配置文件不仅能配置一些基本的数据类型,还能配置对象。

写法如下:

#配置对象
student:name: '张三'age: 18

也可以写成行的形式:

#行的形式
student1: {name: '张三', age: 18}

那么这个时候我们就不能使用 @Value 注解来获取配置中的对象了,需要使用另外一个注解@ConfigurationProperties 来读取,如下:

package com.example.demo.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@Component
@ConfigurationProperties(prefix = "student")//prefix表示前缀
public class Student {private String name;private int age;
}
@Controller
public class PropertiesController {@Autowiredprivate Student student;@PostConstructpublic void getStudent() {System.out.println(student);}
}

配置集合

ymp还可以配置集合。

配置格式:

-后一定要加空格,否则-和后面的内容就成了整体,统一赋值给对应的属性

type:list:- 'zhangsan'- 'lisi'- 'wangwu'

 

package com.example.demo.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Data
@Component
@ConfigurationProperties("type")
public class ListConfig {private List<String> list;}
@Controller
public class PropertiesController {@Autowiredprivate ListConfig listConfig;@PostConstructpublic void getList() {System.out.println(listConfig.toString());}
}

 

配置Map

 

package com.example.demo.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.Map;@Data
@Component
@ConfigurationProperties("maptypes")
public class MapConfig {private Map<String, String> map;
}
package com.example.demo.controller;import com.example.demo.model.ListConfig;
import com.example.demo.model.MapConfig;
import com.example.demo.model.Student;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
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.RestController;@Controller
public class PropertiesController {@Autowiredprivate MapConfig mapConfig;@PostConstructpublic void getMap() {System.out.println(mapConfig);}
}

yml配置文件的优缺点

优点
  • 可读性⾼,写法简单, 易于理解
  • 采用缩进和嵌套来表示层次结构,适合非常复杂配置的管理
  • ⽀持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
  • ⽀持更多的编程语⾔, 不⽌是Java中可以使⽤, 在Golang, Python, Ruby, JavaScript中也可以使⽤
缺点
  • 不适合写复杂的配置⽂件
  • 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案),对缩进敏感

总结

什么是配置文件?

配置文件是用来存放应用程序或者系统的配置的文件,可以在不动源码的情况下对应用程序的性能和行为进行调整,使用配置文件,可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互

SpringBoot的配置文件

Spring有三种配置文件:

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

application.properties 和 application.yml 是可以同时存在同一个项目中的,以application.properties为主,.properties的优先级更高

配置文件的格式

  •  application.properties:键值对形式,key和value用“=”隔开​​​​​​​
  • application.yml:也是键值对,key和value用“冒号+空格”隔开。

读取配置文件的方式

对于基本的数据类型,我们采用 @Value 注解即可,但对于对象、集合、map这些,我们需要使用 @ConfigurationProperties

@PostConstruct可以标注在方法上,被标注的方法会在Spring容器完成Bean的实例化和依赖注入之后自动执行。要求是:方法不能是静态方法,不能有参数,返回值尽量为void。


 

以上就是本篇所有内容~

若有不足,欢迎指正~ 

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

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

相关文章

蓝桥杯篇---实时时钟 DS1302

文章目录 前言特点简介1.低功耗2.时钟/日历功能3.32字节的额外RAM4.串行接口 DS1302 引脚说明1.VCC12.VCC23.GND4.CE5.I/O6.SCLK DS1302 寄存器1.秒寄存器2.分钟寄存器3.小时寄存器4.日寄存器5.月寄存器6.星期寄存器7.年寄存器8.控制寄存器 DS1302 与 IAP25F2K61S2 的连接1.CE连…

Dubbo:高效的分布式服务框架

引言 在当今互联网应用的快速发展中&#xff0c;微服务架构已经成为一种主流的设计模式&#xff0c;它将一个大型单体应用拆分成多个小型、松耦合的服务。Dubbo 作为一款由阿里巴巴开源的 RPC 服务框架&#xff0c;专门为解决分布式系统中服务通信和治理的问题而设计。本文将深…

Visual Studio Code使用ai大模型编成

1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用

【Javascript Day18】

目录 标签事件绑定的属性参数 阻止默认行为 dialog的实现及组织冒泡&#xff08;捕获&#xff09;传递 基于冒泡的事件委托 键盘事件的事件源对象信息 JS的自动触发操作 标签事件绑定的属性参数 <!-- 标签上的事件绑定&#xff0c;事件源对象通过 关键字event传递 --…

解锁机器学习核心算法 | 支持向量机:机器学习中的分类利刃

一、引言 在机器学习的庞大算法体系中&#xff0c;有十种算法被广泛认为是最具代表性和实用性的&#xff0c;它们犹如机器学习领域的 “十大神器”&#xff0c;各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向…

玩客云 IP查找

1.玩客云使用静态IP在不同网段路由器下不能使用&#xff0c;动态不好找IP地址 1.1使用python3 实现自动获取发送 import requests import os import socket# 从环境变量获取 PushPlus 的 token 和群组编码 PUSH_PLUS_TOKEN os.getenv("PUSH_PLUS_TOKEN") PUSH_PLU…

Linux(Centos 7.6)命令详解:cat

1.命令作用 将文件或标准输入连接到标准输出(Concatenate FILE(s), or standard input, to standard output)&#xff0c; 即将文件内容输出到屏幕上&#xff0c;或者将多个文件合并成一个文件。 2.命令语法 Usage: cat [OPTION]... [FILE]... 3.参数详解 OPTION: -A, -…

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…

Hive增量迁移方案与实操PB级

客户一共1PB数据&#xff0c;每天新增10T&#xff0c;有些表只保留3天。 需要客户提供&#xff1a; a.tbl_size(大小GB) a.last_mtime(最新更新时间) a.tbl_ttl(保留时间) b.last_part_dt(分区值) b.last_part_size(最新分区大小) t_day(表更新规律,t几) 因为目前…

未来游戏:当人工智能重构虚拟世界的底层逻辑

未来游戏&#xff1a;当人工智能重构虚拟世界的底层逻辑 在《赛博朋克2077》夜之城的霓虹灯下&#xff0c;玩家或许已经注意到酒吧里NPC开始出现微表情变化&#xff1b;在《艾尔登法环》的开放世界中&#xff0c;敌人的战术包抄逐渐显露出类人智慧。这些细节预示着游戏产业正站…

React中如何处理高阶组件中的错误

在 React 高阶组件中处理错误是确保应用程序健壮性和稳定性的重要环节。以下是一些处理高阶组件中错误的常见方法&#xff1a; 1. 捕获渲染时的错误 在高阶组件中&#xff0c;渲染过程可能会因为各种原因&#xff08;如 props 数据格式错误、组件内部逻辑异常等&#xff09;抛…

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线&#xff0c;试用了下阿里云和腾讯云的deepseek服务&#xff0c;在回答经典数学问题9.9和9.11谁大时&#xff0c;发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…

宝塔面板开始ssl后,使用域名访问不了后台管理

宝塔面板后台开启ssl访问后&#xff0c;用的证书是其他第三方颁发的证书 再使用 域名/xxx 的形式&#xff1a;https://域名:xxx/xxx 访问后台&#xff0c;结果出现如下&#xff0c;不管使用 http 还是 https 的路径访问都进不后台管理 这个时候可以使用 https://ip/xxx 的方式来…

开发板部署|RK3588部署DeepSeek-1.5B

前言 在 RK3588 上部署大模型可以显著提升计算效率、节能、加速推理过程&#xff0c;并实现本地化推理&#xff0c;适合各种边缘计算应用&#xff0c;如智能设备、自动驾驶、工业机器人、健康监测等领域。此外&#xff0c;RK3588 配备了强大的 NPU&#xff08;神经网络处理单元…

UDP与TCP

用UDP一定比用TCP快吗&#xff1f; 假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。 对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到&#xff0c;就像打电话一样&#xff0c;只要“喂喂"两下对方就能回你个…

【ELK】【Elasticsearch】数据查询方式

1. 简单查询&#xff08;URI Search&#xff09; 通过 URL 参数直接进行查询&#xff0c;适合简单的搜索场景。 示例&#xff1a; bash 复制 GET /index_name/_search?qfield_name:search_value 说明&#xff1a; index_name&#xff1a;索引名称。 field_name&#xf…

软件测试:定义和实质

软件缺陷的定义&#xff1a; 未实现说明书要求的功能出现了说明书指明不应出现的错误实现了说明书未提到的功能未实现说明书没有明确提出但应该实现的目标软件难以理解&#xff0c;不易使用&#xff0c;运行缓慢 或者从测试员客户会认为不好的。 软件缺陷的原因&#xff1a; …

【软考】【2025年系统分析师拿证之路】【啃书】第十一章 软件需求工程(十二)

目录 需求的层次需求工程的主要活动需求的记录技术需求分析需求定义 需求的层次 业务需求用户需求系统需求 需求工程的主要活动 需求获取需求分析形成需求规格需求确认和验证需求管理 需求的记录技术 任务卡片场景说明用户故事 需求分析 方法&#xff1a; 结构化分析&a…

计算机网络原理试题六

一、单项选择 1.(单选题,5分)IP地址中网络号的作用有 A.指定了设备能够进行通信的网络 B.指定了主机所属的网络 C.指定了被寻址的子网中的某个节点 D.标志了网络中的主机 答案:B 2.(单选题,5分)关于IP主机地址,下列说法正确的是 A.网段部分不可以全1也不可以全0 B.主机部分可…

路由基础 | 路由引入实验 | 不同路由引入方式存在的问题

注&#xff1a;本文为 “路由基础 | 路由表 | 路由引入” 相关文章合辑。 未整理去重。 路由基本概念 1—— 路由表信息、路由进表以及转发流程、最长掩码匹配原则 静下心来敲木鱼已于 2023-11-26 14:06:22 修改 什么是路由 路由就是指导报文转发的路径信息&#xff0c;可以…