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

文章目录

  • 配置文件
  • 一、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官方文档

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第1张图片

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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第2张图片

下面就是所有的配置了

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第3张图片

配置文件支持如下三种

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第4张图片

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

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

一、Yaml 文件

1.1 修改banner

下图所示,就是banner

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第5张图片

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

image:banner可以用一个图片

image.location:设定图片的位置

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第6张图片

会有如下三个参数

log:记录到日志里面

console:打印到控制台里面

off:关闭

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第7张图片

1.2 日志

如下图,日志相关的配置

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第8张图片

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

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

logging:
	level:
	root: debug

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第9张图片

logging:
	level:
	root: info

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第10张图片

1.3 端口

配置端口号

server:
  port: 8001

配置项目名称

#项目的访问路径
server:
  servlet:
    context-path: /warehouse

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

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

1.4 属性提示消失解决方案

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

解决方案

步骤一

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第11张图片

步骤二

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第12张图片

步骤三

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第13张图片

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第14张图片

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第15张图片

二、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)

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第16张图片

3.2 临时属性(开发环境)

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第17张图片

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第18张图片

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第19张图片

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第20张图片

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第21张图片

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

image-20230908150822911

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

有关系!

@SpringBootApplication
public class PaymentDemoApplication {

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

}

我们打印一下

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第22张图片

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

目的:安全性

@SpringBootApplication
public class PaymentDemoApplication {

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

}

3.3 配置文件四级分类

3.3.1 原始配置文件(四级)

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第23张图片

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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第24张图片

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

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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第25张图片

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

server:
  port: 8083 #服务端口

config目录同级文件的配置

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

    image-20230908152257933

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

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

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

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

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

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

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

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

image-20230908155354818

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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第26张图片

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

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

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

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

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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第27张图片

此文件下的端口号是8888

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第28张图片

3.3.5 总结四级

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第29张图片

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

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

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

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

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

3.4 自定义配置文件

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

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

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

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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第30张图片

第一种办法

指定文件名

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第31张图片

第二种办法

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第32张图片

如果是两个文件呢

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第33张图片

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

image-20230909113110316

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第34张图片

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

image-20230909113251256

3.4.1 重要说明

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

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

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

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

3.5 多环境开发(yaml)

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第35张图片

  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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第36张图片

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

spring:
  profiles:
    active: pro

采用了默认的8080端口

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第37张图片

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

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第38张图片

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

运行之后如下图所示

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

展示如下

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

运行项目

端口改了

image-20230909144903426

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第39张图片

正确的方式

spring:
  profiles:
    active: dev
    include: devMVC,devDB

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第40张图片

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第41张图片

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

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

spring:
  profiles:
    active: pro
    include: proMVC,proDB
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

启动后,“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也有(只要与构建有关的工具,它都会有多环境的设定)

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第42张图片

假如在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包清楚掉,之后运行程序

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第43张图片

之后在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>

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第44张图片

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

spring:
  profiles:
    active: @profile.active@
    group:
      "dev": devDB,devMVC
      "pro": proDB,proMVC

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

完成后直接package 进行打包Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第45张图片

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

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第46张图片

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

<activeByDefault>trueactiveByDefault>

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制_第47张图片

我们这样打包之后,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了

你可能感兴趣的:(springboot,spring,boot,java,后端)