当前位置: 首页 > news >正文

SpringBoot 的配置

目录

配置文件到底有什么作用呢 ?

SpringBoot的配置文件的格式有哪些呢?

properties配置文件

yml配置文件

properties乱码问题

多平台的配置文件设置


配置文件到底有什么作用呢 ?

配置文件主要是配置项目的一些重要的数据..

  • 比如配置数据库的连接信息

数据库是非常重要的一环,可以进行持久化存储,所以在做项目的时候使用数据库那是必须的.以前JDBC是直接写代码写用户名,密码.... 现在到了框架只需要配置即可.

  • 项目的启动端口

就比如一个教务管理系统它是分为学生端和老师端的,每一个的界面都是不一样的,就需要进行配置

  • 再比如 : 第三方的调用密钥等信息
  • 在比如 : 用于发现和定位问题的普通日志与异常日志...

配置文件都是对非常关键的数据进行配置的.所以是非常重要的.

SpringBoot的配置文件的格式有哪些呢?

SpringBoot配置文件的格式主要分为以下两种格式

  • 一种是properties
  • 一种是yml

我们先来看一看这两种配置文件的格式长啥样?

这里要注意一下,我们上一篇文章也讲过关于SpringBoot的核心设计思想,那就是约定大于配置.

什么意思呢?我们在来回忆一下

对于SpringBoot来说它不再像Spring那样需要配置繁琐的配置文件,SpringBoot它自己就会将配置文件配置好,不需要你自己去配置了.这就提高了效率.也就是当你在使用SpringBoot开发程序的时候使用它框架的默认配置就可以,如果你的需求与它默认的配置不符,那你就需要进行重写或者修改一些配置完成你的需求就行.

意思就是SpringBoot都会给你配置好,你只需要按照它的规定/约定去使用,不违反这个约定就可以使用SpringBoot进行高效的进行开发 这就是SpringBoot 的核心设计思想 : "约定大于配置"

我们一般会有这些约定 :

比如 :

  • 我们的Maven的目录结构,默认有resource文件夹来存放资源配置文件.我们默认生成的类都在target文件夹下
  • SpringBoot的配置文件必须是 application.的命名形式并且唯一. 比如application.properties /application.yml
  • 我们的启动类和我们自己写的带注解的类必须在同一级目录/同一级的子目录下
  • application.yml中默认属性。数据库连接信息必须是以spring: datasource: 为前缀;多环境配置。该属性可以根据运行环境自动读取不同的配置文件;端口号、请求路径等
  • Spring Boot会自动内置Tomcat容器来运行 Web 应用,我们不需要再去单独做应用部署。

对于我们SpringBoot的这个配置文件 必须是 application.的命名形式 比如application.properties 或者是application.yml,

这是SpringBoot的约定,我们不能违反否则的话,我们的配置文件就会不生效

既然有两种配置文件,都同时配置了,最终按照哪种配置文件进行配置呢?

我分别给两种配置文件都设置了不同的端口号,可以看出最终启动端口号为.properties配置文件设置的.

可以得出结论: 当两种配置文件都同时配置了同样的配置,.properties优先级高一些,但是不代表yml就不配置了.加载.properties文件之后,也会加载.yml配置文件.

虽然,存在两种格式的配置文件 yml和properties,但是在实际开发为了更好地维护,会统一使用一种格式的配置文件.

properties配置文件

对于properties配置文件我们先学习一下它的基本语法,然后再来学怎么配置/怎么存,然后在学习怎么取出来

properties配置文件的基本语法

基本语法也就是 key = value的形式

我们配置的内容其实又分为系统配置自定义的配置

配置系统的一些配置

比如我们来配置一个指定的端口号

比如我们要配置数据库的连接信息

 

用户自定义的配置项

 

如何读取配置文件呢?

SpringBoot给我们提供了一个@Value注解用来读取配置文件的.

语法格式 : @Value(${xxxx})

注意注意注意 : 我们不能写成@Value(xxxx) 这样,如果是这样的话它是会直接把xxx赋值给那个成员变量的.

如果写成@Value(${xxxx}) 这样正确的写法就是读取xxxx找到对应的key将Value返回给成员变量

比如我们读取系统配置项-->端口号port

 

 

我们再来读取一下用户自定义的配置项

 

