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.rhkb.cn/news/433732.html

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

相关文章

SpringMVC5-域对象共享数据

目录 使用ServletAPI向request域对象共享数据 使用ModelAndView向request域对象共享数据 使用Model向request域对象共享数据 使用map向request域对象共享数据 使用ModelMap向request域对象共享数据 Model、ModelMap、Map的关系 向session域共享数据 向application域共享…

SQLite3模块使用详解

目录 一、引言 1.1 SQLite3 简介 1.2 Python sqlite3 模块 二、连接数据库 2.1 导入 sqlite3 模块 2.2 连接数据库 2.3 创建游标对象 三、执行 SQL 语句 3.1 创建表 3.2 插入数据 3.3 查询数据 3.4 更新数据 3.5 删除数据 四、处理查询结果 4.1 fetchall() 4.2…

探探Java与python中的闭包

说在前面&#xff1a;在计算机科学中&#xff0c;闭包是指一个函数以及其引用的周围环境&#xff08;变量&#xff09;所组成的整体。简单来说&#xff0c;闭包允许一个函数访问并操作其外部函数作用域中的变量&#xff0c;即使外部函数已经执行完毕。 Java函数式编程—闭包&am…

C++map与set

文章目录 前言一、map和set基础知识二、set与map使用示例1.set去重操作2.map字典统计 总结 前言 本章主要介绍map和set的基本知识与用法。 一、map和set基础知识 map与set属于STL的一部分&#xff0c;他们底层都是是同红黑树来实现的。 ①set常见用途是去重 &#xff0c;set不…

【Java】包装类【主线学习笔记】

文章目录 前言包装类基本数据类型与包装类之间的转换基本数据类型转换为包装类可以通过以下几种方式&#xff1a;包装类转换为基本数据类型可以通过以下几种方式&#xff1a;初始化值不同与String之间的转换 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台…

“数字武当”项目荣获2024年“数据要素×”大赛湖北分赛文化旅游赛道一等奖

9月26日&#xff0c;由国家数据局、湖北省人民政府指导的首届湖北省数据要素创新大会暨2024年“数据要素”大赛湖北分赛颁奖仪式在湖北武汉举行。由大势智慧联合武当山文化旅游发展集团有限公司参报的武当山“数字武当”项目&#xff0c;荣获文化旅游赛道一等奖。 据悉&#x…

在系统开发中提升 Excel 数据导出一致性与可维护性的统一规范与最佳实践

背景&#xff1a; 在系统开发过程中&#xff0c;数据导出为 Excel 格式是一个常见的需求。然而&#xff0c;由于各个开发人员的编码习惯和实现方式不同&#xff0c;导致导出代码风格不一。有的人使用第三方库&#xff0c;有的人则自定义实现。这种多样化不仅影响了代码的一致性…

【笔记】X射线物理基础

一、X射线衍射分析简史 1895年X射线发现 1896 年 2 月对骨折的观察&#xff1a;G.和 E. Frost是第一个使用 X 射线进行医疗用途 1897 年法国海关官员的行李扫描。 X射线衍射理论1 X射线衍射理论2 元素的特征X射线 X射线光电子的应用 电磁波的粒子属性 X射线层析成像法 X-ray…

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 一. 介绍二. 代码示例2.1 抽象构件&#xff08;Component&#xff09;角色2.2 具体构件&#xff08;Concrete Component&#xff09;角色2.3 装饰&#xff08;Decorator&#xff09;角色2.4 具体装饰&#xff08;Concrete Decorator&#xff09;角色2.5 测试 结…

蓝桥杯--STM32G431RBT6(TIM定时器的输出频率和占空比,含详细原理介绍和使用方法)

目录 一、前言 二、代码 实现功能&#xff1a;​编辑 按如图配置 定义变量 编写执行代码 显示在LCD上 加入按键效果 三、效果展示 四、代码开源 一、前言 ARR 即自动重装载值&#xff08;Auto Reload Register&#xff09;。相当于一个水杯&#xff0c;水杯容量&am…

SpringCloud-Netflix第一代微服务快速入门

1.springCloud常用组件 Netflix Eureka 当我们的微服务过多的时候&#xff0c;管理服务的通信地址是一个非常麻烦的事情&#xff0c;Eureka就是用来管理微服务的通信地址清单的&#xff0c;有了Eureka之后我们通过服务的名字就能实现服务的调用。 Netflix Ribbon\Feign : 客…

性能测试常见故障和解决思路详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、性能问题分析流程 1、查看服务器的CPU、内存 、负载等情况&#xff0c;包括应用服务器和数据库服务器 2、查看数据库健康状态&#xff0c;数据库死锁、连…

【Java】单元测试【主线学习笔记】

文章目录 前言测试分类JUnit单元测试介绍编写单元测试方法的条件IDEA中简易使用JUnit 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台性和高效的执行速度&#xff0c;广受开发者喜爱。在接下来的学习过程中&#xff0c;我将记录学习过程中的基础语法、框架…

我们是向量数据库的领军企业,我们只招TOP人才

我们是全球领先的向量数据库企业&#xff0c;业务正在快速发展&#xff0c;现开放大量岗位&#xff1a; 前端、产品经理、数据库开发工程师、C、数据库运维、数据库测试…… 我们招聘的唯一目标&#xff0c;寻找 TOP人才&#xff01; 如果你已经有丰富的经验&#xff0c;那么加…

【友元补充】【动态链接补充】

友元 友元的目的是让一个函数或者类&#xff0c;访问另一个类中的私有成员。 有缘的关键字friend是一个修饰符。 友元分为友元类和友元函数 1.全局函数作友元 2.类作友元 3.类的一个成员函数作友元 好处&#xff1a;可以通过友元在类外访问类内的私有和受保护类型的成员 坏处…

CC面试准备

半导体基础 半导体是介于导体和绝缘体之间的一种介质&#xff0c;在不同条件下表现出不同的导电性或者不导电特性&#xff0c; 电子半导体器件材料大部分为硅&#xff0c;锗等元素 本征半导体&#xff1a;完全不含杂质的纯净半导体&#xff0c;因为不含杂质&#xff0c;其中…

使用API有效率地管理Dynadot域名,设置域名服务器(NS)

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

OCR识别系统 YOLOv8 +Paddle 方案落地

YOLOv8 PaddleOCR 技术方案落地 Yolov8相关文档Step 1 证件模型的训练Step 2 Yolov8进行图片推理Step 3 PaddleOCR进行识别Step 4 整合Yolov8 PaddleOCR 进行OCR Yolov8相关文档 《yolov8 官方网站》 《Yolov8 保姆级别安装》 Ultralytics YOLOv8 是一款尖端的、最先进的 (S…

【项目经验分享】深度学习自然语言处理技术毕业设计项目案例定制

以下毕业设计是与深度学习自然语言处理&#xff08;NLP&#xff09;相关的毕业设计项目案例&#xff0c;涵盖文本分类、生成式模型、语义理解、机器翻译、对话系统、情感分析等多个领域&#xff1a; 实现案例截图&#xff1a; 基于深度学习的文本分类系统基于BERT的情感分析系…

《AI大模型工程师》报考都学习哪些内容呢?

近年来&#xff0c;随着深度学习技术的迅猛发展&#xff0c;AI大模型已经成为人工智能领域的重要研究方向和热点话题。AI大模型&#xff0c;指的是拥有巨大参数规模和强大学习能力的神经网络模型&#xff0c;如BERT、GPT等&#xff0c;这些模型在自然语言处理、计算机视觉等领域…