【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置
一、引言
在上一篇文章中,我们开启了Spring Boot的入门之旅,成功构建了第一个Spring Boot应用。我们从环境搭建开始,详细介绍了JDK的安装以及IDE的选择与配置,然后利用Spring Initializr创建了项目,分析了项目结构,还编写了第一个简单的API并深入理解了自动配置。这一系列的操作让我们初步领略了Spring Boot在快速构建Java应用方面的强大能力。
配置文件就像是Spring Boot应用的指挥中心,它掌控着应用的各种设置。无论是定义服务器的运行参数,还是连接数据库的详细信息,又或是自定义的业务逻辑相关的属性,都离不开配置文件。合理地配置这些文件,可以让我们的应用在不同的环境(如开发环境、测试环境、生产环境)中灵活运行,同时也方便我们对应用进行定制化和维护。
二、Spring Boot配置文件的类型
1. application.properties
文件
- 基本语法和格式
application.properties
文件采用键值对(key - value)的形式来设置配置项。每一行代表一个配置项,格式为key=value
。例如,要设置服务器的端口号为8080,可以写成server.port=8080
。这里的server.port
就是键(key),8080
就是值(value)。键是固定的配置项名称,Spring Boot会根据这些键来识别对应的配置内容。值则根据具体的配置需求而定,可以是数字、字符串、布尔值等不同的数据类型。- 对于一些复杂的值,如列表或者映射,可能需要使用特定的格式。例如,要配置一个包含多个数据源的列表,可以使用逗号分隔的值,像
spring.datasource.url=jdbc:mysql://localhost:3306/db1,jdbc:mysql://localhost:3306/db2
。
- 常见配置项示例(如服务器端口、数据库连接等)
- 服务器端口配置:除了上面提到的
server.port
,我们还可以配置服务器的上下文路径。例如,server.servlet.context - path=/myapp
,这意味着我们的应用将在http://localhost:8080/myapp
这个路径下运行。 - 数据库连接配置:假设我们使用MySQL数据库,配置数据库连接的相关项包括
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
(数据库的URL),spring.datasource.username=root
(数据库用户名),spring.datasource.password=123456
(数据库密码),spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver
(数据库驱动类名)。这些配置项告诉Spring Boot如何连接到指定的数据库。
- 服务器端口配置:除了上面提到的
2. application.yml
文件
- YAML语法介绍
- YAML(YAML Ain’t Markup Language)是一种简洁的数据序列化格式。它使用缩进表示层级关系,而不是像
application.properties
那样使用点号(.)。在YAML中,基本的数据结构有标量(如字符串、数字、布尔值)、列表和映射。 - 字符串不需要使用引号包裹,除非字符串中包含特殊字符或者空格。例如,
name: John
是合法的字符串配置。对于布尔值,true
和false
直接书写即可,如enabled: true
。 - 列表使用短横线(-)开头,每个元素占一行。例如:
- YAML(YAML Ain’t Markup Language)是一种简洁的数据序列化格式。它使用缩进表示层级关系,而不是像
fruits:- apple- banana- cherry
- 映射是键值对的集合,通过缩进表示层级关系。例如:
person:name: Tomage: 25address:city: New Yorkstreet: 123 Main St
- 对比
application.properties
,展示YAML的简洁性- 以配置服务器端口和数据库连接为例,在
application.properties
中我们需要这样写:
- 以配置服务器端口和数据库连接为例,在
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver
- 在
application.yml
中可以写成:
server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: 123456driver - class - name: com.mysql.cj.jdbc.Driver
- 可以看到,YAML格式更加直观,尤其是对于复杂的嵌套结构,YAML的可读性更强。
- 转换application.properties
中的配置到application.yml
- 假设我们有一个
application.properties
文件中的配置如下:
- 假设我们有一个
myapp.title=My Awesome App
myapp.version=1.0
myapp.settings.enabled=true
myapp.settings.timeout=30
- 转换为
application.yml
文件的配置如下:
myapp:title: My Awesome Appversion: 1.0settings:enabled: truetimeout: 30
三、自定义配置属性
1. 创建自定义配置类
- 使用
@ConfigurationProperties
注解- 首先,我们创建一个Java类来表示我们的自定义配置。例如,我们创建一个名为
AppConfig
的类。在这个类中,我们可以定义各种属性来接收配置文件中的值。假设我们要配置一个邮件服务相关的设置,我们可以这样写:
- 首先,我们创建一个Java类来表示我们的自定义配置。例如,我们创建一个名为
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "mail")
public class AppConfig {private String host;private int port;private boolean enabled;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled = enabled;}
}
- 这里的
@ConfigurationProperties
注解的prefix
属性指定了在配置文件中对应的配置项的前缀。例如,在application.yml
文件中,我们可以这样配置邮件服务:
mail:host: smtp.example.comport: 25enabled: true
- 定义属性并设置默认值
- 我们可以在自定义配置类中为属性设置默认值。例如,修改上面的
AppConfig
类:
- 我们可以在自定义配置类中为属性设置默认值。例如,修改上面的
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "mail")
public class AppConfig {private String host = "smtp.default.com";private int port = 25;private boolean enabled = false;// 省略getter和setter方法
}
- 这样,如果在配置文件中没有配置
mail.host
、mail.port
或者mail.enabled
,那么就会使用默认值。
2. 在配置文件中设置自定义属性的值
- 不同数据类型(字符串、数字、布尔值等)的配置示例
- 字符串类型:继续以邮件服务为例,如果要配置邮件的发件人地址,我们可以在
application.yml
中添加如下配置:
- 字符串类型:继续以邮件服务为例,如果要配置邮件的发件人地址,我们可以在
mail:sender: sender@example.com
- 在
AppConfig
类中添加一个private String sender;
属性以及对应的getter
和setter
方法,就可以接收这个配置值了。- 数字类型:假设我们要配置邮件发送的最大重试次数,在
application.yml
中:
- 数字类型:假设我们要配置邮件发送的最大重试次数,在
mail:max - retry - times: 3
- 在
AppConfig
类中添加private int maxRetryTimes;
属性和相应的方法。 - 布尔值类型:如果要配置是否开启邮件的加密传输,在
application.yml
中:
mail:use - ssl: true
- 在
AppConfig
类中添加private boolean useSsl;
属性和相关方法。
- 多层嵌套属性的配置- 假设我们的邮件服务有更复杂的配置,比如不同类型邮件(如通知邮件、营销邮件)的发送设置。我们可以这样在
application.yml
中配置:
- 假设我们的邮件服务有更复杂的配置,比如不同类型邮件(如通知邮件、营销邮件)的发送设置。我们可以这样在
mail:notification:subject - prefix: "[Notification]"enabled: truemarketing:subject - prefix: "[Marketing]"enabled: false
- 在
AppConfig
类中,我们可以创建内部类来接收这些嵌套的配置:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "mail")
public class AppConfig {private NotificationConfig notification;private MarketingConfig marketing;public NotificationConfig getNotification() {return notification;}public void setNotification(NotificationConfig notification) {this.notification = notification;}public MarketingConfig getMarketing() {return marketing;}public void setMarketing(MarketingConfig marketing) {this.marketing = marketing;}public static class NotificationConfig {private String subjectPrefix;private boolean enabled;public String getSubjectPrefix() {return subjectPrefix;}public void setSubjectPrefix(String subjectPrefix) {this.subjectPrefix = subjectPrefix;}public boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled = enabled;}}public static class MarketingConfig {private String subjectPrefix;private boolean enabled;public String getSubjectPrefix() {return subjectPrefix;}public void setSubjectPrefix(String subjectPrefix) {this.subjectPrefix = subjectPrefix;}public boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled = enabled;}}
}
四、配置文件的加载顺序
1. 不同位置的配置文件加载优先级
- 项目根目录下的配置文件
- 当Spring Boot应用启动时,它会首先查找项目根目录下的
application.properties
或者application.yml
文件。这个位置的配置文件具有较高的优先级,可以用于覆盖默认的配置。例如,如果我们在项目根目录下的application.yml
中设置了server.port=8090
,那么这个配置将会优先于其他位置的相同配置项被加载。
- 当Spring Boot应用启动时,它会首先查找项目根目录下的
- 类路径下的配置文件
- 如果项目根目录下没有找到配置文件,Spring Boot会在类路径(classpath)下查找
application.properties
或者application.yml
文件。类路径下的配置文件是默认的配置来源。通常,我们在创建Spring Boot项目时,在resources
文件夹下的application.yml
或者application.properties
就是类路径下的配置文件。这里的配置项会被加载,如果项目根目录下没有覆盖这些配置的话。
- 如果项目根目录下没有找到配置文件,Spring Boot会在类路径(classpath)下查找
- 外部配置文件(如通过命令行指定)
- Spring Boot还支持通过命令行指定外部配置文件。例如,我们可以在启动应用时使用
--spring.config.location=file:/path/to/external - config/application.yml
这样的命令行参数来指定外部配置文件的位置。外部配置文件的优先级最高,它可以覆盖项目根目录和类路径下的相同配置项。
- Spring Boot还支持通过命令行指定外部配置文件。例如,我们可以在启动应用时使用
2. 利用加载顺序进行灵活配置
- 覆盖默认配置的示例
- 假设我们在类路径下的
application.yml
中有默认的数据库连接配置:
- 假设我们在类路径下的
spring:datasource:url: jdbc:mysql://localhost:3306/defaultdbusername: defaultuserpassword: defaultpassword
- 在开发环境中,我们可能需要连接到本地的测试数据库。我们可以在项目根目录下创建一个
application.yml
文件,只包含需要覆盖的配置项:
spring:datasource:url: jdbc:mysql://localhost:3306/testdbusername: testuserpassword: testpassword
这样,当在开发环境中启动应用时,就会使用项目根目录下的配置文件中的数据库连接配置,而不是类路径下的默认配置。
五、配置文件与不同环境(dev、prod等)
1. 多环境配置的概念
- 为什么需要多环境配置
- 在软件开发过程中,我们通常会经历多个不同的环境,如开发环境(dev)、测试环境(test)、生产环境(prod)等。不同的环境可能需要不同的配置。例如,在开发环境中,我们可能使用本地的轻量级数据库,并且日志级别设置为
DEBUG
以便于调试;而在生产环境中,我们会使用正式的数据库服务器,并且日志级别可能设置为INFO
或者WARN
以减少日志输出量,提高性能。多环境配置可以让我们在不同的环境中轻松切换应用的配置,而不需要频繁地修改配置文件中的具体内容。
- 在软件开发过程中,我们通常会经历多个不同的环境,如开发环境(dev)、测试环境(test)、生产环境(prod)等。不同的环境可能需要不同的配置。例如,在开发环境中,我们可能使用本地的轻量级数据库,并且日志级别设置为
2. 使用配置文件实现多环境配置
- 基于
application - {env}.properties/yml
的配置- 在Spring Boot中,我们可以使用
application - {env}.properties
或者application - {env}.yml
的方式来进行多环境配置。例如,我们有一个开发环境的配置文件application - dev.yml
和一个生产环境的配置文件application - prod.yml
。 - 在
application - dev.yml
中,我们可以配置适合开发环境的设置,如:
- 在Spring Boot中,我们可以使用
server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/devdbusername: devuserpassword: devpasswordprofiles:active: dev
logging:level:root: DEBUG
- 在
application - prod.yml
中,配置适合生产环境的设置:
server:port: 80
spring:datasource:url: jdbc:mysql://prod - db - server:3306/proddbusername: produserpassword: prodpasswordprofiles:active: prod
logging:level:root: INFO
- 激活不同环境的方式(如通过命令行参数、系统环境变量)
- 通过命令行参数:我们可以在启动应用时使用
--spring.profiles.active=dev
或者--spring.profiles.active=prod
这样的命令行参数来激活对应的环境配置。例如,java - jar myapp.jar --spring.profiles.active=dev
会激活开发环境的配置。 - 通过系统环境变量:我们也可以设置系统环境变量
SPRING_PROFILES_ACTIVE
的值来激活环境。例如,在Linux系统中,我们可以使用export SPRING_PROFILES_ACTIVE=prod
来设置环境变量,然后启动应用时就会使用生产环境的配置。
- 通过命令行参数:我们可以在启动应用时使用
六、总结与展望
在这篇文章中,我们深入探讨了Spring Boot中的配置文件。我们了解了两种主要的配置文件类型application.properties
和application.yml
,它们各自的语法和特点,以及如何相互转换。我们还学习了如何创建自定义配置属性,通过@ConfigurationProperties
注解来实现配置与Java类的绑定。同时,我们明白了配置文件的加载顺序,以及如何利用这个顺序进行灵活的配置覆盖。最后,我们掌握了多环境配置的方法,通过application - {env}.properties/yml
的方式和不同的激活环境的手段(命令行参数、系统环境变量),可以让我们的应用在不同的环境中顺利运行。
在下一篇文章中,我们将进入Spring Boot与数据库集成的精彩世界。我们会探讨如何选择适合我们应用的数据库,如何在Spring Boot项目中添加数据库相关的依赖,如何进行数据库连接配置,以及如何使用JPA(Java Persistence API)进行数据持久化等重要内容。这将为我们构建数据驱动的应用奠定坚实的基础。
相关文章:

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置
一、引言 在上一篇文章中,我们开启了Spring Boot的入门之旅,成功构建了第一个Spring Boot应用。我们从环境搭建开始,详细介绍了JDK的安装以及IDE的选择与配置,然后利用Spring Initializr创建了项目,分析了项目结构&am…...

