【JavaEE进阶】 SpringBoot配置⽂件
文章目录
- 🍀配置⽂件的作⽤
- 🌴SpringBoot配置⽂件
- 🎋配置⽂件的格式
- 🎄properties配置⽂件
- 🚩properties基本语法
- 🚩读取配置⽂件
- 🚩properties的缺点
- 🌳yml配置⽂件
- yml基本语法
- 🚩yml 使⽤进阶
- 🎈yml配置不同数据类型及null
- 📌yml配置读取
- 📌注意事项:value值加单双引号
- 🎈配置对象
- 🎈配置集合
- 🎈配置Map
- 🚩yml优缺点
- ⭕总结
🍀配置⽂件的作⽤
计算机上有数以千计的配置⽂件,我们使⽤的绝⼤多数软件,⽐如浏览器,微信,Idea,甚⾄电脑,⼿机,都离不开配置⽂件.
我们可能永远不会直接与其中的⼤部分⽂件打交道,但它们确实以不同的形式散落在我们的计算机上,⽐如C:\Users,C:\Windows⽂件夹,以及各种*.config,*.xml⽂件
配置⽂件主要是为了解决硬编码带来的问题,把可能会发⽣改变的信息,放在⼀个集中的地⽅,当我们启动某个程序时,应⽤程序从配置⽂件中读取数据,并加载运⾏.
硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中,也就是我们常说的"代码写死".
⽐如⼿机字体⼤⼩ 如果采⽤硬编码的⽅式,就直接在程序中指定字体⼤⼩,所有的⽤⼾使⽤的都是同⼀个字体⼤⼩
但是不同的⽤⼾有不同的偏好,我们可以把⼿机字体的⼤⼩放在配置⽂件中,当程序启动时,读取配置,以⽤⼾设置的字体⼤⼩来显⽰.
使⽤配置⽂件,可以使程序完成⽤⼾和应⽤程序的交互,或者应⽤程序与其他应⽤程序的交互
🌴SpringBoot配置⽂件
SpringBoot⽀持并定义了配置⽂件的格式,也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的⽬的.
很多项⽬或者框架的配置信息也放在配置⽂件中,⽐如:
-
项⽬的启动端
-
数据库的连接信息(包含⽤⼾名和密码的设置)
-
第三⽅系统的调⽤密钥等信息
-
⽤于发现和定位问题的普通⽇志和异常⽇志等.
对于项⽬的启动端⼝
SpringBoot内置了Tomcat服务器,默认端⼝号是8080,但是⽤⼾电脑上8080端⼝号有可能就被其他
应⽤程序占⽤了,所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号
而对于数据库连接信息
为了更⽅便简单的访问数据库,出现了⼀些持久层框架,其实就是对JDBC进⾏了更深层次的封装.让⽤⼾通过简单⼏⾏代码就可完成数据库的访问.但是不同的应⽤程序访问的数据库不同,这些持久层框架就需要⽀持⽤⼾可以⾃定义配置数据库的连接信息
接下来我们先简单配置看一下:
我们在前⾯讲了Tocmat默认端⼝号是8080,所以我们程序访问时的端⼝号也是8080,但是如果8080端⼝号已经被其他进程使⽤了呢?我们可以通过配置⽂件来修改服务的端⼝号,SpringBoot在创建项⽬时,就已经帮我们创建了配置⽂件
修改 application.properties ⽂件
server.port=9090
再次启动,我们观察日志中tomcat所用端口
显⽰Tomcat启动端⼝号为9090
🎋配置⽂件的格式
SpringBoot配置⽂件有以下三种:
-
application.properties
-
application.yml
-
application.yaml
yml为yaml的简写,实际开发中出现频率最⾼.yaml和yml的使⽤⽅式⼀样,博主这里只讲yml⽂件的使⽤
当应⽤程序启动时,SpringBoot会⾃动从classpath路径找到并加载application.properties 和application.yaml 或者 application.yml ⽂件
也可以通过spring.config.name指定⽂件路径和名称,参考链接点我
那么如何理解这两种配置文件的区别呢?
类似商品的包装⼀样,有新⽼两款包装.properties类型的配置⽂件就属于⽼款包装,也是创建SpringBoot项⽬时默认的⽂件格式(主要是因为仓库⾥还有库存),⽽yml属于新版包装,如果⽤⼾了解情况直接指定要新款包装,那么就直接发给他
当然这里还有一些特殊情况需要说明:
-
理论上讲 .properties 和 .yml 可以并存在于⼀个项⽬中,当 .properties 和 .yml 并存时,两个配置都会加载.如果配置⽂件内容有冲突,则以 .properties 为主,也就是.properties 优先级更⾼.
-
虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率).
🎄properties配置⽂件
properties配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件
🚩properties基本语法
properties是以键值的形式配置的,key和value之间是以"="连接的,如:
# 配置项⽬端⼝号
server.port=8080#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
想要了解更多配置的小伙伴可以参考 SpringBoot配置
🚩读取配置⽂件
如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。
@Value 注解使⽤" ${} "的格式读取,如下代码所⽰:
获取properties 配置如下:
@RestController
public class PropertiesController {@Value("${server.port}")private String value;@RequestMapping("/getValue")public String getValue() {return "端口号为:"+value;}
}
获取如下:
🚩properties的缺点
properties配置是以key-value的形式配置的,如下图所示
从上述配置key看出,properties配置⽂件中会有很多的冗余的信息,⽐如这些:
想要解决这个问题,就可以使⽤yml配置⽂件的格式化了.
🌳yml配置⽂件
yml是YAML是缩写,它的全称Yet Another Markup Language翻译成中⽂就是“另⼀种标记语⾔.
yml基本语法
yml是树形结构的配置⽂件,它的基础语法是"key: value".
key和value之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略
我们刚刚也说过了,yml可以解决properties配置⽂件冗余信息的问题。接下来我们就以数据库为例,看一下yml是如何解决的,yml配置文件如下:
spring:datasource:url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=falseusername: rootpassword: root
使用注意事项:
- properties用 . 将每一层文件分开,yml每一层结束后用 :分开。并且需要换行(当然也可以使用 . )
- 换行前面空余部分是一个空格(相较于上一行)而不是一个tab
接下来我们看一看两者的代码量的对比,对比如下:
🚩yml 使⽤进阶
🎈yml配置不同数据类型及null
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# "" 空字符串
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ''
📌yml配置读取
yml读取配置的⽅式和properties相同,使⽤@Value注解即可,实现代码如下:
@RestController
public class YmlController {@Value("${string.value}")private String say;@RequestMapping("/getSay")public String getSay() {return "say:"+say;}
}
读取结果如下:
📌注意事项:value值加单双引号
字符串默认不⽤加上单引号或者双引号,如果加英⽂的单双引号可以表⽰特殊的含义。
尝试在application.yml中配置如下信息:
string:str1: Hello \n 遇事问春风乄.str2: 'Hello \n 遇事问春风乄.'str3: "Hello \n 遇事问春风乄."
获取配置文件代码如下:
@RestController
public class HelloController {@Value("${string.str1}")private String hello1;@Value("${string.str2}")private String hello2;@Value("${string.str3}")private String hello3;@RequestMapping("/getHello")public String getHello() {System.out.println("str1:" + hello1);System.out.println("str2:" + hello2);System.out.println("str3:" + hello3);return "ok";}
}
执行结果如下:
从上述结果可以看出:
-
字符串默认不⽤加上单引号或者双引号。
-
单引号会转义特殊字符,使其失去特殊功能,始终是⼀个普通的字符串.
-
双引号不会转义字符串⾥⾯的特殊字符,特殊字符会表⽰本⾝的含义.
此处的转义理解起来会有些拗⼝,\n本意表⽰的是换⾏
使⽤单引号会转义,就是说,\n不再表⽰换⾏了,⽽是表⽰⼀个普通的字符串
使⽤双引号不会转义,表⽰\n表⽰的是它本⾝的含义,就是换⾏
当然每个人理解不同,意思也就不同
🎈配置对象
我们还可以在yml中配置对象,如下配置:
student:id: 1name: 遇事问春风乄age: 18
或者是使⽤⾏内写法(与上⾯的写法作⽤⼀致):
student: {id: 1,name: Java,age: 18}
这个时候就不能⽤@Value来读取配置中的对象了,此时要使⽤另⼀个注解
@ConfigurationProperties 来读取,具体实现如下
@ConfigurationProperties(prefix = "studnet")
@Component
@Data
public class Student {private int id;private String name;private int age;
}
这个注解的意思是个读取了配置文件里面的对象
读取代码如下:
@RestController
public class StudentController {@Autowiredprivate Student student;@RequestMapping("/readStudent")public String readStudent(){return student.toString();}
}
🎈配置集合
配置⽂件也可以配置list集合,如下所⽰
集合的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:
@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {private List<String> name;
}
访问集合如下:
@RestController
public class ReadYm {@Autowiredprivate ListConfig listConfig;@RequestMapping("/readList")public String readList(){return listConfig.toString();}
}
注意事项:
🎈配置Map
配置⽂件也可以配置map,如下所⽰:
maptypes:map:k1: kk1k2: kk2k3: kk
或者是使⽤⾏内写法(与上⾯的写法作⽤⼀致):
maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}
Map的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下
@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {private HashMap<String,String> map;
}
访问map如下:
@RestController
public class ReadYml {@Autowiredprivate MapConfig mapConfig;@RequestMapping("/readMap")public String readStudent(){return mapConfig.toString();}
}
🚩yml优缺点
优点:
-
可读性⾼,写法简单,易于理解
-
⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.
-
⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在Golang,Python,Ruby,JavaScript中也可以使⽤
缺点:
-
不适合写复杂的配置⽂件
-
对格式有较强要求
⭕总结
关于《【JavaEE进阶】 SpringBoot配置⽂件》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!
相关文章:

【JavaEE进阶】 SpringBoot配置⽂件
文章目录 🍀配置⽂件的作⽤🌴SpringBoot配置⽂件🎋配置⽂件的格式🎄properties配置⽂件🚩properties基本语法🚩读取配置⽂件🚩properties的缺点 🌳yml配置⽂件yml基本语法Ƕ…...
excel 常用函数
求和函数: SUM: 将单个值、单元格引用或区域相加。 案例:SUM(A1:A5) (结果:A1到A5单元格的值求和) SUMIF: 对选中范围内符合指定条件的值求和。 案例:SUMIF(B1:B5, ">50&qu…...

【React基础】– JSX语法
文章目录 认识JSX为什么React选择了JSXJSX的使用 React事件绑定this的绑定问题事件参数传递 React条件渲染React列表渲染列表中的key JSX的本质createElement源码Babel官网查看直接编写jsx代码 虚拟DOM的创建过程jsx – 虚拟DOM – 真实DOM声明式编程 阶段案例练习 认识JSX ◼ …...

SpringBoot 项目中后端实现跨域的5种方式!!!
文章目录 SpringBoot 项目中后端实现跨域的5种方式!!!一、为什么会出现跨域问题二、什么是跨域三、非同源限制四、Java后端 实现 CORS 跨域请求的方式1、返回新的 CorsFilter(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、使用注解 (局部跨…...

Vue3前端开发,provide和enject的基础练习,跨层级传递数据
Vue3前端开发,provide和enject的基础练习,跨层级传递数据! 声明:provide虽然可以跨层级传递,但是依旧是需要由上向下的方向传递。根传子的方向。 <script setup> import {onMounted, ref} from vue import Base from ./components/Base.vue impor…...
Python 循环结构值while循环
while循环是一种常用的循环结构,它会在满足特定条件的情况下重复执行一段代码块。 基本语法: while condition:# 循环体代码while循环的执行过程如下: 首先,判断循环条件condition(布尔表达式)是否为真。…...

MSSQL-识别扩展extended event(扩展事件)中的时间单位
经常使用sqlserver extended event(扩展事件),但是总是忘记扩展事件使用的时间单位,不确定它们是 秒、毫秒、还是微秒? 以下下代码能够从 相关DMV中提取description字段内容来识别时间单位: SELECT [p].[name] [package_name],[o…...
vue3中l和vue2中v-model不同点
vue2比较让人诟病的一点就是提供了两种双向绑定:v-model和.sync, 在vue3中,去掉了.sync修饰符,只需要使用v-model进行双向绑定即可。 为了让v-model更好的针对多个属性进行双向绑定(vue2中自定义组件中v-model只能使用…...

使用 Swift 代码优化项目编译速度
引言 软件的性能是评价一个软件质量的重要指标,尤其在今天这个时代,性能已成为大型项目不可或缺的考虑因素之一。对于用户量极大的软件,如网银系统、在线购物商城等,更是必须保证其高效稳定的性能。在这种背景下,优化…...

基于springboot+vue的社区团购系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…...

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…...
Golang 搭建 WebSocket 应用(七) - 性能、可用性
在前面的文章中,提到过非功能性需求决定了架构。 今天我们再来考虑一下另外两个非功能性需求:性能和可用性。 前言 关于性能,其实并不是只有我们这个消息推送系统独有的问题。 对于所有的开发者而言,都多多少少会处理过性能相关…...
Qt 状态机框架:The State Machine Framework (一)
传送门: Qt 状态机框架:The State Machine Framework (一) Qt 状态机框架:The State Machine Framework (二) 一、什么是状态机框架 状态机框架提供了用于创建和执行状态图/表[1]的类。这些概念和表示法基于Harel的Statecharts:一种复杂系统的可视化形式,也是UML状态图的基…...

高通平台学习一
什么是QMI? Qualcom Message Interface 高通信息接口 高通平台目前都是非对称多核心,最主要的是AP和Modem。两个处理器怎么进行通信呢,我们把AP和Modem当作两个主机,问题就变得了很简单,TCP/IP协议不是一种非常成功的进程间跨主…...

Python爬虫时被封IP,该怎么解决?四大动态IP平台测评
在使用 Python 进行爬虫时,很有可能因为一些异常行为被封 IP,这主要是因为一些爬虫时产生的异常行为导致的。 在曾经的一次数据爬取的时候,我尝试去爬取Google地图上面的商家联系方式和地址信息做营销,可是很不幸,还只…...

积分梳状滤波器CIC原理与实现
CIC(Cascade Intergrator Comb):级联积分梳状滤波器,是由积分器和梳状滤波器级联而得。滤波器系数为1,无需对系数进行存储,只有加法器、积分器和寄存器,资源消耗少,运算速率高&#…...

【项目管理】CMMI-原因分析与解决过程(CAR)
概述: “原因分析与解决”通过预防缺陷或者问题的引入以及识别并适当纳入优秀过程性能的原因,改进质量与生产率。 目录 1、文档结构 2、原因分析与解决过程域包括如下活动 3、选择需要加以分析的结果(启动条件) 4、过程活动与实践对照表 5、实例 1、…...

【设计模式】文件目录管理是组合模式吗?
组合模式是什么? 组合模式是一种将对象组合成树形结构以表示"部分-整体"的层次结构的设计模式。它使得用户对单个对象和组合对象的使用具有一致性。 组合模式在什么情况下使用? 当你发现你需要在代码中实现树形数据结构,让整体-部…...

利用appium自动控制移动设备并提取数据
安装appium-python-client模块并启动已安装好的环境 安装appium-python-client模块 在window的虚拟环境下执行pip install appium-python-client 启动夜神模拟器,进入夜神模拟器所在的安装路径的bin目录下,进入cmd终端,使用adb命令建立adb…...
day22_236二叉树最近公共祖先_235二叉搜索树(最近公共祖先_701插入一个节点_450删除一个节点)
文章目录 [236 二叉树的最近公共祖先](https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE)[235 二叉搜索树的最近公共祖先](https://program…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...