Spring Boot 学习之路 -- 配置项目

前言

  1. 最近因为业务需要,被拉去研究后端的项目,代码基于 Spring Boot,对我来说完全小白,需要重新学习研究…
  2. 出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门到精通(明日科技) 」一书,做了一些整理,更易于个人理解和回顾查找,所以大家如果希望更系统性的学习,可以阅读此书(比较适合我这种新手)。

一、Spring Boot 项目的配置文件

程序开发人员在开发 Spring Boot 项目的过程中,会发现 Spring Boot 非常好用。这是因为 Spring Boot 项目所需要的数据都在其配置文件中完成了配置。配置文件中的数据有很重要的作用。例如,如果在一个 Spring Boot 项目的配置文件中缺少关于数据库的数据,这个 Spring Boot 项目就无法连接、操作数据库。在一个 Spring Boot 项目的配置文件中,有些数据在创建这个 Spring Boot 项目时就完成了配置,有些数据则需要程序开发人员进行配置。

下面就介绍程序开发人员如何对 Spring Boot 项目的配置文件中的数据进行配置。

当创建一个 Spring Boot 项目时,就会在其中的 src/main/resources 目录下自动创建一个 application.properties 文件,该文件就是这个 Spring Boot 项目的配置文件。

在这里插入图片描述

程序开发人员在配置 Spring Boot 项目的过程中,会在配置文件中配置该项目所需的数据信息。这些数据信息被称作“配置信息”。那么,“配置信息”都包含哪些内容呢?“配置信息”的内容非常丰富,这里仅举例予以说明:

  • Tomcat服务器
  • 数据库的连接信息,即用于连接数据库的用户名和密码
  • Spring Boot 项目的启动端口
  • 第三方系统或者接口的调用密钥信息
  • 用于发现和定位问题的日志

我们回顾一下【Spring Boot 学习之路 – 基础认知】 中第一个 Spring Boot 程序,会发现并没有对这个程序做任何配置,仅编写了几行代码,这个程序就能够实现一个简单的跳转功能。其实,这就凸显了 Spring Boot 的强大之处:当创建一个 Spring Boot 项目时,有些配置信息就已经在配置文件中被配置完成了,不需要程序开发人员予以配置,这提高了开发程序的效率。

下面将先对配置文件的格式予以介绍。

1.1 配置文件的格式

Spring Boot 支持多种格式的配置文件,最常用的是 properties 格式(默认格式)和比较新颖的 yaml/yml 格式。下面将分别介绍这两种格式的特点。

properties

properties 格式是经典的键值对文本格式。也就是说,如果某一个配置文件的格式是 properties 格式,那么这个配置文件的文本格式为键值对。

键值对的语法非常简单,具体如下:

key=value​​

= 左侧为键(key),= 右侧为值(value)。

在配置文件中,每个键独占一行。如果多个键之间存在层级关系,就需要使用“父键.子健”的格式予以表示。

例如,在配置文件中,为一个有三层关系的键赋值的语法如下:

​​​​key1.key2.key3=value​​

例如,启动 Spring Boot 项目的 Tomcat 端口号为 8080,那么在这个项目的 application.properties 文件中就能够找到如下的内容:

​​​​server.port=8080​​

启动这个项目后,即可在控制台看到如下一行日志:

o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)

这行日志表明 Tomcat 根据配置开启的是 8080 端口。

在 application.properties 文件中,“#” 被称作注释符号,用于向文件中添加注释信息。例如:

​​​​# Tomcat端口
​​​​server.port=8080​​

yaml/yml

yml 是 YAML 的缩写,和 yaml 一样,它是一种可读性高的用于表达数据序列化的文本格式。yml 格式的配置文件的文本格式也是键值对。只不过,键值对的语法与 Python 语言中的键值对的语法非常相似,具体如下:

​​​​key: value​​

注意:

英文格式的 “:” 与值之间至少有一个空格。

英文格式的 “:” 左侧为键(key),英文格式的 “:” 右侧为值(value)。需要注意的是,英文格式的 “:” 与值之间只能用空格缩进,不能用 Tab 缩进;空格数量表示各层的层级关系。

例如,在配置文件中,为一个有三层关系的键赋值的语法如下:

key1:
​​​​ key2:
​​​​  key3: value​​

在 properties 格式的配置文件中,即使父键相同,在为每一个子健赋值时也要单独占一行,还要把父键写完整,例如:

