Spring Boot 配置文件总结

news2024/11/24 14:14:18

前言

Spring Boot 中提供一个全局的配置文件:application.properties,这个配置文件的作用就是,允许我们通过这个配置文件去修改 Spring Boot 自动配置的默认值

Spring Boot 支持两种格式的配置文件:application.propertiesapplication.yml

yml 等同于 yaml,写法看个人喜欢,我喜欢写成 application.yml

不同后缀不同写法

application.propertiesapplication.yml ,它们的区别在于语法不同,但本质上是一样的。application.properties 使用键值对的方式来配置,而 application.yml 使用缩进和冒号的方式来配置。

properties

properties 作为后缀的配置文件,语法是这样的:key = value,如果有多级配置项,则是 first.second.third = value

key=value
first.second.third=value

示例:

  1. 定义属性:
key=value
game.name=GTA5

这里的 keygame.name 都是属性名称,而 valueGTA5 是属性的

  1. 定义 List:
game.list=GTA5,NBA2K,AC

这里的 game.list 这个列表包含了 3 个元素。

  1. 定义 Map:
game.map.key1=value1
game.map.key2=value2

这里的 game.map 是一个 Map,这个 Map 包含了两个元素,key1 映射到 value1,key2 映射到 value2

  1. 引用已定义的属性:
game.name=GTA5
# 引用上面已定义的属性
great.game=${game.name}

yml (yaml)

yml 作为后缀的配置文件,语法是这样的:key: value。使用冒号代替等号,同时冒号后面需要跟上一个空格符,不可省略。

key: value
first:
  second:
    third: value

示例:

  1. 定义属性:
key: value
game:
  name: GTA5
  1. 定义 List:
game:
  list:
    - GTA5
    - NBA2K
    - AC
  1. 定义 Map:
game:
  map:
    key1: value1
    key2: value2
  1. 引用已定义的属性:
game:
  name: GTA5
great:
  game: @{game.name}

不同环境下切换不同的配置文件

一般项目中在不同环境下都有不同的配置,还是以这个 Tomcat 的端口号为例:

目前有 3 个环境,分别是开发环境、测试环境、生产环境。在开发环境下,端口号是 4790;测试环境下,端口号是 4791;生产环境下是 4792。

application-dev.yml

server:
  port: 4790

application-test.yml

server:
  port: 4791

application-prod.yml

server:
  port: 4792

spring.profiles.active

现在,通过 spring.profiles.active 这个配置项,在 application.yml 中指定我们想要切换的配置文件,现在指定使用开发环境的配置文件

# 指定使用 application-dev.yml 这个配置文件
spring:
  profiles:
    active: dev

启动 Spring Boot 应用,控制台输出:

2023-03-16 15:41:48.122  INFO 3356 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 4790 (http) with context path ''

指定使用测试环境下的配置文件

# 指定使用 application-test.yml 这个配置文件
spring:
  profiles:
    active: test

启动 Spring Boot 应用,控制台输出:

2023-03-16 15:42:21.462  INFO 24548 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 4791 (http) with context path ''

同理,指定使用生产环境的配置文件也是一样的做法。

自定义的配置

在 Spring Boot 项目中,自定义配置是经常用到的,我目前体会到的自定义的配置的作用有一点:配置与代码解耦

下面,我们看看如何自定义配置,并使用自己自定义配置的值:

server:
  port: 4790

# 自定义的配置
demo:
  author: god23bin
  description: 点个免费的赞,我能开心好久!

上面自定义了两个配置项,分别是 demo.authordemo.description,接着,如何在代码中使用这些配置好的值呢?

目前使用这些配置好的值(读取这些值),有以下几种方式:

  • 使用 @Value
  • 使用 @ConfigurationProperties

@Value

我们写一个普通的 Java 类,使用 Spring 提供的 @Value 来读取这两个值:

@Data
@Component
public class DemoCustomConfig {

    /**
     * 通过 @Value 注解读取配置文件中的自定义配置项的值,使用 ${} 进行读取
     **/
    @Value("${demo.author}")
    private String author;

