文章目录
- 配置文件
- 一、Yaml 文件
- 1.1 修改banner
- 1.2 日志
- 1.3 端口
- 1.4 属性提示消失解决方案
- 二、Properties 文件
- 三、配置高级
- 3.1 临时属性
- 3.2 临时属性(开发环境)
- 3.3 配置文件四级分类
- 3.3.1 原始配置文件(四级)
- 3.3.2 config目录下的配置文件(三级)
- 3.3.3 工程目录同级下的配置文件(二级)
- 3.3.4 jar包路同路径下config(一级)
- 3.3.5 总结四级
- 3.4 自定义配置文件
- 3.4.1 重要说明
- 3.5 多环境开发(yaml)
- 3.5.1 多环境开发(一个文件版本)
- 3.5.2 多环境开发(多文件版本)
- 3.5.3 多环境开发配置文件书写技巧
- 3.5.4 多环境分组管理
- 3.5.4.1 include 属性
- 3.5.4.2 group属性
- 3.6 多环境开发控制
- 3.6.1 Maven与Springboot多环境兼容
配置文件
之前学的时候后草草过去了,但是工作一段时间后发现经常和它打交道,之前学的也没有做笔记
springboot中默认的配置文件是application.properties,但是我们一般不使用这种,我们一般使用application.yaml文件
application.properties 和 yml 文件在并存时(同一目录下),application.properties 优先级更好,会先读它,若它没有,再去读 yml 中的值
Springboot官方文档
选择一个合适的版本,查看文档
从中间划线的地方开始,上面是文档,下面是附录
附录中的第一个信息就是Application Properties
下面就是所有的配置了
配置文件支持如下三种
三种文件的配置优先级:properties>yml>yaml
不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
一、Yaml 文件
1.1 修改banner
下图所示,就是banner
当我在文件中输入banner
时,会出来如下的配置
image:banner可以用一个图片
image.location:设定图片的位置
会有如下三个参数
log:记录到日志里面
console:打印到控制台里面
off:关闭
1.2 日志
如下图,日志相关的配置
比如说日志的根路径的设置级别
将日志级别设置成debug,我们一般是info
logging:level:root: debug
logging:level:root: info
1.3 端口
配置端口号
server:port: 8001
配置项目名称
#项目的访问路径
server:servlet:context-path: /warehouse
假如说把配置文件中下面的坐标注释掉,上面的两个配置不会生效,因为我们用什么技术,就在配置文件中配置什么,不是乱配置的
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.4 属性提示消失解决方案
原因:springboot在idea环境下提供的功能失效了。提示的功能是IDEA带来的不是Springboot带来的
解决方案
步骤一
步骤二
步骤三
如果有的话在这个地方勾选上就行
二、Properties 文件
与Yaml文件差不多,只不过语法不通,properties优先级高一点,因为我主要使用yaml文件,所以这个文件就不介绍了
三、配置高级
3.1 临时属性
临时属性必须是当前boot工程支持的属性,否则设置无效
我们在服务器启动jar包时,发现80端口冲突,但是我们又不能改application.yaml配置文件,此时怎么办?
java -jar jarPackageName.jar --server.port=8080
如果要配置多个临时属性呢? "空格"后加即可
java -jar jarPackageName.jar --server.port=8080 --spring.datasource.druid.password=root
命令行中的属性把配置中的属性覆盖掉了,那优先级是怎么回事呢?
核心功能 (spring.io)
发现命令行的优先级顺序要比配置文件的高
3.2 临时属性(开发环境)
怎么在idea中测试临时属性?
在如下所示的地方添加参数即可
假设没有“Program arguments”的话,可以按照下面的步骤添加
配置完上面后添加临时参数 “–server.port=8999”
如下图所示,成功修改端口为8999
关注一下启动类,args参数和Program arguments有关系吗?
有关系!
@SpringBootApplication
public class PaymentDemoApplication {public static void main(String[] args) {SpringApplication.run(PaymentDemoApplication.class, args);}}
我们打印一下
不携带参数启动程序,如下所示,不传入args参数了
目的:安全性
@SpringBootApplication
public class PaymentDemoApplication {public static void main(String[] args) {SpringApplication.run(PaymentDemoApplication.class);}}
3.3 配置文件四级分类
3.3.1 原始配置文件(四级)
3.3.2 config目录下的配置文件(三级)
上线时的配置和研发时的配置大相径庭,我们不能完全依靠临时命令来解决此问题
Springboot为我们提供了一套机制,在现有的配置上再做一套配置
-
在resource目录下创建一个全新的config目录,将配置文件粘贴到里面去。
此时config目录下有一个application.yml文件,与config目录同级有一个application.yml文件
config目录下的文件的配置如下所示
server:port: 8083 #服务端口
config目录同级文件的配置
server:port: 8090 #服务端口
-
启动项目。端口号为8083,
-
所以对于配置文件,一个提供给程序员,另一个提供给项目负责人做项目的总控
假如说两个配置文件中有冲突怎么办?
-
如果两个配置文件中对同一个配置进行了配置,采用优先级高的
-
你配的我没配,沿用下来,我配的你没配,沿用下来
3.3.3 工程目录同级下的配置文件(二级)
我们在开发中会有需要的密码,比如数据库密码,这些是很重要的,一般客户不会给我们,这怎么办呢?
-
将jar包和配置文件放到一起
假如说这个配置文件中配置的端口号是82
- 输入命令
java -jar jar包名.jar
启动后观察端口号,发现是82
这个文件会覆盖开发时的配置文件
此处的application的文件一般是运维人员使用
但是运维人员上面还有一个BOOS
3.3.4 jar包路同路径下config(一级)
对于运维人员的BOOS,会采用下面的方式
在jar包同级处添加一个config目录,在此目录下放置一个application文件夹
此文件下的端口号是8888
3.3.5 总结四级
1级2级都是在jar包外的,3级4级是在jar包内的
项目类路径配置文件:服务于开发人员本机开发与测试
项目类路径config目录中配置文件: 服务于项目经理整体调控
工程路径配置文件:服务于运维人员配置涉密线上环境
工程路径config目录中配置文件: 服务于运维经理整体调控
- 1级与2级留做系统打包后设置通用属性,1级常用于运维经理进行线上整体项目部署方案调控
- 3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控
3.4 自定义配置文件
配置文件可以修改名称,通过启动参数设定
配置文件可以修改路径,通过启动参数设定
微服务开发中配置文件通过配置中心进行设置
我们的配置文件一般是application.yaml或者application.yml或者application.properties,叫其他的名字可以吗?
如果我们想加载ebank.properties文件怎么办?
第一种办法
指定文件名
第二种办法
根据文件路径寻找。绝对路径与相对路径均可
如果是两个文件呢?
ebank.yaml配置的端口号是84,ebank-server.yaml配置的端口号是85
当我们启动程序后,运行端口号是85,即ebank.yaml配置文件中配置的端口生效了
将ebank-server.yaml配置在前会发生什么?
此时启动的是84端口,即ebank-server.yaml文件
3.4.1 重要说明
- 单服务器项目:使用自定义配置文件需求低
- 对服务器项目:使用自定义配置文件需要较高,将所有配置放在一个目录中,统一管理
- 基于SpringCloud技术,将所有的服务器将不再设置配置文件,而是通过配置中心进行设定,动态加载配置信息
-
SpringBoot在开发和运行环境均支持使用临时参数修改工程配置
-
Springboot支持4级配置文件,应用于开发与线上环境进行配置的灵活设置
-
Springboot支持使用自定义配置文件的形式修改配置文件存储位置
-
基于微服务开发时配置文件将使用配置中心进行管理
3.5 多环境开发(yaml)
每个环境对应的配置都是有点区别的。
-
多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
-
yaml格式中设置多环境使用**—区分环境设置边界**
-
每种环境的区别在于加载的配置属性不同
-
启用某种环境时需要指定启动时使用该环境
3.5.1 多环境开发(一个文件版本)
# 应用环境(使用哪个环境)
# 默认加载的环境,我们在这里会设置一些公共的配置(三种环境都具有的)
spring:profiles:active: pro---
# 设置环境
# 生产环境
spring:profiles: proserver:port: 801
# 如果多个环境,怎么把多个环境区分开? --- 三个减号即可---
# 开发环境
spring:profiles: devserver:port: 802---
# 测试环境
spring:profiles: testserver:port: 803
根据上面的配置,进行启动程序,控制台信息如下所示:运行环境是pro,端口号是801
假设将注释掉,会有什么效果呢?
spring:profiles:active: pro
采用了默认的8080端口
3.5.2 多环境开发(多文件版本)
如下图所示四个配置文件,配置文件中的内容与3.4.1中环境对应(只不过将—替换成了文件而已)
application.yml
server:port: 8090 #服务端口# 指定环境
spring:profiles:active: dev
application-dev.yml
server:port: 802 #服务端口
application-prod.yml
server:port: 801
application-test.yml
server:port: 803
运行之后如下图所示
为配置文件起名时:application-环境.yml
3.5.3 多环境开发配置文件书写技巧
- 主配置文件设置公共配置(全局)
- 环境分类配置文件中常用于设置冲突属性(局部)
假如说多环境下MySQL数据库一致,那就写在application.yaml文件中,如果不一致的话,就分别写在application-环境.yaml中即可,以此来区别
3.5.4 多环境分组管理
根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下:
- application-devDB.yml
- application-devRedis.yaml
- application-devMVC.yml
3.5.4.1 include 属性
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring:profiles:active: devinclude: devDB,devRedis,devMVC
展示如下
application.yml文件
spring:profiles:active: dev
application-dev.yml
server:port: 81 #服务端口
application-devMVC.yml
server:servlet:context-path: /ebank
application-devDB.yml
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/payment_demo?serverTimezone=GMT%2B8&characterEncoding=utf-8username: rootpassword: root
运行项目
端口改了
但是context path 没有改,还是为空,说明application-devMVC.yml配置文件没有生效,原因是并没有在application.yaml文件中说加载application-devMVC.yml文件
正确的方式
spring:profiles:active: devinclude: devMVC,devDB
再运行一下项目,发现成功了
然后我们发现The following profiles are active: devMVC,devDB,dev
里有一个顺序的问题,后加载的会覆盖先加载的,比如devDB中和dev中有不同配置,那dev配置文件中的配置会将DevDB文件中的配置覆盖
假如说我们将环境变成pro后,include中对应的也要变,这样之后每次都要改,非常的麻烦,这种格式并不适用于我们现在的这种开发
spring:profiles:active: proinclude: proMVC,proDB
3.5.4.2 group属性
多环境开发使用group属性设置配置文件分组,便于线上维护管理
像这种开发要怎么做?
Springboot2.4版本之后include属性不用了,换成了group属性
如下所示,当我们启动dev后,其实是启动的dev这个组“devMVC,devDB”
spring:profiles:active: devgroup:"dev": devDB,devMVC"pro": proDB,proMVC
启动后,“dev,devDB,devMVC”
注意!我们之前方式启动的时候,顺序是devDB,devMVC,dev。
而现在是dev,devDB,devMVC
说明dev配置文件已经不是主配置文件了
假如说dev,devDB,devMVC同时配置了不同的端口号,最终devMVC会生效
3.6 多环境开发控制
3.6.1 Maven与Springboot多环境兼容
多环境开发控制不仅Springboot有,maven也有(只要与构建有关的工具,它都会有多环境的设定)
假如在maven中设置的是生产环境,在springboot中设置的是开发环境,哪一个会有效?她俩冲突了怎么办?springboot依赖maven运行还是maven依赖Springboot运行?
解释:springboot工作时是基于maven坐标的配置进行工作的,所以maven一定是在前运行,springboot是在后运行。
如果maven与springboot都配置环境的话,maven是首个配置,springboot的配置是辅助作用的
主配maven,让springboot读取maven的配置
application.yaml文件如下所示
spring:profiles:active: devgroup:"dev": devDB,devMVC"pro": devDB,proMVC
首先使用maven工具clean一下,将target包清楚掉,之后运行程序
之后在pom.xml文件中配置多环境开发
<!--设置多环境开发-->
<profiles><!--配置环境--><profile><id>env_dev</id><properties><!--这个地方的profile.active是自己定义的,叫abc都行--><profile.active>dev</profile.active></properties><!--设定哪个环境生效--><activation><!--是否默认启动--><activeByDefault>true</activeByDefault></activation></profile><!--配置环境--><profile><id>env_pro</id><properties><!--这个地方的profile.active是自己定义的,叫abc都行--><profile.active>pro</profile.active></properties></profile></profiles>
之后我们要在application中读取profile.active的值,怎么读?
spring:profiles:active: @profile.active@group:"dev": devDB,devMVC"pro": proDB,proMVC
@…@占位符读取maven对应配置属性值
完成后直接package 进行打包
查看application中 active 对应的值,如下图所示:
加入将下面的语句在dev中删除,将其加入到pro中,会有什么现象?
<activeByDefault>true</activeByDefault>
我们这样打包之后,jar包里已经沿用了maven的设置,springboot与maven的环境就统一了
有时候我们在pom文件中将dev改成pro的,启动时还是会显示dev,此时clean之后在启动,还是显示dev,但是pom配置文件中已经是pro了,这是怎么回事?
这是idea的一个bug。那怎么让pro生效呢?
执行一下compile手动编译,重新加载pom里面的属性重新来一轮,再执行程序,这个时候就变成pro了
le.active>
[外链图片转存中…(img-YRBeH4hj-1695865512128)]
之后我们要在application中读取profile.active的值,怎么读?
spring:profiles:active: @profile.active@group:"dev": devDB,devMVC"pro": proDB,proMVC
@…@占位符读取maven对应配置属性值
完成后直接package 进行打包[外链图片转存中…(img-Se7eAcIr-1695865512129)]
查看application中 active 对应的值,如下图所示:
[外链图片转存中…(img-2jSXKmWF-1695865512129)]
加入将下面的语句在dev中删除,将其加入到pro中,会有什么现象?
<activeByDefault>true</activeByDefault>
[外链图片转存中…(img-bH7vhofg-1695865512130)]
我们这样打包之后,jar包里已经沿用了maven的设置,springboot与maven的环境就统一了
有时候我们在pom文件中将dev改成pro的,启动时还是会显示dev,此时clean之后在启动,还是显示dev,但是pom配置文件中已经是pro了,这是怎么回事?
这是idea的一个bug。那怎么让pro生效呢?
执行一下compile手动编译,重新加载pom里面的属性重新来一轮,再执行程序,这个时候就变成pro了