​​​​com.spark.strudent.name=tom
​​​​com.spark.strudent.age=21​​

但是在 yaml 格式的配置文件中,只需要编写一次父键,并保证两个子健缩进相同即可。例如,把上述 properties 格式的键值对修改为 yaml 格式的键值对:

​​​​com:
​​​​ spark:
​​​​  student:
​​​​   name: Tom
​​​​   age: 21​​

对于 Spring Boot 项目的配置文件,不论是采用 properties 格式,还是采用 yaml 格式,都由程序开发人员自行决定。但是,在同一个 Spring Boot 项目中,尽量只使用一种格式的配置文件;否则,这个 Spring Boot 项目中的 yaml 格式的配置文件将被忽略掉。

1.2 达成约定的配置信息

虽然程序开发人员可以在配置文件中自定义配置信息,但是 Spring Boot 也有一些已经达成约定的配置信息。这些配置信息用于设置 Spring Boot 项目的一些属性,具体如下:

# Tomcat 使用的端口号
server.port=808080# 配置 context-path
server.servlet.context-path=/# 错误页地址
server.error.path=/error# session 超时时间(分钟),默认为 30 分钟
server.servlet.session.timeout=60# 服务器绑定的 IP 地址,如果本机不在此 IP 地址则启动失败
server.address=192.168.1.1# Tomcat 最大线程数,默认为 200
server.tomcat.threads.max=100# Tomcat 的 URI 字符编码
server.tomcat.uri-encoding=UTF-8

二、读取配置信息的值

程序开发人员如果已经在配置文件中保存了一些自定义的配置信息,那么在编码时应该如何读取这些配置信息的值呢?为此,Spring Boot 提供了 3 种读取方法。下面将对其分别予以介绍。

2.1 使用 @Value 注解读取值

@Value 注解可以向类的属性注入常量、Bean 或者配置文件中配置信息的值。使用 @Value 注解读取配置信息的值的语法下:

​​​​@Value("${key}")​​

例如,读取 Tomcat 开启的端口号,代码如下:

​​​​@Value("${server.port}")
​​​​Integer port;​​

我们在工程中测试一下:

  1. 在 application.properties 配置文件中添加:
com.spark.name=HanMeiMei
com.spark.age=18
com.spark.gender=\u5973

这 3 行内容分别对应:姓名、年龄和性别。

  1. 修改 BeanTestController:
@RestController
public class BeanTestController {@Value("${com.spark.name}")private String name;@Value("${com.spark.age}")private Integer age;@Value("${com.spark.gender}")private String gender;@RequestMapping("/people")public String getPeople() {String result = "<li>名称:" + name + "</li>" +"<li>名称:" + age + "</li>" +"<li>名称:" + gender + "</li>";System.out.println(gender);System.out.println(gender);System.out.println(gender);return result;}
}
  1. 运行,看看效果:

在这里插入图片描述

如果使用 @Value 读取一个不存在的配置信息的值,例如:

​​​​@Value("${com.mr.school}")
​​​​private String school;​​

那么,启动项目后将抛出如下的异常信息:

Could not resolve placeholder 'com.spark.school' in value "${com.spark.school}"

这个异常信息的含义是:程序无法找到与“com.mr.school”相匹配的值。因此,在使用@Value读取配置文件中的配置信息的值时,一定要确保配置信息的名称是存在的,并且是正确的。

2.2 使用 Environment 环境组件读取值

如果配置文件中的配置信息经常需要修改,那么为了能够读取配置信息的值,就需要使用一个更为灵活的方法,即 org.springframework.core.env.Environment 环境组件接口。这是因为即使 Environment 环境组件接口尝试读取一个不存在的配置信息的值,程序也不会抛出任何异常信息。

Environment 环境组件接口的对象是由 Spring Boot 自动创建的,程序开发人员可以直接注入并使用它。

Environment对象注入的方式如下:

​​​​@Autowired
​​​​Environment env;​​

Environment 环境组件接口提供了丰富的 API,下面列举几个常用的方法:

​​​​containsProperty(String key);​​
  • key:配置文件中配置信息的名称。
  • 返回值:如果配置文件存在名为 key 的配置信息,则返回 true,否则返回 false。
​​​​getProperty(String key)​​
  • key:配置文件中配置信息的名称。
  • 返回值:配置文件中 key 对应的值。如果配置文件中没有名为 key 的配置信息,则返回 null。
