之前学的时候后草草过去了,但是工作一段时间后发现经常和它打交道,之前学的也没有做笔记
springboot中默认的配置文件是application.properties,但是我们一般不使用这种,我们一般使用application.yaml文件
application.properties 和 yml 文件在并存时(同一目录下),application.properties 优先级更好,会先读它,若它没有,再去读 yml 中的值
Springboot官方文档
选择一个合适的版本,查看文档
从中间划线的地方开始,上面是文档,下面是附录
附录中的第一个信息就是Application Properties
下面就是所有的配置了
配置文件支持如下三种
三种文件的配置优先级:properties>yml>yaml
不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
下图所示,就是banner
当我在文件中输入banner
时,会出来如下的配置
image:banner可以用一个图片
image.location:设定图片的位置
会有如下三个参数
log:记录到日志里面
console:打印到控制台里面
off:关闭
如下图,日志相关的配置
比如说日志的根路径的设置级别
将日志级别设置成debug,我们一般是info
logging:
level:
root: debug
logging:
level:
root: info
配置端口号
server:
port: 8001
配置项目名称
#项目的访问路径
server:
servlet:
context-path: /warehouse
假如说把配置文件中下面的坐标注释掉,上面的两个配置不会生效,因为我们用什么技术,就在配置文件中配置什么,不是乱配置的
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
原因:springboot在idea环境下提供的功能失效了。提示的功能是IDEA带来的不是Springboot带来的
解决方案
步骤一
步骤二
步骤三
如果有的话在这个地方勾选上就行
与Yaml文件差不多,只不过语法不通,properties优先级高一点,因为我主要使用yaml文件,所以这个文件就不介绍了
临时属性必须是当前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)
发现命令行的优先级顺序要比配置文件的高
怎么在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);
}
}
上线时的配置和研发时的配置大相径庭,我们不能完全依靠临时命令来解决此问题
Springboot为我们提供了一套机制,在现有的配置上再做一套配置
在resource目录下创建一个全新的config目录,将配置文件粘贴到里面去。
此时config目录下有一个application.yml文件,与config目录同级有一个application.yml文件
config目录下的文件的配置如下所示
server:
port: 8083 #服务端口
config目录同级文件的配置
server:
port: 8090 #服务端口
假如说两个配置文件中有冲突怎么办?
如果两个配置文件中对同一个配置进行了配置,采用优先级高的
你配的我没配,沿用下来,我配的你没配,沿用下来
我们在开发中会有需要的密码,比如数据库密码,这些是很重要的,一般客户不会给我们,这怎么办呢?
将jar包和配置文件放到一起
假如说这个配置文件中配置的端口号是82
java -jar jar包名.jar
启动后观察端口号,发现是82
这个文件会覆盖开发时的配置文件
此处的application的文件一般是运维人员使用
但是运维人员上面还有一个BOOS
对于运维人员的BOOS,会采用下面的方式
在jar包同级处添加一个config目录,在此目录下放置一个application文件夹
此文件下的端口号是8888
1级2级都是在jar包外的,3级4级是在jar包内的
项目类路径配置文件:服务于开发人员本机开发与测试
项目类路径config目录中配置文件: 服务于项目经理整体调控
工程路径配置文件:服务于运维人员配置涉密线上环境
工程路径config目录中配置文件: 服务于运维经理整体调控
配置文件可以修改名称,通过启动参数设定
配置文件可以修改路径,通过启动参数设定
微服务开发中配置文件通过配置中心进行设置
我们的配置文件一般是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文件
SpringBoot在开发和运行环境均支持使用临时参数修改工程配置
Springboot支持4级配置文件,应用于开发与线上环境进行配置的灵活设置
Springboot支持使用自定义配置文件的形式修改配置文件存储位置
基于微服务开发时配置文件将使用配置中心进行管理
每个环境对应的配置都是有点区别的。
多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
yaml格式中设置多环境使用**—区分环境设置边界**
每种环境的区别在于加载的配置属性不同
启用某种环境时需要指定启动时使用该环境
# 应用环境(使用哪个环境)
# 默认加载的环境,我们在这里会设置一些公共的配置(三种环境都具有的)
spring:
profiles:
active: pro
---
# 设置环境
# 生产环境
spring:
profiles: pro
server:
port: 801
# 如果多个环境,怎么把多个环境区分开? --- 三个减号即可
---
# 开发环境
spring:
profiles: dev
server:
port: 802
---
# 测试环境
spring:
profiles: test
server:
port: 803
根据上面的配置,进行启动程序,控制台信息如下所示:运行环境是pro,端口号是801
假设将注释掉,会有什么效果呢?
spring:
profiles:
active: pro
采用了默认的8080端口
如下图所示四个配置文件,配置文件中的内容与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
假如说多环境下MySQL数据库一致,那就写在application.yaml文件中,如果不一致的话,就分别写在application-环境.yaml中即可,以此来区别
根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下:
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
spring:
profiles:
active: dev
include: 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.Driver
url: jdbc:mysql://localhost:3306/payment_demo?serverTimezone=GMT%2B8&characterEncoding=utf-8
username: root
password: root
运行项目
端口改了
但是context path 没有改,还是为空,说明application-devMVC.yml配置文件没有生效,原因是并没有在application.yaml文件中说加载application-devMVC.yml文件
正确的方式
spring:
profiles:
active: dev
include: devMVC,devDB
再运行一下项目,发现成功了
然后我们发现The following profiles are active: devMVC,devDB,dev
里有一个顺序的问题,后加载的会覆盖先加载的,比如devDB中和dev中有不同配置,那dev配置文件中的配置会将DevDB文件中的配置覆盖
假如说我们将环境变成pro后,include中对应的也要变,这样之后每次都要改,非常的麻烦,这种格式并不适用于我们现在的这种开发
spring:
profiles:
active: pro
include: proMVC,proDB
多环境开发使用group属性设置配置文件分组,便于线上维护管理
像这种开发要怎么做?
Springboot2.4版本之后include属性不用了,换成了group属性
如下所示,当我们启动dev后,其实是启动的dev这个组“devMVC,devDB”
spring:
profiles:
active: dev
group:
"dev": devDB,devMVC
"pro": proDB,proMVC
启动后,“dev,devDB,devMVC”
注意!我们之前方式启动的时候,顺序是devDB,devMVC,dev。
而现在是dev,devDB,devMVC
说明dev配置文件已经不是主配置文件了
假如说dev,devDB,devMVC同时配置了不同的端口号,最终devMVC会生效
多环境开发控制不仅Springboot有,maven也有(只要与构建有关的工具,它都会有多环境的设定)
假如在maven中设置的是生产环境,在springboot中设置的是开发环境,哪一个会有效?她俩冲突了怎么办?springboot依赖maven运行还是maven依赖Springboot运行?
解释:springboot工作时是基于maven坐标的配置进行工作的,所以maven一定是在前运行,springboot是在后运行。
如果maven与springboot都配置环境的话,maven是首个配置,springboot的配置是辅助作用的
主配maven,让springboot读取maven的配置
application.yaml文件如下所示
spring:
profiles:
active: dev
group:
"dev": devDB,devMVC
"pro": devDB,proMVC
首先使用maven工具clean一下,将target包清楚掉,之后运行程序
之后在pom.xml文件中配置多环境开发
<profiles>
<profile>
<id>env_devid>
<properties>
<profile.active>devprofile.active>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
<profile>
<id>env_proid>
<properties>
<profile.active>proprofile.active>
properties>
profile>
profiles>
之后我们要在application中读取profile.active的值,怎么读?
spring:
profiles:
active: @profile.active@
group:
"dev": devDB,devMVC
"pro": proDB,proMVC
@…@占位符读取maven对应配置属性值
查看application中 active 对应的值,如下图所示:
加入将下面的语句在dev中删除,将其加入到pro中,会有什么现象?
<activeByDefault>trueactiveByDefault>
我们这样打包之后,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>trueactiveByDefault>
[外链图片转存中…(img-bH7vhofg-1695865512130)]
我们这样打包之后,jar包里已经沿用了maven的设置,springboot与maven的环境就统一了
有时候我们在pom文件中将dev改成pro的,启动时还是会显示dev,此时clean之后在启动,还是显示dev,但是pom配置文件中已经是pro了,这是怎么回事?
这是idea的一个bug。那怎么让pro生效呢?
执行一下compile手动编译,重新加载pom里面的属性重新来一轮,再执行程序,这个时候就变成pro了