当前位置:   article > 正文

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_springboot yml配置文件

springboot yml配置文件

配置文件

之前学的时候后草草过去了,但是工作一段时间后发现经常和它打交道,之前学的也没有做笔记

springboot中默认的配置文件是application.properties,但是我们一般不使用这种,我们一般使用application.yaml文件

application.properties 和 yml 文件在并存时(同一目录下),application.properties 优先级更好,会先读它,若它没有,再去读 yml 中的值

Springboot官方文档

选择一个合适的版本,查看文档

image-20230908103932431

从中间划线的地方开始,上面是文档,下面是附录

附录中的第一个信息就是Application Properties

image-20230908104208827

下面就是所有的配置了

image-20230908104321746

配置文件支持如下三种

image-20230908135752340

三种文件的配置优先级:properties>yml>yaml

不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

一、Yaml 文件

1.1 修改banner

下图所示,就是banner

image-20230908092616869

当我在文件中输入banner时,会出来如下的配置

image:banner可以用一个图片

image.location:设定图片的位置

image-20230908093011661

会有如下三个参数

log:记录到日志里面

console:打印到控制台里面

off:关闭

image-20230908093308709

1.2 日志

如下图,日志相关的配置

image-20230908094210672

比如说日志的根路径的设置级别

将日志级别设置成debug,我们一般是info

logging:
	level:
	root: debug
  • 1
  • 2
  • 3

image-20230908094950916

logging:
	level:
	root: info
  • 1
  • 2
  • 3

image-20230908095029645

1.3 端口

配置端口号

server:
  port: 8001
  • 1
  • 2

配置项目名称

#项目的访问路径
server:
  servlet:
    context-path: /warehouse
  • 1
  • 2
  • 3
  • 4

假如说把配置文件中下面的坐标注释掉,上面的两个配置不会生效,因为我们用什么技术,就在配置文件中配置什么,不是乱配置的

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4

1.4 属性提示消失解决方案

原因:springboot在idea环境下提供的功能失效了。提示的功能是IDEA带来的不是Springboot带来的

解决方案

步骤一

image-20230908143242913

步骤二

image-20230908143428526

步骤三

image-20230908143531679

如果有的话在这个地方勾选上就行

image-20230908143547965

image-20230908143454807

二、Properties 文件

与Yaml文件差不多,只不过语法不通,properties优先级高一点,因为我主要使用yaml文件,所以这个文件就不介绍了

三、配置高级

3.1 临时属性

临时属性必须是当前boot工程支持的属性,否则设置无效

我们在服务器启动jar包时,发现80端口冲突,但是我们又不能改application.yaml配置文件,此时怎么办?

java -jar jarPackageName.jar --server.port=8080
  • 1

如果要配置多个临时属性呢? "空格"后加即可

java -jar jarPackageName.jar --server.port=8080 --spring.datasource.druid.password=root
  • 1

命令行中的属性把配置中的属性覆盖掉了,那优先级是怎么回事呢?

核心功能 (spring.io)

发现命令行的优先级顺序要比配置文件的高

image-20230908150001828

3.2 临时属性(开发环境)

怎么在idea中测试临时属性?

image-20230908150428280

在如下所示的地方添加参数即可

image-20230908150526112

假设没有“Program arguments”的话,可以按照下面的步骤添加

image-20230908150625989

image-20230908150640710

配置完上面后添加临时参数 “–server.port=8999”

image-20230908150726437

如下图所示,成功修改端口为8999

image-20230908150822911

关注一下启动类,args参数和Program arguments有关系吗?

有关系!

@SpringBootApplication
public class PaymentDemoApplication {

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们打印一下

image-20230908151203919

不携带参数启动程序,如下所示,不传入args参数了

目的:安全性

@SpringBootApplication
public class PaymentDemoApplication {

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.3 配置文件四级分类

3.3.1 原始配置文件(四级)

image-20230908160014890

3.3.2 config目录下的配置文件(三级)

上线时的配置和研发时的配置大相径庭,我们不能完全依靠临时命令来解决此问题

image-20230908151625485

Springboot为我们提供了一套机制,在现有的配置上再做一套配置

  1. 在resource目录下创建一个全新的config目录,将配置文件粘贴到里面去。

    此时config目录下有一个application.yml文件,与config目录同级有一个application.yml文件

image-20230908152005996

​ config目录下的文件的配置如下所示

server:
  port: 8083 #服务端口
  • 1
  • 2

config目录同级文件的配置

server:
  port: 8090 #服务端口
  • 1
  • 2
  1. 启动项目。端口号为8083,