OpenCV第十二章——人脸识别
1.人脸跟踪 1.1 级联分类器 OpenCV中的级联分类器是一种基于AdaBoost算法的多级分类器,主要用于在图像中检测目标对象。以下是对其简单而全面的解释: 一、基本概念 级联分类器:是一种由多个简单分类器(弱分类器)级联组…...
深入Volatile
深入Volatile 1、变量不可见性: 1.1多线程下变量的不可见性 直接上代码 /*** author yourkin666* date 2024/08/12/16:12* description*/ public class h1 {public static void main(String[] args) {MyClass myClass new MyClass();myClass.start();while (tr…...

数据结构 ——— 顺序表oj题:编写函数,合并两个有序数组
目录 题目要求 代码实现 题目要求 nums1 和 nums2 是两个升序的整型数组,另外有两个整数 m 和 n 分别代表 nums1 和 nums2 中的元素个数 要求合并 nusm2 到nums1 中,使合并后的 nums1 同样按升序顺序排列 最终,合并后的数组不应由函数返…...
Proto文件相关知识
百度Apollo的数据结构常用proto文件来定义, proto文件允许你以类似于C结构体或类的方式定义数据结构。你可以在这个文件中定义简单数据类型、枚举、消息类型等。 基于proto文件,Protocol Buffers编译器(protoc)可以自动生成对应的…...

k8s的控制节点不能访问node节点容器的ip地址
master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…...

鸿蒙OpenHarmony
开源鸿蒙系统编译指南 Ubuntu编译环境配置第一步:Shell 改 Bash第二步:安装Git和安装pip3工具第三步:远程仓配置第四步:拉取代码第五步:安装编译环境第六步:本地编译源码 Windows开发环境配置第一步&#x…...

把白底照片变蓝色用什么软件免费 批量更换证件照底色怎么弄
作为专业的修图师,有时候也会接手证件照修图和换底色工作,这种情况下,需要换底色的照片也许达到上百张。为了提高工作效率,一般需要批量快速修图,那么使用什么软件工具能够给各式不同的照片批量更换背景色呢࿱…...

Spring之生成Bean
Bean的生命周期:实例化->属性填充->初始化->销毁 核心入口方法:finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…...

笔记整理—linux进程部分(6)进程间通信、alarm和pause
两个进程间通信可能是任何两个进程间的通信(IPC)。同一个进程是在同一块地址空间中的,在不同的函数与文件以变量进程传递,也可通过形参传递。2个不同进程处于不同的地址空间,要互相通信有难度(内存隔离的原…...

Java网络通信—UDP
0.小记 1.udp通信不需要建立socket管道,一边只管发,一边只管收 2.客户端:将数据(byte)打包成包裹(DatagramPacket),写上地址(IP端口),通过快递站&…...

k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理
clusterIP作为k8s中的服务, 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod,pod由控制器自动部署,自动维护 那么问题是service的可用…...
vue框架和uniapp框架区别
文章目录 vue框架和uniapp框架区别一、引言二、Vue.js 概述1、Vue.js 简介1.1、特点 2、适用场景 三、Uni-app 概述1、Uni-app 简介1.1、特点 2、适用场景 四、区别与比较1、跨平台能力2、开发体验3、性能优化4、社区和支持 五、总结 vue框架和uniapp框架区别 一、引言 在前端…...

828华为云征文 | 华为云Flexus云服务器X实例搭建Zabbix网络设备监视系统(Ubuntu服务器运维)
前言 Flexus X实例内嵌智能应用调优算法,性能强悍,基础模式GeekBench单核及多核跑分可达同规格独享型实例的1.6倍,性能模式更是超越多系列旗舰型云主机,为企业业务提供强劲动力。 💼 Flexus X Zabbix:打造…...
JAVA基础-线程(Thread)、多线程(Multi-threaded)
1、知识铺垫 要想了解什么是线程,首先要搞明白线程与进程的区别,并行与并发的区别 1.1 线程与进程 进程:是指⼀个内存中运⾏的应⽤程序,每个进程都有⼀个独⽴的内存空间,⼀个应⽤程序可以同时运⾏多个进程;…...

hystrix微服务部署
目录 一.启动nacos和redis 1.查看是否有nacos和redis 二.开始项目 1.hystrix1工程(修改一下工程的注册名字) 2.运行登录nacos网站查看运行效果(默认密码nacos,nacos) 3.开启第二个项目 hystrix2工程 4.关闭第二个项目 hyst…...

使用百度文心智能体创建多风格表情包设计助手
文章目录 一、智能定制,个性飞扬二、多元风格,创意无限 百度文心智能体平台为你开启。百度文心智能体平台,创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台,集成了先进的自然语言处理技术和人工智能技术&…...

【嵌入式裸机开发】智能家居入门3(MQTT服务器、MQTT协议、微信小程序、STM32)
前面已经写了两篇博客关于智能家居的,服务器全都是使用ONENET中国移动,他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器,有公用的,也可以自己搭建 前言一、项目总览二、总体流程分析1、了解…...

css的背景background属性
CSS的background属性是一个简写属性,它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码,使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…...
Cypress自动化测试实战:构建高效的前端测试体系
在快速迭代的软件开发环境中,前端自动化测试是保证代码质量和用户体验的重要手段。Cypress作为一款功能强大的前端自动化测试工具,凭借其丰富的特性、直观的API和高效的测试执行速度,赢得了众多开发者和测试团队的青睐。本文将深入探讨Cypres…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...