锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 一文带你实现SpringBoot多配置文件实现环境动态切换(prod、dev、test)

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

0
  • 软件开发
  • 发布于 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包查看

标签: #软件开发 1171 #JAVA 991 #新手必读 21
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.