    @Value("${demo.description}")
    private String description;

}

上面的代码中,我在类上使用了 @Data@Component@Data 是来自 Lombok 的,用于生成 getter 和 setter 方法,@Component 则将该类的实例对象交给 Spring 管理,接着在该类的两个属性上分别使用了 @Value 注解,通过 ${} 指定了我们要读取的配置项。

进行测试,我们写一个 Controller 判断我们的读取是否成功:

@RequestMapping("/demo")
@RestController
public class DemoController {

    @Autowired
    private DemoCustomConfig demoCustomConfig;

    @GetMapping("/getCustomValue")
    public ResponseEntity<String> getCustomValue() {
        return ResponseEntity.ok(demoCustomConfig.getAuthor() + "说:" + demoCustomConfig.getDescription());
    }
}

访问该接口:localhost:4790/demo/getCustomValue

image-20230321233256647

@ConfigurationProperties

@ConfigurationProperties 注解,它可以将配置文件中的的值绑定到 Java Bean 中,也就是通过这个 Bean 可以读取到配置文件中配置的值,我们看看如何操作。

我们自定义一个用于读取配置文件中配置项的类:

@Data
@Component
@ConfigurationProperties("system.demo")
public class SystemCustomConfig {

    private String name;

    private String version;

}

上面的代码,主要使用了 @ConfigurationProperties 这个注解,并指定了前缀 system.demo,同时这个类有两个属性,name 和 version, 这样就相当于我们自定义了 system.demo.namesystem.demo.version 这两个属性。

接着,我们就能在配置文件中写这两个我们自定义的配置项了:

server:
  port: 4790

# 自定义的配置
system:
  demo:
    name: 超级系统
    version: 1.0

写完这里的配置项,并不需要使用 @Value 去读取,因为使用了 @ConfigurationProperties 注解,Spring 已经帮我们搞定了配置的值的读取,至于它的实现原理,这里先不深究。

进行测试,依然通过写一个接口来测试我们通过:

@RequestMapping("/demo")
@RestController
public class DemoController {

    @Autowired
    private SystemCustomConfig systemCustomConfig;

    @GetMapping("/getSystemVersion")
    public ResponseEntity<String> getSystemVersion() {
        return ResponseEntity.ok(systemCustomConfig.getName() + "版本:" + systemCustomConfig.getVersion());
    }
}

访问该接口:localhost:4790/demo/getSystemVersion

image-20230321233317428

关于自动提示

不过,目前有个问题就是,我们自己写了个 Java Bean 后,在配置文件中写配置项的时候并没有相关提示,这个就比较不友好,如果当我们自己写的配置想要给其他人用的话,别人都不知道有什么配置可以配。所以想要能像 Spring Boot 提供的配置提示一样的话,就需要引入下面的依赖:

<!-- 配置文件处理器,配置文件进行绑定就会有提示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

spring-boot-configuration-processor 是一个用于生成配置元数据的注解处理器。它会扫描使用 @ConfigurationProperties 注解的类和方法,来获取配置参数并生成配置元数据。生成的配置元数据可以用于 IDE 的自动补全和提示功能。

image-20230322233941391

如果你引入了这个依赖并且重启该 Spring Boot 项目后,依旧没有提示的话,尝试开启 IDEA 中的 annotaion processing

image-20230322234341016

关于 Cannot resolve configuration property

对于我们自定义的配置,会出现这样的提示:Cannot resolve configuration property(无法处理自定义的配置属性),如下:

image-20230322235035717

解决方式就是定义一下元数据,用元数据来描述这个属性。当我们移动到这个配置项上时,出现提示,我们直接点击 Define configuration key xxx 就可以帮我们生成一个关于配置的元数据文件。

additional-spring-configuration-metadata.json

{
  "properties": [
    {
      "name": "demo.author",
      "type": "java.lang.String",
      "description": "Demo的作者"
    },
    {
      "name": "demo.description",
      "type": "java.lang.String",
      "description": "Demo的描述"
    }
  ]
}

