1. 首页
  2. 软件开发
  3. 一文带你实现SpringBoot多配置文件实现环境动态切换(prod、dev、test)

一文带你实现SpringBoot多配置文件实现环境动态切换(prod、dev、test)

  • 发布于 2024-07-29
  • 10 次阅读

原文链接:https://blog.csdn.net/weixin_44048876/article/details/137696326

一、原始项目配置

你的Resource文件夹下application.yml配置文件可能是这样(这里只是简单列举了MySQL,其它配置雷同这里就不在阐述),我们要切换环境就要一个个修改地址。

server:

  port: 8080

  tomcat:

    max-connections: 20

    threads:

      max: 20

      min-spare: 10

    accept-count: 10

spring:

  config:

    name: tomandcat

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/xxxdb?serverTimezone=GMT%2B8

    username: root

    password: root

    type: com.alibaba.druid.pool.DruidDataSource

二、利用Profile实现环境切换

2.1 创建各种环境的配置文件

创建如下图:

在Resource包下创建我们多种环境的配置文件,application-dev.yml、application-dev.yml

这时候你肯定会想为什么我这样创建文件就可以SpringBoot就能读到相关的配置呢?

这是应为SpringBoot 它就是一个整合框架啊,同时它的开发理念就是我们常常谈到的约定>配置>编码,从而提高我们程序员的开发效率。

比如拿application.yml配置文件来说,因为约定,我们才可以把所有配置按照固定格式写到该文件中,然后由SpringBoot和第三方jar整合包通过自动装配来读到自己需要的配置,如MySQL、Redis、Nacos等等吧,这就是它好用的原因之一。

小tips,你还记得配置文件的优先级吗?

bootstrap.properties > bootstrap.yml > application.properties > application.yml

现在我们看看application-dev.yml会有什么内容吧

# 自定义配置 为了等下验证读取的配置文件环境
appName: tomandcat-dev

server:

  port: 8091

spring:

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/xxx01?serverTimezone=GMT%2B8

    username: root

    password: root

    type: com.alibaba.druid.pool.DruidDataSource

其它环境的配置文件类似,这里我就不再添加了(如有需要查看案例)

2.2 POM文件添加配置

<!-- 配置maven占位符-->

<profiles>

    <!-- 配置需要切换的环境 -->

    <profile>

        <id>dev</id>

        <!-- properties下的每个子标签我们可以理解为一个配置 -->

        <properties>

            <!--  标签名为自定义,和我们平时写properties一样,同样我们也可以定义一个或多个(key, value)配置-->

            <runtime-profile>dev</runtime-profile>

          <!-- 如果你需要配置一些变量,你可以在这里设置一个k-v数据,在具体的环境变量中读取这个数据或者你也可以在具体的配置文件中直接设置(如application-dev.yml) -->

            <config-addr>127.0.0.1:8848</config-addr>

        </properties>

    </profile>

    <profile>

        <id>prod</id>

        <properties>

            <runtime-profile>prod</runtime-profile>

            <config-addr>127.0.0.1:8848</config-addr>

        </properties>

    </profile>

    <profile>

        <id>test</id>

        <properties>

            <runtime-profile>test</runtime-profile>

            <config-addr>127.0.0.1:8848</config-addr>

        </properties>

    </profile>

</profiles>

2.3 配置占位符生效(假如你是通过Maven插件来进行动态切换的,你需要添加如下内容, 否则跳过)

<build>

    <!-- 配置所有的yml文件中占位符生效, 假如我们是手动来更新application.yml文件我们可以不配置,手动更新指的是我们在application.yml直接指定profile的值如dev、prod-->

    <resources>

        <resource>

            <directory>src/main/resources</directory>

            <!-- 会生效-->

            <filtering>true</filtering>

        </resource>

    </resources>

</build>


2.4 修改我们的application.yml文件

手动的话无需在pom中配置profiles,SpringBoot 会自动读取到对应的环境

代码如下(注意缩进):


# 根据环境读取配置文件(手动)
  #  profiles:
  #    active: dev
  # 根据环境读取配置文件(通过勾选maven插件)
  profiles:
    active: @runtime-profile@

三、结果测试并验证:

我是采用的maven插件勾选环境来动态切换的;

3.1 编写验证类

@RestController

@RequestMapping("/api")

public class HelloWord {

    @Value("${appName}")

    private String appName;

    @Value("${server.port}")

    private String port;

    @RequestMapping("/hello")

    public String test(){

        return "hello word! - " + port + " - " + appName;

    }

}

3.2 验证dev环境

启动项目,访问http://localhost:8091/api/hello

3.3 切换为prod环境

切换环境,访问http://localhost:8092/api/hello

3.4 问题踩坑

假如启动报如下错误

就是我们切换了环境,但是由于缓存问题暂位符profile没有更新(个人认为),我们可以重新加载下maven,如下图即可解决

上述缓存的问题并不影响编译和打包,验证如下(查看编译和打包结果):

可以看到读取的是prod

我们可以解压jar包查看