第三章SpringBoot配置文件

news2024/10/6 1:45:00

文章目录

  • 什么是配置文件
      • 比如我们的QQ的配置文件
      • 配置文件作用
  • SpringBoot配置文件的格式
      • Spring Boot 配置文件主要分为以下两种格式
    • properties 配置文件说明
      • properties 基本语法
      • properties 缺点分析
    • yml 配置文件
      • yml概述
      • yml基础语法
    • 读取配置文件
      • @Value 注解使用“${}”的格式读取
      • @ConfigurationProperties配置绑定
      • 加载指定的配置文件
      • 小结
    • 两个类型配置文件小结
  • 多环境配置和配置切换
    • 配置文件加载位置
    • 多环境切换
    • yaml的多文档块

什么是配置文件

  • 首先我们知道我们的程序是 指令 + 指令要处理的数据(变量,对象,数据库的记录…)
  • 假如我们所有的数据都是固定的情况下,那我们的程序无论允许多少次,结果都是一样的

img 随着我们的软件规模开始变大,数据来源不在唯一(数据不一定是写死在程序中了)

//数据写死了,执行多少才都不会变化
System.out.println("hello world");
//由于引入了外部的数据,所以可能每次输出的结果不一样
Scanner sc=new Scanner(System.in);
String target=sc.nextLine();
System.out.println(target);
  • 外部数据不仅仅局限于读取用户输入这种形态,会有其他形式,比如读取文件的内容,也比如读取数据库的内容,这样给了允许软件的用户可以在运行期间去修改程序依赖数据的权利

比如我们的QQ的配置文件

img

  • 这些分离出来的数据,有一部分是影响软件执行的逻辑发策略数据,一般我们把这类数据称为配置文件
  • 配置文件在GUI中是更常见的形式——软件的设置,就比如上面QQ的设置,其原理就是通过图形化的界面修改了硬盘上的配置文件

配置文件作用

  • 整个项目中所有重要的数据都是在配置文件中配置的,比如:
  • 数据库的连接信息(包含用户名和密码的设置);
  • 项目的启动端口;
  • 第三方系统的调用秘钥等信息;
  • 用于发现和定位问题的普通日志和异常日志等。

想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。

SpringBoot配置文件的格式

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的application.properties

Spring Boot 配置文件主要分为以下两种格式

  • .properties
  • .yml

image-20230214012056586

我们创建的SpringBoot项目默认是给的是application.properties

  • 这就好像连锁店里面的统一服装一样,有两种不同的款式,properties 类型的配置文件就属于老款“服饰”,也是创建 Spring Boot 项目时默认的文件格式(主要是由于仓库里还有库存),而 yml 属于新版款式,如果用户了解情况直接指定要新款服饰,那么就直接发给他。

特殊说明

  • 理论上讲 properties 可以和 yml 一起存在于一个项目当中,当 properties 和 yml 一起存在一个项目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”,那么这个时候会以 properties 中的配置为主,也就是** .properties 配置文件的优先级最高,但加载完 .properties 文件之后,也会加载 .yml 文件的配置信息**。

  • 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率)。这就好像连锁店的服饰一样,不管是老款的服装还是新款的服装,一定要统一了才好看。

properties 配置文件说明

properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。

properties 基本语法

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:

#配置我们服务器的
server.port=8888

PS:小技巧:配置文件中使用“#”来添加注释信息。

properties 缺点分析

  • priperties默认是不支持中文显示,所以最好不写中文
  • 这种文件也不会有自动提醒,需要安装插件才会有
  • properties 配置文件中会有很多的冗余的信息
# 配置项目端口号
server.port=8084
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123

yml 配置文件

yml概述

  • yml 是 YMAL 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是“另一种标记语言”。yml 是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。yml 最大的优势是可以跨语言,不止是 Java 中可以使用 golang、python 都可以使用 yaml 作为配置文件。
  • 这种语言以数据作为中心,而不是以标记语言为重点!