getProperty(String key, Class<T> targetType)​​
  • key:配置文件中配置信息的名称。
  • targetType:方法返回值封装成的类型。
  • 返回值:配置文件中 key 对应的值,并封装成 targetType 类型。
​​​​getProperty(String key, String defaultValue);​​
  • key:配置文件中配置信息的名称。
  • defaultValue:默认值。
  • 返回值:配置文件中 key 对应的值,如果配置文件中没有名为 key 的配置信息,则返回 defaultValue。

注意:

如果配置文件中存在某个配置信息,但等号右侧没有任何值(如 “name=”),那么 Environment 组件会认为这个配置信息存在,并且这个配置信息的值为空字符串。

我们看下在 BeanTestController 里面怎么使用,代码如下:

@RestController
public class BeanTestController {@AutowiredEnvironment environment;@RequestMapping("/environment")public String getPeople() {StringBuilder result = new StringBuilder();if (environment.containsProperty("com.spark.name")) {String name = environment.getProperty("com.spark.name");result.append("<li>姓名:").append(name).append("</li>");}if (environment.containsProperty("com.spark.age")) {int age = Integer.parseInt(Objects.requireNonNull(environment.getProperty("com.spark.age")));result.append("<li>年龄:").append(age).append("</li>");}String school = environment.getProperty("com.spark.school", "XX 学院");result.append("<li>学校:").append(school).append("</li>");String language = environment.getProperty("com.spark.language", "C++");result.append("<li>所学语言:").append(language).append("</li>");return result.toString();}
}

运行看下效果:

在这里插入图片描述

2.3 使用映射类的对象读取值

除了 @Value 注解和 Environment 环境组件,Spring Boot 还提供了用于声明映射类的 @ConfigurationProperties 注解。下面就对其予以介绍。

说明:

用于封装配置信息的类被称作映射类。

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

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

相关文章

周家庄智慧旅游小程序

项目概述 周家庄智慧旅游小程序将通过数字化手段提升游客的旅游体验&#xff0c;依托周家庄的自然与文化资源&#xff0c;打造智慧旅游新模式。该小程序将结合虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和人工智能等技术&#xff0c;提供丰富的…

国际化适配对照

中文 zh 葡萄牙语 pt 荷兰语 nl 泰文 th 匈牙利语 hu 波兰 pl 土耳其 tr 乌克兰 uk 希腊 el 印度尼西亚 in 越南语 vi 阿拉伯语 ar 希波来语 iw 英语 en 日语 ja 德语 de 法语 fr 意大利语 it 西班牙语 es 俄罗斯语 ru

1.5 计算机网络的性能指标

参考&#xff1a;&#x1f4d5;深入浅出计算机网络 目录 速率 带宽 吞吐量 时延 时延带宽积 往返时间 利用率 丢包率 速率 速率是指数据的传送速率&#xff08;即每秒传送多少个比特&#xff09;&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&am…

Python | Leetcode Python题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class Node:def __init__(self, key"", count0):self.prev Noneself.next Noneself.keys {key}self.count countdef insert(self, node: Node) -> Node: # 在 self 后插入 nodenode.prev selfnode.next self.nextnode.…

Axure9破解

1.下载安装包 通过百度网盘分享的文件&#xff1a;Axure RP 9.zip 链接&#xff1a;https://pan.baidu.com/s/1Lcu-gg4qF8tTkOlt7bC2ww?pwdwmqq 提取码&#xff1a;wmqq 2.设置登录以及破解码 位置&#xff1a;帮助-管理授权-添加key Licensee&#xff1a;123456 Key&#…

健身房管理系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装健身房管理系统软件来发挥其高效地信息处理的作用&#xff…

2024年信息安全企业CRM选型与应用研究报告

数字化的生活给人们带来便利的同时也带来一定的信息安全隐患&#xff0c;如网络侵权、泄露用户隐私、黑客攻击等。在互联网高度发展的今天&#xff0c;信息安全与我们每个人、每个组织甚至每个国家都息息相关。 信息安全行业蓬勃发展。根据智研咨询数据&#xff0c;2021年&…

【LLM学习之路】9月22日 第九天 自然语言处理

【LLM学习之路】9月22日 第九天 直接看Transformer 第一章 自然语言处理 自然语言处理发展史 只要看的足够多&#xff0c;未必需要理解语言 统计语言模型发展史 统计语言模型&#xff1a; 判断一个句子是否合理&#xff0c;就计算这个句子会出现的概率 缺点是句子越长越…

