SpringBoot篇(运维实用篇 - 临时属性)

目录

一、临时属性设置

[1. 简介](#1. 简介)

[2. 属性加载优先级](#2. 属性加载优先级)

那是否还有其他的配置方式呢?

[3. 知识小结](#3. 知识小结)

二、开发环境中使用临时属性

[1. 如何操作](#1. 如何操作)

[2. 知识小结](#2. 知识小结)

[3. 思考](#3. 思考)

三、配置文件分类

[1. 简介](#1. 简介)

[2. 4个级别](#2. 4个级别)

[3. 为什么设计多种配置文件?](#3. 为什么设计多种配置文件?)

一个典型的应用

级别1和2什么时候使用呢?

[4. 知识小结](#4. 知识小结)

四、自定义配置文件

[1. 代码位置](#1. 代码位置)

[2. 如何自定义配置文件](#2. 如何自定义配置文件)

[3. 自定义配置文件](#3. 自定义配置文件)

[3.1. 两种方式](#3.1. 两种方式)

方式一:使用临时属性设置配置文件名

方式二:使用临时属性设置配置文件路径

[3.2 可以设置加载多个配置文件](#3.2 可以设置加载多个配置文件)

[3.3 温馨提示](#3.3 温馨提示)

[3.4 知识小结](#3.4 知识小结)


一、临时属性设置

1. 简介

目前我们的程序包打好了,可以发布了。

但是程序包打好以后,里面的配置都已经是固定的了,比如配置了服务器的端口是8080。

如果我要启动项目,发现当前我的服务器上已经有应用启动起来并且占用了8080端口,这个时候就尴尬了。

难道要重新把打包好的程序修改一下吗?比如我要把打包好的程序启动端口改成80。

SpringBoot提供了灵活的配置方式,如果你发现你的项目中有个别属性需要重新配置,可以使用临时属性的方式

快速修改某些配置。

方法也特别简单,在启动的时候添加上对应参数就可以了。

java --jar springboot.jar --server.port=80

上面的命令是启动SpringBoot程序包的命令,在命令输入完毕后,空一格,然后输入两个-号。

下面按照属性名=属性值的形式添加对应参数就可以了。

记得,这里的格式不是yaml中的书写格式,当属性存在多级名称时,中间使用点分隔,和properties文件中的属

性格式完全相同。

如果你发现要修改的属性不止一个,可以按照上述格式继续写,属性与属性之间使用空格分隔。

java --jar springboot.jar --server.port=80 --logging.level.root=debug

2. 属性加载优先级

现在我们的程序配置受两个地方控制了,第一配置文件,第二临时属性。

并且我们发现临时属性的加载优先级要高于配置文件的。

那是否还有其他的配置方式呢?

其实是有的,而且还不少,打开官方文档中对应的内容,就可以查看配置读取的优先顺序。

地址奉上:

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

我们可以看到,居然有14种配置的位置,而我们现在使用的是这里面的2个。

第3条Config data说的就是使用配置文件,第11条Command line arguments说的就是使用命令行临时参数。

而这14种配置的顺序就是SpringBoot加载配置的顺序,言外之意,命令行临时属性比配置文件的加载优先级高,

所以这个列表上面的优先级低,下面的优先级高。

其实这个东西不用背的,你就记得一点,你最终要什么效果,你自己是知道的,不管这个顺序是怎么个高低排

序,开发时一定要配置成你要的顺序为准。

这个顺序只是在你想不明白问题的时候帮助你分析罢了。

比如你现在加载了一个user.name属性。

结果你发现出来的结果和你想的不一样,那肯定是别的优先级比你高的属性覆盖你的配置属性了,

那你就可以看着这个顺序挨个排查。

哪个位置有可能覆盖了你的属性。

有时时候,我们经常出现属性被覆盖的问题,就是这个原因造成的。

在yaml中配置了user.name属性值,然后读取出来的时候居然不是自己的配置值,

因为在系统属性中有一个属性叫做user.name,两个相互冲突了。

而系统属性的加载优先顺序在上面这个列表中是5号,高于3号,所以SpringBoot最终会加载系统配置属性

user.name

3. 知识小结

  1. 使用jar命令启动SpringBoot工程时可以使用临时属性替换配置文件中的属性
  2. 临时属性添加方式:java --jar 工程名.jar ---属性名=值
  3. 多个临时属性之间使用空格分隔
  4. 临时属性必须是当前boot工程支持的属性,否则设置无效

二、开发环境中使用临时属性

1. 如何操作

临时使用目前是有了,但是上线的时候通过命令行输入的临时属性必须是正确的啊,

那这些属性配置值我们必须在开发环境中测试好才行。

下面说一下开发环境中如何使用临时属性,其实就是Idea界面下如何操作了。

打开SpringBoot引导类的运行界面,在里面找到配置项。

其中Program arguments对应的位置就是添加临时属性的,可以加几个试试效果。

做到这里其实可以产生一个思考了,我们运行main方法的时候,

如果想使用main方法的参数,也就是下面的args参数,就是在上面这个位置添加的参数。

public static void main(String[] args) {
}

原来是这样,通过这个args就可以获取到参数。再来看我们的引导类是如何书写的

public static void main(String[] args) {
    SpringApplication.run(SSMPApplication.class,args);
}

这个args参数居然传递给了run方法,看来在Idea中配置的临时参数就是通过这个位置传递到我们的程序中的。

言外之意,这里如果不用这个args是不是就断开了外部传递临时属性的入口呢?

是这样的,我们可以使用下面的调用方式,这样外部临时属性就无法进入到SpringBoot程序中了。

public static void main(String[] args) {
    SpringApplication.run(SSMPApplication.class);
}

或者还可以使用如下格式来玩这个操作,就是将配置不写在配置文件中,直接写成一个字符串数组,传递给程序入口。

当然,这种做法并没有什么实际开发意义。

public static void main(String[] args) {
    String[] arg = new String[1];
    arg[0] = "--server.port=8082";
    SpringApplication.run(SSMPApplication.class, arg);
}

2. 知识小结

  1. 启动SpringBoot程序时,可以选择是否使用命令行属性为SpringBoot程序传递启动属性

3. 思考

现在使用临时属性可以在启动项目前临时更改配置了,但是新的问题又出来了。

临时属性好用是好用,就是写的多了会很麻烦。

比如我现在有个需求,上线的时候使用临时属性配置20个值,这下可麻烦了,能不能搞得简单点,集中管理一下

呢?比如说搞个文件,加载指定文件?还真可以。怎么做呢?下面将会讲解。、

三、配置文件分类

1. 简介

SpringBoot提供了配置文件和临时属性的方式来对程序进行配置。

前面一直说的是临时属性,这一节要说说配置文件了。

其实这个配置文件我们一直在使用,只不过我们用的是SpringBoot提供的4级配置文件中的其中一个级别。

2. 4个级别

4个级别分别是:

  1. 类路径下配置文件(一直使用的是这个,也就是resources目录中的application.yml文件)
  2. 类路径下config目录下配置文件
  3. 程序包所在目录中配置文件
  4. 程序包所在目录中config目录下配置文件

上述4种文件是提供给你了4种配置文件书写的位置,功能都是一样的,都是做配置的。

差别就是因为位置不同,产生了差异。

总体上来说,4种配置文件如果都存在的话,有一个优先级的问题,说白了就是加入4个文件我都有,

里面都有一样的配置,谁生效的问题。上面4个文件的加载优先顺序为

  1. file :config/application.yml 【最高】
  2. file :application.yml
  3. classpath:config/application.yml
  4. classpath:application.yml 【最低】

3. 为什么设计多种配置文件?

一个典型的应用

场景A:你作为一个开发者,你做程序的时候为了方便自己写代码,配置的数据库肯定是连接你自己本机的,

咱们使用4这个级别,也就是之前一直用的application.yml。

场景B:现在项目开发到了一个阶段,要联调测试了,连接的数据库是测试服务器的数据库,肯定要换一组配置

吧。你可以选择把你之前的文件中的内容都改了,目前还不麻烦。

场景C:测试完了,一切OK。你继续写你的代码,你发现你原来写的配置文件被改成测试服务器的内容了,你要

再改回来。

现在明白了不?场景B中把你的内容都改掉了,你现在要重新改回来,以后呢?改来改去吗?

解决方案很简单,用上面的3这个级别的配置文件就可以快速解决这个问题,再写一个配置就行了。

两个配置文件共存,因为config目录中的配置加载优先级比你的高,

所以配置项如果和级别4里面的内容相同就覆盖了,这样是不是很简单?

级别1和2什么时候使用呢?

程序打包以后就要用这个级别了,管你程序里面配置写的是什么?

我的级别高,可以轻松覆盖你,就不用考虑这些配置冲突的问题了。

4. 知识小结

  1. 配置文件分为4种
    • 项目类路径配置文件:服务于开发人员本机开发与测试
    • 项目类路径config目录中配置文件:服务于项目经理整体调控
    • 工程路径配置文件:服务于运维人员配置涉密线上环境
    • 工程路径config目录中配置文件:服务于运维经理整体调控
  1. 多层级配置文件间的属性采用叠加并覆盖的形式作用于程序

四、自定义配置文件

1. 代码位置

2. 如何自定义配置文件

之前咱们做配置使用的配置文件都是application.yml,其实这个文件也是可以改名字的,这样方便维护。

比如我2023年4月1日搞活动,走了一组配置,2023年5月1日活动取消,恢复原始配置,这个时候只需要重新更

换一下配置文件就可以了但是你总不能在原始配置文件上修改吧,不然搞完活动以后,活动的配置就留不下来

了,不利于维护。

这样就需要我们自定义配置文件

3. 自定义配置文件

3.1. 两种方式

方式一:使用临时属性设置配置文件名

方式一:使用临时属性设置配置文件名,注意仅仅是名称,不要带扩展名

方式二:使用临时属性设置配置文件路径

方式二:使用临时属性设置配置文件路径,这个是全路径名

3.2 可以设置加载多个配置文件

可以设置加载多个配置文件

使用的属性一个是spring.config.name,另一个是spring.config.location,这个一定要区别清楚。

3.3 温馨提示

我们现在研究的都是SpringBoot单体项目,就是单服务器版本。

其实企业开发现在更多的是使用基于SpringCloud技术的多服务器项目。

这种配置方式和我们现在学习的完全不一样,所有的服务器将不再设置自己的配置文件,

而是通过配置中心获取配置,动态加载配置信息。

为什么这样做?

答案:集中管理

3.4 知识小结

  1. 配置文件可以修改名称,通过启动参数设定
  2. 配置文件可以修改路径,通过启动参数设定
  3. 微服务开发中配置文件通过配置中心进行设置
相关推荐
大熊程序猿1 小时前
ubuntu 安装k3s
linux·运维·ubuntu
luoqice1 小时前
CentOS 自启动某个应用
linux·运维·服务器
Hadoop_Liang1 小时前
Docker Compose一键部署Spring Boot + Vue项目
vue.js·spring boot·docker
Ellie陈1 小时前
Java已死,大模型才是未来?
java·开发语言·前端·后端·python
泠山1 小时前
ubuntu增加swap交换空间
linux·运维·ubuntu
JavaOpsPro2 小时前
jenkins部署手册
运维·jenkins·离线部署
阿乾之铭2 小时前
Spring Boot框架中的IO
java·spring boot·log4j·1024程序员节
速盾cdn2 小时前
速盾:什么是高防CDN?高防CDN的用处有哪些?
运维·服务器·网络·web安全
2401_857600952 小时前
商场应急管理:SpringBoot技术解决方案
java·spring boot·后端