【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属于新版包装,如果⽤⼾了解情况直接指定要新款包装,那么就直接发给他

当然这里还有一些特殊情况需要说明:

  1. 理论上讲 .properties 和 .yml 可以并存在于⼀个项⽬中,当 .properties 和 .yml 并存时,两个配置都会加载.如果配置⽂件内容有冲突,则以 .properties 为主,也就是.properties 优先级更⾼.

  2. 虽然理论上来讲 .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
# 布尔值,truefalse
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优缺点

优点:

  1. 可读性⾼,写法简单,易于理解

  2. ⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.

  3. ⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在Golang,Python,Ruby,JavaScript中也可以使⽤

缺点:

  1. 不适合写复杂的配置⽂件

  2. 对格式有较强要求

⭕总结

关于《【JavaEE进阶】 SpringBoot配置⽂件》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

TestCaseAssiant使用说明

目录 说明 工具界面 功能描述 Xmind转测试用例 测试组件 测试用例 用例优先级 用例前提 用例操作步骤 用例期望结果 Excel测试用例转Testlink xml 用例模板 使用技巧: TestLink Xml转Excel测试用例 说明 本文为小编之前博文中介绍的工具使用说明 Xmind转Excel测…

python tkinter 最简洁的计算器按钮排列

代码如下&#xff0c;只要再加上按键绑定事件函数&#xff0c;计算器既可使用了。 import tkinter as tk from tkinter.ttk import Separator,Buttonif __name__ __main__:Buttons [[%,CE,C,←],[1/x,x,√x,],[7, 8, 9, x],[4, 5, 6, -],[1, 2, 3, ],[, 0, ., ]]root tk.T…

2024年阿里云优惠券和代金券领取,活动整理服务器价格表

2024阿里云优惠活动&#xff0c;免费领取阿里云优惠代金券&#xff0c;阿里云优惠活动大全和云服务器优惠价格表&#xff0c;阿里云ECS服务器优惠价99元一年起&#xff0c;轻量服务器优惠价61元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云优惠券免费领取、优惠活…

GCC 内联汇编

LINUX下的汇编入门 AT&T风格 汇编 和GCC风格汇编 汇编代码的调试 前面写了三篇,是自我摸索三篇,摸着石头过河,有些或许是错误的细节,不必在意! 今天我们直接用GCC编译C语言代码,且在C语言里面内嵌AT&T风格的汇编! 前三篇大家了解即可,我们重点放在内嵌汇编里,简单快…

Java设计模式-单例模式(2)

大家好&#xff0c;我是馆长&#xff01;从今天开始馆长开始对java设计模式的创建型模式中的单例、原型、工厂方法、抽象工厂、建造者的单例模式进行讲解和说明。 单例模式&#xff08;Singleton&#xff09; 定义 某个类只能生成一个实例&#xff0c;该类提供了一个全局访问…

houdini rnn

1.3.RNN模型_哔哩哔哩_bilibili 此公式来自于吴恩达P1.3视频 按公式推测rnn内部结构,如有错误&#xff0c;敬请指正

解决系统开发中的跨域问题:CORS、JSONP、Nginx

文章目录 一、概述1.问题场景2.浏览器的同源策略3.解决思路 二、一点准备工作1.创建前端工程12.创建后端工程3.创建前端工程24.跨域问题 三、方法1&#xff1a;使用CORS四、方法2&#xff1a;JSONP五、方法3&#xff1a;Nginx1.安装和启动&#xff08;windows&#xff09;2.使用…

初识VUE

文章目录 Vue是什么1.创建一个Vue实例2.插值表达式{{ }}3.Vue的响应式特性4.开发者工具的安装 Vue是什么 概念&#xff1a;Vue是一个用于构建用户界面的渐进式框架 ①构建用户界面&#xff1a;基于数据渲染出用户看到的界面 ②渐进式&#xff1a;循序渐进 ③ 框架&#xff1…

6.4.4释放音频

6.4.4释放音频 许多Flash动画里的音乐或歌曲非常好听&#xff0c;能不能在没有源文件的情况下把里面的声音文件取出来呢&#xff1f;利用Swf2VideoConverter2可以轻松做到这一点。 1&#xff0e;单击“添加”按钮&#xff0c;在弹出的下拉菜单中选择“添加文件”&#xff0c;…

金蝶云星空表单插件获取单据体数据