此时,还是一样,重启项目,如果黄色提示还是没有去除的话,这里建议重新用 Maven 进行一次 clean,接着重新编译整个项目,就可以了。于此同时,也具有了自动提示功能。

image-20230322235958525

自定义配置文件

上面说的是自定义的配置,现在这里说自定义的配置文件,我们知道 Spring Boot 默认提供 application.properties 这个配置文件。那现在我们想自己写一个配置文件,并且能在应用中读取这个配置文件的信息,该如何做呢?这里就涉及到 @PropertySource 这个注解了。

自定义的配置文件:

custom.yml

# 自定义的配置文件
version: 2.0
description: 求关注!

读取该配置文件的配置类:

@Data
@Configuration
@PropertySource("classpath:custom.yml")
public class DemoPropertiesSourceConfig {

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

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

}

这样,就能读取到自己编写的配置文件的配置信息了。

如果有多个自定义的配置文件,那么可以使用 @PropertySources 注解,可以看到最后面多加了一个 s ,说明这个单词是复数,通俗易懂。

@Configuration
@PropertySources({
    @PropertySource("classpath:custom1.yml"),
    @PropertySource("classpath:custom2.properties")
})
public class MyConfig {
    // ...
}

总结

  1. 配置文件的两种写法:properties 和 yml

  2. 项目中存在多个配置文件,可以使用 spring.profiles.active 属性来切换使用哪个配置文件。

  3. 自定义的一些配置属性(配置项),如何读取呢?可以在程序中通过 @Value 或者@ConfigurationProperties 来读取。

  4. 自定义的配置文件,可以通过 @PropertySource 来指定获取该自定义配置文件的信息。

最后的最后

希望各位屏幕前的靓仔靓女们给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

咱们下期再见!

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

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

相关文章

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

目录 1. 区间和的个数 &#x1f31f;&#x1f31f;&#x1f31f; 2. 二叉搜索树的最近公共祖先 &#x1f31f; 3. 找最接近元素 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏…

前端路由、vue-router常见用法、路由重定向、动态路由匹配、声明式导航 编程式导航 、导航守卫

前端路由、vue-router常见用法、路由重定向、动态路由匹配、声明式导航 & 编程式导航 、导航守卫 前端路由的概念与原理前端路由 vue-router 的基本使用vue-router 的常见用法路由重定向动态路由匹配声明式导航 & 编程式导航导航守卫 后台管理案例 前端路由的概念与原理…

mysqld之mha高可用

1.MHA的相关知识 1.1 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在…

C语言设计三子棋

引入 谈到三子棋&#xff0c;大家应该都不陌生&#xff0c;学生时代我们大多人都爱拿作文本有事没事就跟同桌下两把&#xff0c;只要任意一方三点连成一线&#xff0c;就可以胜利。今天我作为一个计算机方面的博主&#xff0c;将会用C语言实现这个简单的小游戏&#xff08;人机…

sort命令 uniq命令 tr命令 cut命令

sort命令 ——以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出 语法格式&#xff1a; sort [选项] 参数 cat file | sort 选项 -n按照数字进行排序…

MySQL高可用之MHA集群

一、MHA概述 1.1 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在…

【模式识别9】python计算目标检测IoU、TP、FP、FN、Precision、Recall指标

python计算目标检测IoU、TP、FP、FN、Precision、Recall指标 1. 基础概念1.1 TP、TN、FP、FN1.2 IoU1.3 Precision&#xff08;P&#xff09;、Recall&#xff08;R&#xff09;、F1-score 2. python代码3. 总结 代码资源&#xff1a;IoU_P_R.py 1. 基础概念 1.1 TP、TN、FP、…

2023/5/14总结

哈夫曼树 哈夫曼树&#xff1a;给定n个权值作为n个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度&#xff08;WPL&#xff09;达到最小&#xff0c;则称该二叉树为哈夫曼树&#xff0c;也被称为最优二叉树。 怎样才能使带权路径长度最短&#xff1a;根据…

CTF-PHP反序列化漏洞5-反序列化字符逃逸

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

