【SpringBoot】一文吃透SpringBoot多环境开发

🌕博客x主页:己不由心王道长🌕!
🌎文章说明:一文彻底吃透·SpringBoot多环境开发🌎
✅系列专栏:SpringBoot
🌴本篇内容:对SpringBoot的多环境开发需求做一个总结🌴
☕️每日一语:情商最低的一种人,就是明明可以好好说的话,非要用最令人讨厌的方式表达。☕️
🕤作者详情:作者是一名双非大三在校生,喜欢Java,欢迎大家探讨学习,喜欢的话请给博主一个三连鼓励。🕤
🚩 交流社区:己不由心王道长(优质编程社区)

前言

在我们的开发中,必然不会只用到单个环境开发。整个软件的开发分为:开发——>测试——>生产(即给用户使用)。
在这整个过程中用到的配置必然不一样,例如我们接了银行一个活,要对底层数据库进行调试;银行管理层肯定不会告诉你密码的。
这种情况下就要求分环境,开发人员自己有一套环境dev,测试人员给人家老板去提供安装、上线测试必然又是另一套(不然你运维直接开发人员全包了得了?),到上线了,老板肯定又是自己的一套环境。密码这种私密性极高的东西必然不会告诉我这种底层程序员。

在这里插入图片描述

yml版多环境开发

这里直接开发,创建项目太小儿科了,就不浪费时间了。

yml版单文件多环境

配置文件:

#应用环境
#公共配置
spring:
  profiles:
    active: dev

---
#设置环境
#生产环境
spring:
  profiles: pro
server:
  port: 80
---
#开发环境
spring:
  profiles: dev
server:
  port: 81
---
#测试环境
spring:
  profiles: test
server:
  port: 82

我们在上面配置了四个环境,分别是应用环境,生产环境、开发环境和测试环境。应用环境是公共环境,是用来声明这个配置文件到底使用了哪个环境作为应用的环境。每个环境之间用三个减号分割开。我们可以在每个环境中进行自己的环境配置。在active中后声明使用的环境的名称。

下面进行测试:
在上面中我们选择的是dev,即生产环境,端口号为81,测试结果为:
在这里插入图片描述
这就正确了吗?不急,把应用环境改为test再测试玩玩;
在这里插入图片描述
结果依然是正确的。所以我们完成了单文件的yml多环境测试。

问题来了,你这几个环境全部都在一个文件里,那么刚才说的老板的密码保密性在哪里呢?
人家老板不干了。老板要是不干了,那可不行,所以我们满足老板需求,
请阅读:yml版多文件多环境

yml版多文件多环境

从上面我们知道,单文件多环境配置是存在局限性的,就是各种时期的人员没有隐私嘛,人老板密码能让你看。所以这里我们就使用SpringBoot提供的yml版多文件多环境开发,让老板穿上底裤!

说着挺玄乎的,难不难?不难!多环境多文件嘛,那就新建文件

在这里插入图片描述
application.yml就是我们的应用环境。怎么用呢?看下面
application-dev.yml:

server:
  port: 80

application-pro.yml:

server:
  port: 81

application-test.yml:

server:
  port: 82

无非就是一个文件一个环境,到你的时候就自己配你的环境,这样老板就又隐私了。

在application.yml中配置:

spring:
  profiles:
    active: test

看到没有,其实就是把一个配置文件分开为了三个配置文件,其他的用法基本一样,而且分开还实现了解耦,以后的多环境开发其实就是使用多文件多环境。

测试:发现8082端口启动,正是我们想看到的
在这里插入图片描述

properties版多环境开发

其实这个版本跟上面的版本大同小异,大同是用法相同,小异其实就是properties和yml语法上的不同。
这里我没有把刚才的配置文件删除,而是创建一个文件夹,把它们移动到里面。
在这里插入图片描述
还是创建四个配置文件
在这里插入图片描述
还是一样进行配置文件的编写
application-dev.properties:

server.port=80

application-pro.properties:

server.port=81

application-test.properties:

server.port=82

application.properties:

#在这里配置需要启用的环境文件
spring.profiles.active=pro

测试:
在这里插入图片描述
结果还是正确
可以看到,两个不同的方式,但是方法都差不多,只有语法和后缀上的差异!!!

问题又来了,我们学会了多环境开发没错,老板也舒服了,有隐私了。
如果出现以下情况,请思考:

server:
  port: 80