properties配置文件的优缺点

优点 :

  • properties的配置文件写法简单. key对应着value key=value的形式

缺点 :

  • 会有很多的冗余代码,对于同样的前缀可能要写多次

比如我们配置数据库连接信息的时候

 

spring.datasource 有多个冗余的代码,前缀要写很多次

yml配置文件

YAML是一种人类可读的数据序列化语言,一般YAML通常用于配置文件,与属性文件相比,如果我们想要与配置文件中添加复杂的属性,YAML更加结构化,很少混淆,YAML分层配置数据.相比于properties配置的方式,YAML配置的方式更加直观清晰,简洁明了,有层次感.

YML配置文件的优点

  • ym配置文件,可读性高,写法简单,易于理解.
  • yml支持更多的数据类型,如 : 对象(键值对的集合),数组,纯量(字符串,布尔值,整数,浮点数,Null,时间日期....).
  • yml支持更多的编程语言(比如Java,Golang,PHP,Python.....等)

YMAL支持这么多语言有什么用??

有些人就会问,我YAML支持那么多编程语言有什么用,我就用Java.

当在大公司里面都是分项目小组的,彼此之间是相互独立的,这些组用到的数据库是一样的,但用户数据是互通的,由于用户太多就要使用微服务,也就意味着一个程序要部署到成千上万个机器上(一万个节点),就需要一万个配置,这时当运维做了调整和升级的时候,这些配置文件就都需要改变,这时候维护性就变得很高很高.

那让这些小组都读同一份配置-->配置文件格式相同, 也就是所有的配置文件都走一份在线的配置文件.这个时候由于我们YML是跨语言的,所有语言都可以读取一份YML,都调这一份(配置一份在线配置文件)就可以了,这样运维在做调整和升级,那份在线的配置就会同步更新,就能够读取到了

YML语法

  • 大小写敏感
  • 使用缩进表示层级关系(第一个层级前面不加空格,每一个层级的前面都比上面多加一个TAB键用于缩进表示层级关系,同一层级元素左对齐即可)
  • '#'表示注释
 

这种带有层次的结构可读性更高,写法简单,相比于.properties格式的配置文件省去了冗余的前缀.

我们可以比对一下

注意 :

YAML语法格式:

  • 使用缩进表示层级关系(第一个层级前面不加空格,每一个层级的前面都比上面多加一个TAB键用于缩进表示层级关系,同一层级元素左对齐即可)

每一个层级在进行配置的时候是 : key: val(key冒号空格val) 记住在配置的时候val前面一定要加空格.否则配置失败,也不会出现代码高亮.

YAML配置数据库

 

用户自定义配置项

 

YAML可以配置更多的数据类型,我们依次来演示一下

我们来检验一下进行读取

读取YAML配置还是使用@VALUE注解进行读取

 

还有一点需要注意的是

配置字符串的时候,可以啥也不加直接写中文,也可以加单引号,也可以加双引号

但是只有加双引号时候特殊符号才会起作用

YAML配置对象

配置People对象

读取方式一

读取People对象中的属性

对应层级关系我们可以利用 .(点) 来进行访问.

我们上面那种读取是将people一个一个属性读取的,我们有没有一种方式可以读取一个对象呢 ? 然后通过对象来访问这些属性.

读取方式二

 

要想读取people对象,那就先创建出一个people对象.

通过@ConfigurationProperties 注解来进行读取配置文件,将配置文件配置的属性赋值到当前people对象中.

注意还要加一个@Component注解,代表将这个对象存到Spring中--->在SpringBoot项目一启动时就会扫描启动类的同级目录下的类,包,子包,如果有Component注解就将其存到Spring中.

读取对象注意事项

  • 读取配置文件中的实体类时,一定要有setter方法,因为@ConfigurationProperties注解在实现的时候是通过setter将配置文件中的内容赋值给字段/属性的.

  • ConfigurationProperties需要和注册注解Component(放入到Spring中)进行一起使用,否则就不能将其存放到Spring中,也不能依赖注入了

行内写法

 

@ConfigurationProperties

@ConfigurationProperties 是一种读取配置文件的一种方式,通过指定配置的前缀(配置的标识),来读取配置文件中的内容.