简单聊聊微前端

简单聊聊微前端 介绍微前端的优点应用间相互独立&#xff0c;互不依赖可以同时使用不同的技术栈可拓展性高可维护性更强&#xff0c;减少代码量提高开发和部署的效率团队的高度自主权错误隔离 微前端的缺点依赖项冗余CSS样式冲突和重叠性能比较差应用间的通信不够便捷 实现微前…

CSS的基础知识讲解

文章目录 一.什么是CSS二. 选择器2.1 标签选择器2.2 类名选择器2.3 ID选择器2.4 属性选择器2.5 子选择器2.6 后代选择器2.7 伪类选择器 三.盒子模型3.1 什么是盒子模型3.2 盒子的组成部分边框内边距外边距 四.弹性盒子布局4.1 什么是块级元素和行内元素块级元素行内元素行内元素…

◆ 前端工程化 ◆ webpack 的基本使用 ◆ webpack 中的插件 ◆ webpack 中的 loader ◆ 打包发布 ◆ Source Map

◆ 前端工程化 ◆ webpack 的基本使用 ◆ webpack 中的插件 ◆ webpack 中的 loader ◆ 打包发布 ◆ Source Map ◆ 前端工程化◆ webpack 的基本使用◆ webpack 中的插件◆ webpack 中的 loader1. loader 概述打包处理css文件打包处理less文件打包处理样式表中与url路径相关的…

Python——2

一、循环 1.range() 函数 用于生成一个整数序列&#xff0c;返回的是一个迭代对象&#xff0c;可用 in / not in查看。 &#xff08;1&#xff09;range(stop) 创建一个 [0,stop) 的整数序列&#xff0c;步长为1。 &#xff08;2&#xff09;range(start, stop) 创建一个 [s…

面试谎报了职级,本来是6,谎报成7,已经到HR这一步了,怎么了?

面试时谎报职级&#xff0c;公司能查出来吗&#xff1f; 一位网友说&#xff0c;自己在业务面时谎报了职级&#xff0c;把6报成7&#xff0c;现在已经到hr这一步了&#xff0c;该怎么办&#xff1f;是继续编吗&#xff1f; 有人不明白&#xff0c;为什么要谎报职级&#xff1f;…

Pycharm 安装教程,及常用快捷键,附教程

简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外&#xff0c;该IDE提供了一些高级功能&a…

有史以来最强的5G入门科普!

一个简单且神奇的公式 今天的故事&#xff0c;从一个公式开始讲起。 这是一个既简单又神奇的公式。说它简单&#xff0c;是因为它一共只有3个字母。而说它神奇&#xff0c;是因为这个公式蕴含了博大精深的通信技术奥秘&#xff0c;这个星球上有无数的人都在为之魂牵梦绕。…

CloudCompare二次开发之如何配置PCL点云库?

文章目录 0.引言1.修改两个CMakeLists.txt文件2.源码编译3.测试PCL 0.引言 因笔者课题涉及点云处理&#xff0c;需要通过PCL进行点云数据分析处理&#xff0c;查阅现有网络资料&#xff0c;实现了VisualStudio2015(x86)配置PCL1.8.1点云库&#xff08;见&#xff1a;VisualStud…

基于卷积的图像分类识别(七):SENet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileN…

网络编程 lesson3 UDP基础编程

目录 UDP介绍 UDP编程 函数接口 recvfrom sendto 小练习&#xff1a;实现服务器和客户端相连&#xff08;使用UDP实现&#xff09; client server UDP介绍 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种在计算机网络中常用的传输…

C++常量成员函数(类成员函数后加const、类成员函数参数列表后加const)常量对象(类名前加const)和非常量对象

文章目录 常量对象和非常量对象&#xff08;常量对象不能调用非常量成员函数&#xff09;常量成员函数&#xff08;常量成员函数不能修改类的数据成员&#xff1b;常量成员函数只能调用常量成员函数&#xff0c;不能调用非常量成员函数&#xff09; 常量对象和非常量对象&#…