大数据-145 Apache Kudu 架构解读 Master Table 分区 读写

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

NodeFormer:一种用于节点分类的可扩展图结构学习 Transformer

人工智能咨询培训老师叶梓 转载标明出处 现有的神经网络&#xff08;GNNs&#xff09;在处理大规模图数据时面临着一些挑战&#xff0c;如过度平滑、异质性、长距离依赖处理、边缘不完整性等问题&#xff0c;尤其是当输入图完全缺失时。为了解决这些问题&#xff0c;上海交通大…

2024年中国研究生数学建模竞赛B题 (WLAN组网吞吐量机理建模+决策树 完整建模文章)

2024年中国研究生数学建模竞赛B题 (WLAN组网吞吐量机理建模决策树 完整建模文章) 问题重述和分析 问题重述 本题旨在基于实际测量的WLAN&#xff08;无线局域网&#xff09;数据&#xff0c;建立一个精确的系统吞吐量预测模型。具体而言&#xff0c;提供了多个包含网络拓扑、…

在虚幻引擎中创建毛发/头发

在虚幻引擎中创建毛发/头发 , 首先开启两个插件 Groom 和 Alembic Groom Importer 打开蒙皮缓存 导出人物模型 将人物导入Blender , 选择需要种植头发的点 指定并选择 点击毛发 这里变成爆炸头了 , 把数量和长度调一下 切换到梳子模式 调整发型 导出为abc , 文件路径不…

mysql 内存被打满记录

一&#xff1a;早上收到报警&#xff1a;提示&#xff1a;您的云数据库RDS的1个实例因存储空间满将被锁定&#xff0c;请关注实例的存储空间使用情况&#xff0c;可通过存储扩容或空间清理解除锁定。后续查看错误日志如下&#xff1a;磁盘没有空间了 没有多余的空间写binlog和…

推荐一款开源的Redis桌面客户端

TinyRDM 是一个现代化的、轻量级的跨平台 Redis 桌面客户端&#xff0c;能在 Mac、Windows 和 Linux 系统上使用。它有着现代化的设计风格&#xff0c;界面既简洁又清晰&#xff0c;操作起来方便又高效。不管是刚开始接触的新手&#xff0c;还是经验丰富的开发者&#xff0c;都…

基于OpenCV的单目测距

随着计算机视觉技术的发展&#xff0c;单目测距作为一种重要的视觉测量手段&#xff0c;在众多领域得到了广泛的应用。本文将探讨基于OpenCV的单目测距原理、局限性、实际应用场景以及一些优化方案。 单目测距的原理 单目测距是指利用一台摄像机拍摄到的单一图像来进行距离测量…

Kubernetes Pod调度基础(kubernetes)

实验环境依旧是k8s快照&#xff0c;拉取本次实验所需的镜像文件&#xff1b; 然后在master节点上传已经编写好的yaml文件&#xff1b; 然后同步会话&#xff0c;导入镜像&#xff1b; pod控制器&#xff1a; 标签选择器--》标签&#xff1a; 标签&#xff1a; 在Kubernetes&…

Nat Med|机器学习+高通量筛选,发现用于治疗胶质母细胞瘤的神经活性药物|顶刊精析·24-09-23

小罗碎碎念 今日顶刊&#xff1a;Nat Med 这篇文章是2024-09-20发表在《Nature Medicine》上的一篇研究型论文&#xff0c;标题为“High-throughput identification of repurposable neuroactive drugs with potent anti-glioblastoma activity”。 先打个提前量&#xff0c;发…

人工智能面试题(Artificial Intelligence Algorithm Interview Questions)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

ruoyi源码解析学习 - 微服务版 - ruoyi-gateway

com.ruoyi.gateway 今天简单看看若依的gateway的配置模块干了啥 最近面试很多外包公司&#xff0c;都对低代码平台有点要求&#xff0c;这些代码虽说用起来不费劲&#xff0c;但是其中还是有很多细节能让我学习学习的。&#xff08;微服务版&#xff0c;上次搞jeecgboot的笔试…

【爬虫工具】小红书评论高级采集软件

用python开发的爬虫采集工具【爬小红书搜索评论软件】&#xff0c;支持根据关键词采集评论。 思路&#xff1a;笔记关键词->笔记链接->评论 软件界面&#xff1a; 完整文章、详细了解&#xff1a; https://mp.weixin.qq.com/s/C_TuChFwh8Vw76hTGX679Q 好用的软件一起分…