@ConfigurationProperties 和 @Value 的使用略微不同,@Value 是读取单个配置项的,而 @ConfigurationProperties 是读取一组配置项的,我们可以使用 @ConfigurationProperties 加实体类读取一组配置项,其中 prefix 表示读取一组配置项的name,相当于 Java 中的类名,最后再把此配置类,注入到某一个类中就可以使用了

YAML配置集合

比如 在一个项目中可能使用多种数据库,这时候多个数据库就相当于一个集合,我就就可以自定义配置,来配置集合.

我们接下来来演示一下 : 

 

集合中每一个元素 利用 - (杠 + 空格)

项目支持很多种类型的数据库

集合名字

集合属性名--->接收多个值

- 值

- 值

如何读取集合呢 ?

还是利用ConfigurationProperties(prefix = "") 来进行读取

还是要加一个Component注解

 

我们可以写setter和getter也可以直接加一个注解

那这个setter和getter注解其实在我们.class文件编译的时候还是使用的是加上setter方法和getter方法

在讲解日志lombok的时候再来讲解原理

properties乱码问题

在你没有处理这个问题之前,每当你重新打开一个properties这个配置文件,你就会发现你的注释全变成了乱码.

原因就是配置文件的默认编码格式不是UTF-8

所以我们就要把当前项目和新项目的编码格式改成UTF-8就可以解决了

当前项目 :

新项目 :

多平台的配置文件设置

为什么会有多平台配置文件设置??

一般在公司都要分多种配置文件,因为有多种环境比如,开发环境,测试环境,生产环境... 每种环境需求并不一样,所以自然配置就不一样.就比如我开发环境就需要多的日志来帮程序猿排查问题,解决问题,而对于生产环境,也就是用户用的环境,不需要打印多的日志,这样会影响速度.

总之,分多平台的配置文件设置就是为了更好地维护每种环境所要应对的事情.

如果不设置多平台的配置文件,就用那一份主的配置文件,那么每种环境配置的都不一样,每次运行的时候都要修改.这就很麻烦了.

好接下来我们按照这三种常见的环境进行配置

-- 开发环境的配置文件

-- 测试环境的配置文件

-- 生产环境的配置文件

一般文件格式都是以 application 或 application-xxx... .yml

一定是按照这种格式的,因为springboot ->有一个特点 就是 "约定大于配置"

我们需要在主yml配置文件设置使用哪种环境为运行环境

 

相关文章:

  • FineReport报表设计工具- 配置DB2外接数据库(1)
  • 【NI Multisim 14.0编辑环境——工具栏】
  • css中动画之transition
  • 【HTML】再见2022!一起来写一个响应式跨年倒计时吧!(附源码)
  • Spring MVC框架学习
  • 第004课 - 项目微服务架构图
  • BOSS直聘自动投简历的实现过程
  • 【高阶数据结构】二叉树的非递归遍历
  • 【LeetCode】从前序与中序遍历序列构造二叉树 [M](二叉树重构)
  • C++GUI之wxWidgets(6)-一步步做zip精灵(1)
  • [vue element-ui]JAVA POST请求
  • 【C语言 全局 整形变量 布尔变量 数组变量 指针变量 结构体位域变量 枚举变量被其他.C文件相互访问】
  • MyBatis的增删改查操作
  • TypeScript基础类型
  • 汇聚数据库创新力量,加速企业数字化转型
  • 【译】理解JavaScript:new 关键字
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Apache的基本使用
  • extjs4学习之配置
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python打包系统简单入门
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 对超线程几个不同角度的解释
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 回流、重绘及其优化
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 区块链分支循环
  • 软件开发学习的5大技巧,你知道吗?
  • 我的业余项目总结
  • 线性表及其算法(java实现)
  • 一天一个设计模式之JS实现——适配器模式
  • 译米田引理
  • 由插件封装引出的一丢丢思考
  • linux 淘宝开源监控工具tsar
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ![CDATA[ ]] 是什么东东
  • # Apache SeaTunnel 究竟是什么?
  • # 飞书APP集成平台-数字化落地
  • #Z0458. 树的中心2
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (1) caustics\
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (7)svelte 教程: Props(属性)
  • (Java)【深基9.例1】选举学生会
  • (js)循环条件满足时终止循环
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (TOJ2804)Even? Odd?
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)斐波那契Fabonacci函数
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)人的集合论——移山之道