    image-20230908152257933

  2. 所以对于配置文件,一个提供给程序员,另一个提供给项目负责人做项目的总控

假如说两个配置文件中有冲突怎么办

  1. 如果两个配置文件中对同一个配置进行了配置,采用优先级高的

  2. 你配的我没配,沿用下来,我配的你没配,沿用下来

3.3.3 工程目录同级下的配置文件(二级)

我们在开发中会有需要的密码,比如数据库密码,这些是很重要的,一般客户不会给我们,这怎么办呢

  1. 将jar包和配置文件放到一起

    假如说这个配置文件中配置的端口号是82

image-20230908155354818

  1. 输入命令
java -jar jar包名.jar
  • 1

启动后观察端口号,发现是82

image-20230908155748717

这个文件会覆盖开发时的配置文件

此处的application的文件一般是运维人员使用

但是运维人员上面还有一个BOOS

3.3.4 jar包路同路径下config(一级)

对于运维人员的BOOS,会采用下面的方式

在jar包同级处添加一个config目录,在此目录下放置一个application文件夹

image-20230908160901881

此文件下的端口号是8888

image-20230908160936839

3.3.5 总结四级

1级2级都是在jar包外的,3级4级是在jar包内的

image-20230908161746213

项目类路径配置文件:服务于开发人员本机开发与测试

项目类路径config目录中配置文件: 服务于项目经理整体调控

工程路径配置文件:服务于运维人员配置涉密线上环境

工程路径config目录中配置文件: 服务于运维经理整体调控

  • 1级与2级留做系统打包后设置通用属性,1级常用于运维经理进行线上整体项目部署方案调控
  • 3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控

3.4 自定义配置文件

  1. 配置文件可以修改名称,通过启动参数设定

  2. 配置文件可以修改路径,通过启动参数设定

  3. 微服务开发中配置文件通过配置中心进行设置

我们的配置文件一般是application.yaml或者application.yml或者application.properties,叫其他的名字可以吗?

如果我们想加载ebank.properties文件怎么办?

image-20230908214539035

第一种办法

指定文件名

image-20230908214707790

第二种办法

根据文件路径寻找。绝对路径与相对路径均可

image-20230908214834795

如果是两个文件呢

ebank.yaml配置的端口号是84,ebank-server.yaml配置的端口号是85

image-20230909113425333

当我们启动程序后,运行端口号是85,即ebank.yaml配置文件中配置的端口生效了

image-20230909113110316

将ebank-server.yaml配置在前会发生什么

image-20230909113219969

此时启动的是84端口,即ebank-server.yaml文件

image-20230909113251256

3.4.1 重要说明

  • 单服务器项目:使用自定义配置文件需求低
  • 对服务器项目:使用自定义配置文件需要较高,将所有配置放在一个目录中,统一管理
  • 基于SpringCloud技术,将所有的服务器将不再设置配置文件,而是通过配置中心进行设定,动态加载配置信息
  1. SpringBoot在开发和运行环境均支持使用临时参数修改工程配置

  2. Springboot支持4级配置文件,应用于开发与线上环境进行配置的灵活设置

  3. Springboot支持使用自定义配置文件的形式修改配置文件存储位置

  4. 基于微服务开发时配置文件将使用配置中心进行管理

3.5 多环境开发(yaml)

每个环境对应的配置都是有点区别的。

image-20230909115611618

  1. 多环境开发需要设置若干种常用环境,例如开发、生产、测试环境

  2. yaml格式中设置多环境使用**—区分环境设置边界**

  3. 每种环境的区别在于加载的配置属性不同

