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官方文档

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

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

image-20230908094950916

logging:level:root: info

image-20230908095029645

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带来的

解决方案

步骤一

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

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

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

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

核心功能 (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);}}

我们打印一下

image-20230908151203919

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

目的:安全性

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

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 #服务端口

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

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: proserver:port: 801
#  如果多个环境,怎么把多个环境区分开?  --- 三个减号即可---
# 开发环境
spring:profiles: devserver:port: 802---
# 测试环境
spring:profiles: testserver:port: 803

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

image-20230909121725007

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

spring:profiles:active: pro

采用了默认的8080端口

image-20230909122434777

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

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

image-20230909141947650

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: 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

运行项目

端口改了

image-20230909144903426

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

image-20230909145019849

正确的方式

spring:profiles:active: devinclude: devMVC,devDB

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

image-20230909145420098

image-20230909145446085

然后我们发现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会生效

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: devgroup:"dev": devDB,devMVC"pro": devDB,proMVC

首先使用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>

image-20230909160648517

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

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

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

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

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

image-20230909161240288

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

<activeByDefault>true</activeByDefault>

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

@…@占位符读取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了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注&#xff0c;被认为C在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C: An in-depth language comparison Rust和C的比较是开发人员最近的热门话题&#xff0c;两者之间有许多相似之处&#xff0c…

少数人的晚餐-补充

与此相关的四篇博客&#xff1a; 坦然~佛系~_坦然 佛系 zhangrelay-CSDN博客 少数人的晚餐_zhangrelay的博客-CSDN博客 ROS1/2机器人课程的价值和规模-CSDN博客 从2050回顾2020&#xff0c;职业规划与技术路径&#xff08;节选&#xff09;补充-CSDN博客 回顾 少数人的晚餐…

手把手教你制作精美的新店开业微传单

如果你准备开设一家新店&#xff0c;那么制作一份具有吸引力的微传单是宣传店铺的重要手段之一。下面&#xff0c;我们将通过乔拓云平台&#xff0c;手把手教你制作一份有吸引力的新店开业微传单。 1. 注册并登录乔拓云账号 首先&#xff0c;你需要在乔拓云官方网站注册一个账号…

加速企业AI实施:成功策略和效率方法

文章目录 写在前面面临的挑战MlOps简介好书推荐 写作末尾 写在前面 作为计算机科学领域的一个关键分支&#xff0c;机器学习在当今人工智能领域中占据着至关重要的地位&#xff0c;广受瞩目。机器学习通过深入分析大规模数据并总结其中的规律&#xff0c;为我们提供了解决许多…

机器学习---BP算法

1. 多级网络 层号确定层的高低&#xff1a;层号较小者&#xff0c;层次较低&#xff0c;层号较大者&#xff0c;层次较高。 输入层&#xff1a;被记作第0层。该层负责接收来自网络外部的信息。 第j层&#xff1a;第j-1层的直接后继层&#xff08;j>0&#xff09;&#xff…

使用Kalibr工具线对相机+IMU离线标定

传感器标定的准确后面做算法才会更准确&#xff0c;所以对Kalibr进行学习。 一、Kalibr编译 1、下载kalibr包 GitHub下载地址 2、 解压后放到/catkin_ws/src文件夹下 重新命令文件夹为kalibr 3、 安装依赖库 sudo apt-get install python-setuptools python-rosinstall…

css实现渐变电量效果柱状图

我们通常的做法就是用echarts来实现 比如 echarts象形柱图实现电量效果柱状图 接着我们实现进阶版&#xff0c;增加渐变效果 echarts分割柱形图实现渐变电量效果柱状图 接着是又在渐变的基础上&#xff0c;增加了背景色块的填充 echarts实现渐变电量效果柱状图 其实思路是一…

深度学习(1)---卷积神经网络

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

Spring源码分析 事务 实现原理

文章目录 什么是事务Spring事务管理Spring事务实现原理事务管理器事务定义事务的开启事务核心方法业务代码使用事务TransactionInterceptor 什么是事务 一般所指的事务是数据库事务&#xff0c;是指一批不可分割的数据库操作序列&#xff0c;也是数据库并发控制的基本单位。其…