文章目录 金蝶云星空表单插件获取单据体数据 金蝶云星空表单插件获取单据体数据 使用标识报错 var thisEntry this.View.Model.DataObject["FEntity"] as DynamicObjectCollection;应该使用实体属性 var thisEntry this.View.Model.DataObject["BillEntry&q…

搜索经典题——填充 9*9矩阵

题目&#xff1a;给定一个九行九列矩阵&#xff0c;填充矩阵元素&#xff0c;要求&#xff1a; 1、每一行每一列&#xff0c;每个小九宫格&#xff08;图片画粗的地方就是&#xff09;不能包含相同元素 2、每一行&#xff0c;每一列&#xff0c;每个小九宫格均会完整出现1-9的数…

【Python爬虫】项目案例讲解,一步步教你爬取淘宝商品数据!

前言 随着互联网时代的到来&#xff0c;人们更加倾向于互联网购物&#xff0c;某宝又是电商行业的巨头&#xff0c;在某宝平台中有很多商家数据&#xff0c;今天带大家使用pythonselenium工具获取这些公开的商家数据 环境介绍&#xff1a; python 3.6pycharmseleniumcsvtime…

vue3 项目中 arguments 对象获取失败问题

问题 在 vue3 项目中 获取到的 arguments 对象与传入实参不符&#xff0c;打印出函数中的 arguments 对象显示如下&#xff1a; 原因 作者仔细回看代码才发现&#xff0c;自己一直用的是 vue3 的组合式写法&#xff0c;函数都是箭头函数&#xff0c;而箭头函数不存在 argumen…

cetos7搭建部署k8s 版本1.28

主机分配 内存最少是4G cpu个数最少两个 IP内存CPU主机名192.168.231.12044K1 192.168.231.12144K2192.168.231.12244K3 关闭防火墙 systemctl stop firewalled 关闭swap vim /etc/fstab 设置主机名称 hostnameset 安装docker 三个主机 初始化集群 在mas…

1432 - 走出迷宫的最少步数-广度优先搜索BFS

代码 #include<bits/stdc.h> using namespace std; char a[51][51]; int r,c; int fx[4]{0,0,1,-1}; int fy[4]{1,-1,0,0}; int tx,ty; struct Node{int x,y,step; }; int bfs(int x,int y){a[x][y]#;queue<Node> q;q.push({x,y,1});while(!q.empty()){Node Curre…

第五篇:其他窗口部件 QAbstractButton

QAbstractButton QAbstractButton 类是按钮部件的抽象基类&#xff0c;提供了按钮的通用功能。它的子类包括标准按钮 QPushButton、工具按钮 QToolButton、复选框 QCheckBox和单选按钮 QRadioButton 等。 QPushButton QPushButton 提供了创建交互按钮的基本功能。它可以包含…

css3+javaScript实现一个左右钟摆-摇晃的红灯笼网页特效

css3javaScript实现一个左右钟摆-摇晃的红灯笼网页特效&#xff01;前天逛博客时无意中看见了&#xff0c;别人的博客顶部有一个会左右钟摆的摇晃的红灯笼&#xff0c;产生了想法&#xff0c;我也想给自己做一个&#xff0c;但是网上找了很多方案&#xff0c;都没有实现。终于在…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)

论文阅读笔记AI篇 —— Transformer模型理论实战 &#xff08;三&#xff09; 第三遍阅读&#xff08;精读&#xff09;3.1 Attention和Self-Attention的区别&#xff1f;3.2 Transformer是如何进行堆叠的&#xff1f;3.3 如何理解Positional Encoding&#xff1f;3.x 文章涉及…

【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

阅读导航 引言一、简介二、成员函数三、使用示例四、C模拟实现五、std::shared_ptr的线程安全问题六、总结温馨提示 引言 在 C 动态内存管理中&#xff0c;除了 auto_ptr 和 unique_ptr 之外&#xff0c;还有一种智能指针 shared_ptr&#xff0c;它可以让多个指针共享同一个动…

钉钉副总裁李智勇:AI超级助理,提升大模型时代生产力

微软比尔盖茨此前曾预言:“五年内&#xff0c;每个人都将拥有AI私人助理Agent&#xff0c;Agent将颠覆软件行业 。” 近日以来&#xff0c;在GPT store正式上线点爆情绪之后&#xff0c;无论国内外&#xff0c;Agent都是创业圈里炙手可热的新贵。一场关于Agent创业比拼大赛&am…