  4. 启用某种环境时需要指定启动时使用该环境

3.5.1 多环境开发(一个文件版本)

# 应用环境(使用哪个环境)
# 默认加载的环境,我们在这里会设置一些公共的配置(三种环境都具有的)
spring:
  profiles:
    active: pro

---
# 设置环境
# 生产环境
spring:
  profiles: pro

server:
  port: 801
#  如果多个环境,怎么把多个环境区分开?  --- 三个减号即可

---
# 开发环境
spring:
  profiles: dev

server:
  port: 802


---
# 测试环境
spring:
  profiles: test

server:
  port: 803
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

根据上面的配置,进行启动程序,控制台信息如下所示:运行环境是pro,端口号是801

image-20230909121725007

假设将注释掉,会有什么效果呢?

spring:
  profiles:
    active: pro
  • 1
  • 2
  • 3

采用了默认的8080端口

image-20230909122434777

3.5.2 多环境开发(多文件版本)

如下图所示四个配置文件,配置文件中的内容与3.4.1中环境对应(只不过将—替换成了文件而已)

image-20230909141947650

application.yml

server:
  port: 8090 #服务端口
  
# 指定环境  
spring:
   profiles:
     active: dev
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

application-dev.yml

server:
  port: 802 #服务端口
  • 1
  • 2

application-prod.yml

server:
  port: 801
  • 1
  • 2

application-test.yml

server:
  port: 803
  • 1
  • 2

运行之后如下图所示

image-20230909142737138

为配置文件起名时: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: dev
    include: devDB,devRedis,devMVC
  • 1
  • 2
  • 3
  • 4

展示如下

application.yml文件

spring:
  profiles:
    active: dev
  • 1
  • 2
  • 3

application-dev.yml

server:
  port: 81 #服务端口
  • 1
  • 2

application-devMVC.yml

server:
  servlet:
    context-path: /ebank
  • 1
  • 2
  • 3

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行项目

端口改了

image-20230909144903426

但是context path 没有改,还是为空,说明application-devMVC.yml配置文件没有生效,原因是并没有在application.yaml文件中说加载application-devMVC.yml文件

image-20230909145019849

正确的方式

spring:
  profiles:
    active: dev
    include: devMVC,devDB
  • 1
  • 2
  • 3
  • 4

再运行一下项目,发现成功了

image-20230909145420098

image-20230909145446085

然后我们发现The following profiles are active: devMVC,devDB,dev里有一个顺序的问题,后加载的会覆盖先加载的,比如devDB中和dev中有不同配置,那dev配置文件中的配置会将DevDB文件中的配置覆盖

假如说我们将环境变成pro后,include中对应的也要变,这样之后每次都要改,非常的麻烦,这种格式并不适用于我们现在的这种开发

spring:
  profiles:
    active: pro
    include: proMVC,proDB
  • 1
  • 2
  • 3
  • 4
3.5.4.2 group属性

多环境开发使用group属性设置配置文件分组,便于线上维护管理

像这种开发要怎么做

Springboot2.4版本之后include属性不用了,换成了group属性

如下所示,当我们启动dev后,其实是启动的dev这个组“devMVC,devDB”

spring:
  profiles:
    active: dev
    group:
      "dev": devDB,devMVC
      "pro": proDB,proMVC
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

启动后,“dev,devDB,devMVC”

注意!我们之前方式启动的时候,顺序是devDB,devMVC,dev。

而现在是dev,devDB,devMVC

说明dev配置文件已经不是主配置文件了

假如说dev,devDB,devMVC同时配置了不同的端口号,最终devMVC会生效

image-20230909151803827

3.6 多环境开发控制

3.6.1 Maven与Springboot多环境兼容

多环境开发控制不仅Springboot有,maven也有(只要与构建有关的工具,它都会有多环境的设定)

image-20230909152348367

假如在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

首先使用maven工具clean一下,将target包清楚掉,之后运行程序

image-20230909153953697

之后在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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

image-20230909160648517

之后我们要在application中读取profile.active的值,怎么读?

spring:
  profiles:
    active: @profile.active@
    group:
      "dev": devDB,devMVC
      "pro": proDB,proMVC
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

@…@占位符读取maven对应配置属性值

完成后直接package 进行打包image-20230909160715590

查看application中 active 对应的值,如下图所示:

image-20230909161240288

加入将下面的语句在dev中删除,将其加入到pro中,会有什么现象?

<activeByDefault>true</activeByDefault>
  • 1

image-20230909161454596

我们这样打包之后,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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

@…@占位符读取maven对应配置属性值

完成后直接package 进行打包[外链图片转存中…(img-Se7eAcIr-1695865512129)]

查看application中 active 对应的值,如下图所示:

[外链图片转存中…(img-2jSXKmWF-1695865512129)]

加入将下面的语句在dev中删除,将其加入到pro中,会有什么现象?

<activeByDefault>true</activeByDefault>
  • 1

[外链图片转存中…(img-bH7vhofg-1695865512130)]

我们这样打包之后,jar包里已经沿用了maven的设置,springboot与maven的环境就统一了

有时候我们在pom文件中将dev改成pro的,启动时还是会显示dev,此时clean之后在启动,还是显示dev,但是pom配置文件中已经是pro了,这是怎么回事

这是idea的一个bug。那怎么让pro生效呢?

执行一下compile手动编译,重新加载pom里面的属性重新来一轮,再执行程序,这个时候就变成pro了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/953660
推荐阅读
相关标签
  

闽ICP备14008679号