26591-2011 粮油机械 糙米精选机

声明 本文是学习GB-T 26591-2011 粮油机械 糙米精选机. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了糙米精选机的有关术语和定义、工作原理、型号及基本参数、技术要求、试验方法、检 验规则、标志、包装、运输和储存要求。 …

常见列表字典排序

一、列表排序 demoList [1, 3, 2, 4, 9 ,7]res sorted(demoList) # 默认升序# 降序 # res sorted(demoList, reverseTrue)print(res)二、字典排序 demoDict {"篮球": 5, "排球": 9, "网球": 6, "足球": 3}# sorted排序 res so…

Spring面试题21:说一说Spring的@Required注解和@Qualifier注解

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的@Required注解 @Required ,用于标记在注入的属性上。它表示被注解的属性在配置 Bean 的时候是必需的,如果没有正确配置,则会抛出…

如何使用 API 接口获取商品数据,从申请 API 接口、使用 API 接口到实际应用,一一讲解

在当今的数字化时代&#xff0c;应用程序接口&#xff08;API&#xff09;已经成为数据获取的重要通道。API 接口使得不同的应用程序能够方便地进行数据交换&#xff0c;从而促进了信息的广泛传播和利用。在众多的数据源中&#xff0c;商品数据是一个非常重要的领域&#xff0c…

OS 模拟进程状态转换

下面的这个博主写的很好 但是他给的代码print部分和语言风格python三识别不了 这个特别感谢辰同学帮我调好了代码 我放在主页上了 估计过两天就可以通过了 《操作系统导论》实验一&#xff1a;模拟进程状态转换_process-run.py-CSDN博客 这个补充一下他没有的&#xff1a;OS…

R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证指数收益时间序列...

全文链接&#xff1a;http://tecdat.cn/?p31162 最近我们被客户要求撰写关于SV模型的研究报告&#xff0c;包括一些图形和统计输出&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 本文做SV模型&#xff0c;选取马尔可夫蒙特卡罗法(MCMC)、正则化广…

汽车电子——产品标准规范汇总和梳理(信息安全)

文章目录 前言 一、整车 二、充电接口 三、诊断接口 四、远程接口 五、实施指南 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、整车 《GB/T 40861-2021 汽车信息安全通用技术要求》 《GB XXXXX—XXXX 汽车整车信息安全技术要求》 《GB/T 41871-2022 信息…

uni-app:canvas-绘制图形4(获取画布宽高,根据画布宽高进行图形绘制)

效果 代码 var width ; var height ; const query uni.createSelectorQuery(); //获取宽度 query.select(#firstCanvas).fields({ size: true }, (res) > { width res.width; height res.height; }).exec(); console.log(宽度width); console.log(高…

计算机网络 - 链路层

计算机网络 - 链路层 计算机网络 - 链路层 基本问题 1. 封装成帧2. 透明传输3. 差错检测 信道分类 1. 广播信道2. 点对点信道 信道复用技术 1. 频分复用2. 时分复用3. 统计时分复用4. 波分复用5. 码分复用 CSMA/CD 协议PPP 协议MAC 地址局域网以太网交换机虚拟局域网 基本问题…

AIGC快速入门体验之虚拟对象

AIGC快速入门体验之虚拟对象 一、什么是AIGC二、AIGC应用场景2.1 代码生成2.2 图片生成2.3 对象生成 三、AIGC虚拟对象3.1 AIGC完全免费工具3.2 快速获取对象3.3 给对象取名3.4 为对象写首诗3.5 和对象聊聊天 一、什么是AIGC AIGC是生成式人工智能&#xff08;Artificial Intel…

吉利微型纯电,5 万元的快乐

熊猫骑士作为一款主打下层市场的迷你车型&#xff0c;吉利熊猫骑士剑指宝骏悦也&#xff0c;五菱宏光 MINI 等热门选手。 9 月 15 日&#xff0c;吉利熊猫骑士正式上市&#xff0c;售价为 5.39 万&#xff0c;限时优享价 4 .99 万元。价格和配置上对这个级别定位的战略车型有一…