【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…...
SQLTools-MCP:用AI智能体重构数据库工作流,实现自然语言查询
1. 项目概述:当SQL工具链拥抱AI智能体 如果你是一名和数据打交道的开发者或分析师,每天的工作可能都离不开SQL。从写一个简单的查询,到构建复杂的ETL管道,再到排查某个报表数据不准的问题,我们的大部分时间都花在了与数…...
高级渗透测试:KitHack多平台后门生成与持久化技术
高级渗透测试:KitHack多平台后门生成与持久化技术 【免费下载链接】KitHack Hacking tools pack & backdoors generator. 项目地址: https://gitcode.com/gh_mirrors/ki/KitHack KitHack是一款功能强大的渗透测试工具包,专为安全研究人员和渗…...
IPBan快速入门:一键安装配置,立即阻止僵尸网络入侵
IPBan快速入门:一键安装配置,立即阻止僵尸网络入侵 【免费下载链接】IPBan Since 2011, IPBan is the worlds most trusted, free security software to block hackers and botnets. With both Windows and Linux support, IPBan has your dedicated or …...
告别网盘限速!3步搞定百度网盘高速下载秘籍
告别网盘限速!3步搞定百度网盘高速下载秘籍 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的龟速下载而烦恼吗?每次看到那几十KB/s的速…...
Java基础——抽象类与接口
前言: 在Java面向对象编程中,抽象类,接口,内部类以及Object类是构建灵活,可拓展代码的核心工具。理解它们的区别与联系,掌握使用场景,是每一位Java开发者进阶的必经之路。 本文将结合通俗易懂的…...
DAY 4.链表中环的入口节点
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、链表中环的入口节点二、代码实现2.结论总结前言 一、链表中环的入口节点 思路:使用快慢指针,都从头节点出发,快指针一次…...
ARM架构TLB管理机制与RVALE1指令详解
1. ARM架构中的TLB管理机制解析在ARMv8/ARMv9架构中,TLB(Translation Lookaside Buffer)作为内存管理单元(MMU)的核心组件,承担着加速虚拟地址到物理地址转换的关键任务。当CPU需要访问内存时,T…...
智能体网格(Agent Mesh)架构解析:构建大规模异构智能体协同网络
1. 项目概述与核心价值最近在开源社区里,一个名为sampleXbro/agentsmesh的项目引起了我的注意。乍一看这个标题,你可能会觉得它有些神秘,甚至有点“缝合怪”的味道——sampleX、bro、agents、mesh,这些词组合在一起,到…...
2012年Accellera标准演进:SystemC、UCIS与AMS如何重塑EDA设计流程
1. 回顾2012:Accellera在电子设计自动化标准演进中的关键一年对于从事半导体设计,特别是系统级设计、验证和IP集成的工程师来说,2012年是一个值得标记的年份。那一年,行业正从2008年金融危机后的缓慢复苏中走出,移动计…...
动态紧凑模型在电子热设计中的高效应用
1. 动态紧凑模型在电子热设计中的核心价值在电子设备日益小型化、高功率化的今天,热管理已成为决定产品可靠性的关键因素。传统热仿真方法面临两大痛点:一是计算资源消耗大,特别是处理复杂封装结构时;二是难以准确预测半导体器件的…...