以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yml和xml

传统xml配置

<server>
	<port>8081<port>
</server>

yml配置

server:
	prot: 8080

yml基础语法

k-v键值对

# k-v键值对
name: xiaoqi
#相当于name=xiaoqi
# 存对象
student:
  name: xiaoqi
  age: 12
  
# 行内写法
student1: {name: xiaoqi,age: 13}

#数组
pets:
  - cat
  - dog
  - pyg

pets1: [cat,dog]

yml 是树形结构的配置文件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒汗加空格的方式组成的,其中的空格不可省略

说明:语法要求严格!

  • 空格不能省略
  • 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
  • 属性和值的大小写都是十分敏感的。

字面量:普通的值 [ 数字,布尔值,字符串 ]

字符串默认不用加上单引号或者双引号, 字符串默认不用加上双引号或者单引号;

注意:

  • “ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;

    • 比如 :name: “kuang \n shen” 输出 :kuang 换行 shen
  • ‘ ’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出

    • 比如 :name: ‘kuang \n shen’ 输出 :kuang \n shen

yml 和 properties 连接数据库的配置对比

spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
username: root
password: root  

读取配置文件

如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。

@Value 注解使用“${}”的格式读取

application.properties

#user对象的属性
user:
  id: 2
  pwd: 留守处123
@Component
public class User {
     @Value("${user.id}")
    private Integer id;
    @Value("${user.pwd}")
    private String pwd; 
    对应的getter setter 构造方法
	.....
	.....
	.....
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

测试

@SpringBootApplication
public class Boot03ConfigApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext run = SpringApplication.run(Boot03ConfigApplication.class, args);
		User user = run.getBean(User.class);
		System.out.println(user);
	}

}
//输出结果
User{id=1, name='lsc07'}

@ConfigurationProperties配置绑定

如何使用Java读取到properties文件中的内容,并且把它封装到JavaBean中,以供随时使用

#user对象的属性
user:
  id: 2
  pwd: 留守处123
@Component
@ConfigurationProperties( prefix = "user")
public class User {
    private Integer id;
    private String pwd;

    public User() {
    }

    public User(Integer id, String pwd) {
        this.id = id;
        this.pwd = pwd;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

加载指定的配置文件

**@PropertySource :**加载指定的配置文件;

@configurationProperties:默认从全局配置文件中获取值;

我们去在resources目录下新建一个person.properties文件

name=lsc

然后在我们的代码中指定加载person.properties文件

@PropertySource(value = "classpath:person.properties")
@Component //注册bean
public class Person {
    @Value("${name}")
    private String name;
    ......  }

小结

  • @ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
  • 松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下
  • JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
  • 复杂类型封装,yml中可以封装对象 , 使用value就不支持

JSR303数据校验

空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false

长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) Validates that the annotated string is between min and max included.

日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
@Future 验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
@Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。

数值检查
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) 被指定的元素必须在合适的范围内
@Range(min=10000,max=50000,message=”range.bean.wage”)
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)]()]()

@Component
@ConfigurationProperties(prefix = "person")
@Validated//开启数据验证
public class Person {
    @Email(message = "这是验证数据是不是邮箱形式")
    private String name;
}

两个类型配置文件小结

  • properties 是以 key=value 的形式配置的键值类型的配置文件,而 yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用“: ”英文冒号加空格的方式设置,并且空格不可省略。
  • properties 为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。
  • yml 通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使用一份配置文件作为 Java 和 Go 的共同配置文件。
  • yml 虽然可以和 properties 共存,但一个项目中建议使用统一的配置类型文件

多环境配置和配置切换

配置文件加载位置

外部加载配置文件的方式十分多,我们选择最常用的即可,在开发的资源文件中进行配置!

官方外部配置文件说明参考文档

image-20230214024353554

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:

优先级1:项目路径下的config文件夹配置文件优先级
优先级2:项目路径下配置文件优先级
优先级3:资源路径下的config文件夹配置文件优先级
优先级4:资源路径下配置文件

