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

news2024/11/15 17:22:03

前言

  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 {
    @Autowired
    Environment 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.coloradmin.cn/o/2159355.html

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

相关文章

【一起学NLP】Chapter2-学习神经网络

目录 学习神经网络损失函数Tip:One-hot向量导数与梯度Tip:严格地说链式法则计算图反向传播其他典型的运算结点乘法结点分支节点Repeat节点Sum节点MatMul节点 Tip:浅拷贝和深拷贝的差异梯度的推导和反向传播的实现Sigmoid层Affine层Softmax with Loss层 权重的更新——随机梯度下…

[PICO VR]Unity如何往PICO VR眼镜里写持久化数据txt/json文本

前言 最近在用PICO VR做用户实验&#xff0c;需要将用户实验的数据记录到PICO头盔的存储空间里&#xff0c;记录一下整个过程 流程 1.开启写入权限 首先开启写入权限&#xff1a;Unity->Edit->Player->安卓小机器人->Other Settings->Configuration->Wri…

大数据毕业设计选题推荐-网络电视剧收视率分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

数据库主备副本物理复制和逻辑复制对比

数据库主从节点的数据一致性是保证数据库高可用的基本要求&#xff0c;各个数据库在实现方式上也各有异同。而主备复制的方式无外乎两种&#xff1a;物理复制和逻辑复制&#xff0c;本文简要对比下两种方式的不同&#xff0c;并分析下国产数据库是如何实现的。 1、数据库复制基…

中国中车在线测评考的啥?大易题库如何通过|附真题型国企题库通关秘籍和攻略

言语理解题目&#xff1a;这类题目主要考察你的语言理解和表达能力&#xff0c;例如&#xff0c;给你一个段落&#xff0c;让你根据段落内容选择最合适的答案。要点是快速捕捉文段中的关键信息&#xff0c;理解作者的意图和观点 逻辑推理题目&#xff1a;这类题目需要你从一组…

Java面试篇基础部分- 锁详解

可重入锁 可重入锁也叫作递归锁,是指在同一个线程中,在外层函数获取到该锁之后,内存的递归函数还可以获取到该锁。在Java语言环境下,ReentrantLock和Synchroinzed都是可重入锁的代表。 公平锁与非公平锁 公平锁(Fair Lock)是指在分配锁之前检查是否有线程在排队等待获取…

CICD从无到会

一 CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是…

【每天学个新注解】Day 4 Lombok注解简解(三)—@NonNull

我们在之前的三天学了Lombok常用的注解&#xff1a; 【每天学个新注解】Day 1 Lombok注解简解&#xff08;〇&#xff09;—Getter、Setter、ToString、EqualsAndHashCode、Constructor 【每天学个新注解】Day 2 Lombok注解简解&#xff08;一&#xff09;—Data、Build、Value…

【威领,德新,中达安】9.23复盘

威领这次的底部是4个月 所以这种跳空高开&#xff0c;远离5日均线的&#xff0c;如果不是近期的利好板块&#xff0c;那么第二天可能要回调5日均线。所以按照我的收益准则&#xff0c;吃一个板可以出一半了。 到顶部十字剩下一半也出掉了。 如果做长期&#xff0c;我依旧认为威…

git学习报告

文章目录 git学习报告如何配置vscode终端安装PowerShell安装 Microsoft.Powershell.Preview使用 git的使用关于团队合作 git指令本地命令&#xff1a;云端指令 git学习报告 如何配置vscode 安装powershell调教window终端&#xff0c;使其像Linux一样&#xff0c;通过Linux命令…

C语言初识(一)

目录 前言 一、什么是C语言&#xff1f; 二、第一个C语言程序 &#xff08;1&#xff09;创建新项目 &#xff08;2&#xff09;编写代码 &#xff08;3&#xff09;main函数 三、数据类型 四、变量、常量 &#xff08;1&#xff09;变量的命名 &#xff08;2&#x…

mysql复合查询 -- 合并查询(union,union all)

目录 合并查询 介绍 表数据 union 使用场景 ​编辑 示例 union all 合并查询 介绍 它不像笛卡尔积那种,将行信息做乘法 合并只是单纯地合在一起求的是两个结果集的并集,并且会自动去掉并集中的重复行 注意,因为是求并集,会将两个结果进行拼接 所以要保证列信息相同 表…

13.第二阶段x86游戏实战2-动态模块地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

基于Python+SQLServer实现(界面)书店销售管理管理子系统

书店销售管理管理子系统 一、设 计 总 说 明 现在社会随着计算机技术迅速发展与技术的逐渐成熟&#xff0c;信息技术已经使人们的生活发生深刻的变化。生活中的各种服务系统也使人们在生活中的联系日常销售活动方式发生了很大的变化&#xff0c;让效率较低的手工操作成为过去…

大数据新视界 --大数据大厂之 Reactjs 在大数据应用开发中的优势与实践

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Perf调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Perf为性能分析工具&#xff0c;依赖PMU&#xff08;Per…

UE学习篇ContentExample解读-----------Blueprint_Mouse_Interaction

文章目录 总览描述&#xff08;Blueprint_Mouse_Interaction&#xff09;阅览解析1、PlayerControler分析2、拖拽球蓝图分析&#xff1a;3、移动的立方体分析&#xff1a; 新概念总结致谢&#xff1a; 总览描述&#xff08;Blueprint_Mouse_Interaction&#xff09; 打开关卡后…

MySQL tinyint(1)类型数据在经过flink cdc同步到doris后只有0/1问题定位与解决

背景&#xff1a; 近期在负责公司数据仓库搭建事宜&#xff0c;踩了一些坑后&#xff0c;终于通了&#xff0c;目标报表也成功迁移到了新方案上&#xff0c;可在数据验收的时候发现&#xff0c;同一个订单查询出了多条记录&#xff0c;原本以为只是简单的left join出多条记录问…

植物检测系统源码分享

植物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Kubernetes调度单位Pod

Kubernetes调度单位Pod 1 Pod简介 不直接操作容器container。 一个 pod 可包含一或多个容器&#xff08;container&#xff09;&#xff0c;它们共享一个 namespace&#xff08;用户&#xff0c;网络&#xff0c;存储等&#xff09;&#xff0c;其中进程之间通过 localhost 本地…