spring:
  mvc:
    view:
      prefix: /
      suffix: /*.html
  datasource:
    druid:
      driver-class-name: 
      url:
      username:
      password:
        
mybatis-plus:
  check-config-location: false
  

这些怎么样?你说还行,可我们都知道,开发项目的时候,虽然SpringBoot简化了很多的配置,但还是有很多需要我们自己动手去配置的,如果全都配置在一个文件,难以想象。

多环境分组管理

在上面我们发现了端倪,即在开发环境中,我们不会把所有的配置都放在一个配置中,那样既不美观,也不利于维护。
所以我们要学习多环境的分组管理。
分组是怎么进行的?按照功能拆分,你数据库的负责底层数据库的,你mvc负责视图和控制。
且看下面,刚才在学习多环境的properties格式时,我没有把yml文件删除掉,而是保存起来,这个时候再把它拉出来让它干活!删除properties文件,开发中一般使用yml格式。
在这里插入图片描述
这样,我们都是码农,当然使用dev.yml,我们刚才看见了很多配置混合在一起,如下:

server:
  port: 80
spring:
  mvc:
    view:
      prefix: /
      suffix: /*.html
  datasource:
    druid:
      driver-class-name: 
      url:
      username:
      password:
        
mybatis-plus:
  check-config-location: false
  

我就分别创建application-devMysql.yml、application-devMybatis.yml、application-devMvc.yml
在这里插入图片描述
application-devMysql.yml:

spring:
  datasource:
    druid:
      driver-class-name:
      url:
      username:
      password:

application-devMybatis.yml:

mybatis-plus:
  check-config-location: false

application-devMvc.yml:

spring:
  mvc:
    view:
      prefix:
      suffix:

application-dev.yml:

server:
  port: 8081

然后在应用环境中配置,怎么配置呢?接着看
application.yml

spring:
  profiles:
    active: dev
    include: devMvc,devMybatis,devMysql

在应用环境中配置了dev,使用include表示这个配置文件包括include后面的那几个文件。

测试:
在这里插入图片描述

结果没有意外正确,这时我们还要想一个问题,我们使用了多分组管理,这挺好的,可是如果我把active的dev改为test,即开发阶段过度到测试,那么decMvc也得改,以dev开头的都得改,很明显这是不可忍受的。

解决方案:SpringBoot给我们提供了解决方案,SpringBoot提供了group属性,这一看就是为了分组管理而来的。
使用:

在这里插入图片描述
使用group进行分组管理,可以设置分组类别,只要在active后添加group的分组,如dev,即可默认配置了“dev”后的所有配置文件。

到此,我们的多环境开发要告一段落了,但是别急,我们不妨再想一个问题,到底是SpringBoot依赖maven运行,还是maven依赖SpringBoot运行呢?
这不是废话嘛,当然是SpringBoot依赖maven运行了。好,那么如果在SpringBoot中做了配置,又在maven做进行同样的配置,这个时候怎么办?要是产生冲突怎么办呢?这就是下一节要讲的多环境开发控制。

多环境开发控制

在上面我们已经完成了多环境开发的基本步骤,现在就差一点,我就直接给出答案,就是maven和SpringBoot之间的配置整合,要弄懂这个,我们又必须知道是maven主导SpringBoot。
maven是做什么的?项目构建管理的,最终生成代码包的,SpringBoot是干什么的?简化开发的。简化,又不是其主导作用。最终还是要靠maven来管理整个工程,所以SpringBoot应该听maven的。整个确认后下面就好做了。大体思想如下:

  • 先在maven环境中设置用什么具体的环境
  • 在SpringBoot中读取maven设置的环境即可

第一步:在maven中设置环境

<profiles>
        <profile>
            <id>env_dev</id>
            <properties>
                <profile.active>dev</profile.active>
            </properties>
            <!--设置默认启动环境-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>env_pro</id>
            <properties>
                <profile.active>pro</profile.active>
            </properties>
        </profile>
        <profile>
            <id>env_test</id>
            <properties>
                <profile.active>test</profile.active>
            </properties>
        </profile>
    </profiles>

这里是不是很熟悉,profiles嘛,配置文件,就是下面的1.
在这里插入图片描述
第二步:在配置文件中读取,就是在上面的active中读取,用@profile.active@即可读取maven中默认的启动环境,以后开发要使用什么环境,直接在maven中配置即可。

spring:
  profiles:
    active: @profile.active@
    group:
      "dev": devMvc,devMybatis,devMysql
      "test":
      "pro":
#    include: devMvc,devMybatis,devMysql


测试:这里的默认启动环境是dev,dev端口号是8081
在这里插入图片描述
很遗憾,启动失败,为什么失败呢?错误信息如下:
在这里插入图片描述
解释:

扫描下一个令牌时
找到无法启动任何标记的字符“@”。(不要将@用于缩进)
在“读者”第3行第13列中:
活动:@profile.active@

它告诉我们说的是我们在应用配置文件中的@profile.active@无法启动任何标记。

解决方案:解决方法:在profiles中勾选环境之后,点一下 Road ALL Maven Projects。
在这里插入图片描述
再测试:
在这里插入图片描述

还有一点,比如这时我把maven配置中profiles默认开启更改,改为默认启动test,此时test的端口号为8082
在这里插入图片描述
测试:
在这里插入图片描述
可以看到还是默认启动的是dev。我们怀疑会不会是上次生成的文件没有清理,这里clean再测试一下:
在这里插入图片描述
我们看到并不管用,这时候怎么办?采用预编译即complie

在这里插入图片描述
即可成功运行;

总结

1. 多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
2. yaml格式中设置多环境使用—区分环境设置边界
3. 每种环境的区别在于加载的配置属性不同
4. 启用某种环境时需要指定启动时使用该环境
5. 多环境开发使用group属性设置配置文件分组,便于线上维护管理

  • 51
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 62
    评论
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

己不由心王道长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值