image-20230214024817036

优先级由高到底,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部

加载主配置文件;互补配置;

多环境切换

  • profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;

多配置文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;

例如:

  1. application-test.properties 代表测试环境配置
  2. application-dev.properties 代表开发环境配置

但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;

我们需要通过一个配置来选择需要激活的环境:

#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;
#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
spring.profiles.active=dev

yaml的多文档块

和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !

spring:
  profiles:
    active: dev
server:
  port: 8081
---
server:
  port: 8082
Spring:
  profiles: dev #命名

---
server:
  port: 8083

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

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

相关文章

深度使用国产Bg-Tinkle数据库客户端—太赞了,居然还集成chatGPT AI生成SQL

软件概述数据库客户端软件是一种用于连接、管理和操作数据库的软件。它通常与数据库管理系统&#xff08;DBMS&#xff09;配合使用&#xff0c;允许用户在其上执行SQL 语句、浏览数据库中的数据、执行备份和恢复操作以及执行其他管理任务。常见的数据库客户端软件包括 MySQL W…

攻防世界-Confusion1

题目 访问题目场景 某天&#xff0c;Bob说&#xff1a;PHP是最好的语言&#xff0c;但是Alice不赞同。所以Alice编写了这个网站证明。在她还没有写完的时候&#xff0c;我发现其存在问题。(请不要使用扫描器) 然后结合图片我们知道&#xff0c;这个网址是python写的&#xff0…

有序表(上)

文章目录1、引入2、左旋和右旋3、AVL树3.1 AVL 树的平衡条件3.2 搜索二叉树如何删除节点3.3 AVL树的平衡性被破坏的四种类型3.4 AVL 树平衡性如何检查&#xff1f;如何调整失衡&#xff1f;3.4.1 AVL树新增节点如何检查树的平衡性&#xff1f;3.4.2 AVL树删除节点如何检查树的平…

学习笔记:Java 并发编程⑥_并发工具_JUC

若文章内容或图片失效&#xff0c;请留言反馈。 部分素材来自网络&#xff0c;若不小心影响到您的利益&#xff0c;请联系博主删除。 视频链接&#xff1a;https://www.bilibili.com/video/av81461839配套资料&#xff1a;https://pan.baidu.com/s/1lSDty6-hzCWTXFYuqThRPw&am…

4. 寻找两个正序数组的中位数(数组)

文章目录题目描述方法一,重组排序方法二,调用系统函数题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#…

最全面的SpringBoot教程(五)——整合框架

前言 本文为 最全面的SpringBoot教程&#xff08;五&#xff09;——整合框架 相关知识&#xff0c;下边将对SpringBoot整合Junit&#xff0c;SpringBoot整合Mybatis&#xff0c;SpringBoot整合Redis等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &…

回归预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出

回归预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出 目录回归预测 | MATLAB实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出预测效果基本介绍程序设计参考资料预测效果 基本介绍 Matlab实现NGO-LSTM北方苍鹰算法优化长短期记忆网络多输入单输出…

聚观早报 |阿里清空印度支付宝Paytm股票;Meta终于成功收购Within

今日要闻&#xff1a;全球多所学校禁止学生使用ChatGPT&#xff1b;阿里清空印度支付宝Paytm股票&#xff1b;Meta终于成功收购Within&#xff1b;极氪完成 7.5 亿美元 A 轮融资&#xff1b;现代汽车在美电动汽车销量突破10万全球多所学校禁止学生使用ChatGPT 2月12日消息&…

关于北京君正:带ANC的2K网络摄像头用户案例

如果远程办公是您的未来&#xff0c;或者您经常通过视频通话与远方的朋友和亲戚交谈&#xff0c;那么您可以考虑购买网络摄像头以显著改善您的沟通。Anker PowerConf C200是个不错的选择。 Anker PowerConf C200专为个人工作空间而设计&#xff0c;能够以每秒30帧的速度拍摄2K…

Python图像卡通化animegan2-pytorch实例演示

先看下效果图&#xff1a; 左边是原图&#xff0c;右边是处理后的图片&#xff0c;使用的 face_paint_512_v2 模型。 项目获取&#xff1a; animegan2-pytorch 下载解压后 cmd 可进入项目地址的命令界面。 其中 img 是我自己建的&#xff0c;用于存放图片。 需要 torch 版本 …

【Selenium学习】Selenium 中常用的基本方法

1&#xff0e;send_keys 方法模拟键盘键入此方法类似于模拟键盘键入。以在百度首页搜索框输入“Selenium”为例&#xff0c;代码如下&#xff1a;# _*_ coding:utf-8 _*_ """ name:zhangxingzai date:2023/2/13 form:《Selenium 3Python 3自动化测试项目实战》 …

React Native(一)

移动端触摸事件example1:<ButtononPress{() > {Alert.alert(你点击了按钮&#xff01;);}}title"点我&#xff01;" />Touchable 系列组件TouchableHighlight 此组件的背景会在用户手指按下时变暗TouchableNativeFeedback 会在用户手指按下时形成类似墨水涟…

Java基础常见面试题(四)

反射 什么是反射&#xff1f; 反射是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称为 Jav…

大数据技术架构(组件)34——Spark:Spark SQL--Optimize

2.2.3、Optimize2.2.3.1、SQL3.3.1.1、RB1、Join选择在Hadoop中&#xff0c;MR使用DistributedCache来实现mapJoin。即将小文件存放到DistributedCache中&#xff0c;然后分发到各个Task上&#xff0c;并加载到内存中&#xff0c;类似于Map结构&#xff0c;然后借助于Mapper的迭…

【半监督医学图像分割 2021 CVPR】CVRL

文章目录【半监督医学图像分割 2021 CVPR】CVRL摘要1. 介绍1.1 总览1.2 无监督对比学习2. 实验3. 总结【半监督医学图像分割 2021 CVPR】CVRL 论文题目&#xff1a;Momentum Contrastive Voxel-wise Representation Learning for Semi-supervised Volumetric Medical Image Seg…

ThinkPHP多语言模块文件包含RCE复现详细教程

免责声明 本文章只用于技术交流&#xff0c;若使用本文章提供的技术信息进行非法操作&#xff0c;后果均由使用者本人负责。 漏洞描述&#xff1a; ThinkPHP在开启多语言功能的情况下存在文件包含漏洞&#xff0c;攻击者可以通过get、header、cookie等位置传入参数&#xff…

Transformer机制学习笔记

学习自https://www.bilibili.com/video/BV1J441137V6 RNN&#xff0c;CNN网络的缺点 难以平行化处理&#xff0c;比如我们要算b4b^4b4&#xff0c;我们需要一次将a1a^1a1~a4a^4a4依次进行放入网络中进行计算。 于是有人提出用CNN代替RNN 三角形表示输入&#xff0c;b1b^1b1的…

【数据结构】算法的复杂度分析:让你拥有未卜先知的能力

&#x1f451;专栏内容&#xff1a;数据结构⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 文章目录一、前言二、时间复杂度1、定义2、大O的渐进表示法3、常见的时间复杂度三、空间复杂度1、定义2、常见的空间复杂度一、前…

微信小程序删除list指定列表项

一、删除效果展示&#xff1a; // 重要代码片段async deleteListItem(e) {const sureResult await wx.showModal({title: "提示",content: "确定要删除这项吗",});if (sureResult.confirm) {const { index } e.currentTarget.dataset;setTimeout(()>{…

Centos7安装kvm WEB管理工具kimchi

参考&#xff1a;虚拟化技术之kvm WEB管理工具kimchi一、kimchi安装1.1 下载wok安装包和kimchi安装包# 1. wok下载地址&#xff1a; wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/wok-2.5.0-0.el7.centos.noarch.rpm # 2. kimchi下载地址&#xff1…