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

在日常开发中,我们可能经常会碰到要调试代码或者切换到线上环境去查看问题。
在没有配置环境切换的情况下,我们需要来回修改各种配置地址,例如 MySQL、Redis。。。等等
所以,当你看完本文,你可以学到如何对一个SpringBoot单体项目进行改造,通过Maven选择环境来实现动态切换。
阅读耗时:10-15min



案例Demo地址:https://gitee.com/Linda_master/multi-environment

一、原始项目配置

你的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 创建各种环境的配置文件

创建如下图:
image.png

在Resource包下创建我们多种环境的配置文件,application-dev.ymlapplication-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插件来进行动态切换的,你需要添加如下内容, 否则跳过)

image.png

<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 会自动读取到对应的环境
image.png
代码如下(注意缩进):


# 根据环境读取配置文件(手动)
  #  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环境

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

3.3 切换为prod环境

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

3.4 问题踩坑

假如启动报如下错误
image.png
就是我们切换了环境,但是由于缓存问题暂位符profile没有更新(个人认为),我们可以重新加载下maven,如下图即可解决
image.png
上述缓存的问题并不影响编译和打包,验证如下(查看编译和打包结果):
image.png
可以看到读取的是prod
image.png

我们可以解压jar包查看
image.png

四、总结

以上就是本文的所有内容,本文仅介绍了SpringBoot单体项目如何实现多环境动态切换,如有错误之处,还请各位读者多多指正,感谢!后续还会更新微服务的整合nacos实现多环境动态切换,记得关注喔0D20773C.png

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SpringBoot中可以通过配置profile来实现环境配置文件,只需要在application.properties或application.yml中添加spring.profiles.active属性,指定当前激活的环境即可。例如,可以在application.properties中添加:spring.profiles.active=dev,这样SpringBoot就会激活dev环境,加载application-dev.properties等配置文件。 ### 回答2: SpringBoot中配置多环境配置文件可以通过以下步骤实现: 1. 创建配置文件:在项目的资源文件夹下创建多个不同环境配置文件,通常以"application-"开头,并在文件名中添加环境标识,如"application-dev.properties"、"application-test.properties"等。 2. 配置文件内容:在各个配置文件中,根据不同环境的需求,设置不同的配置属性值。可以设置数据库连接、服务端口、日志级别等等。 3. 设置激活环境:在主配置文件(通常是"application.properties")中,通过设置"spring.profiles.active"属性来指定当前激活的环境。例如,设置为"dev"表示激活开发环境。 4. 使用配置属性:在代码中,可以使用"@Value"注解或者使用"Environment"对象来获取配置文件中的属性值。通过这种方式,可以根据不同环境的配置来动态改变应用程序的行为。 5. 多个配置文件的优先级:当存在多个配置文件时,SpringBoot将按照一定的优先级进行加载。其中,主配置文件具有最低优先级,而具体环境配置文件具有更高的优先级。因此,如果某个配置属性在多个文件中都存在,那么后加载的配置文件会覆盖前面加载的配置。 通过以上步骤,我们就可以在SpringBoot项目中实现环境配置文件。这样,我们可以根据不同的环境需求,灵活地配置应用程序的各个属性,提高了适应不同环境变化的能力。 ### 回答3: Spring Boot中配置多环境配置文件可以通过使用不同的配置文件实现。一种常用的配置方式是通过在application.properties(或application.yml)文件中使用不同的profile来指定环境。 首先,在src/main/resources目录下创建application-{profile}.properties(或application-{profile}.yml)文件,其中{profile}代表环境名称,例如application-dev.properties(或application-dev.yml)代表开发环境配置文件,application-prod.properties(或application-prod.yml)代表生产环境配置文件。 然后,在application.properties(或application.yml)文件中,添加一个配置项spring.profiles.active={profile}来指定使用哪个环境配置文件。例如,如果想要使用开发环境配置文件,可以设置spring.profiles.active=dev。 接下来,在具体的配置文件中,可以根据不同的需要设置不同的配置项。例如,在开发环境配置文件中可以设置数据库连接的URL为本地环境的URL,而在生产环境配置文件中可以设置数据库连接的URL为线上环境的URL。 最后,在代码中通过注解@Value("${配置项名称}")来获取配置文件中的配置项的值。Spring Boot会根据当前使用的环境自动加载相应的配置文件,并将对应的配置项的值注入到相应的字段中。 通过这种方式,我们可以根据不同的环境使用不同的配置文件,方便地进行开发、测试和部署。同时,Spring Boot还支持其他灵活的配置方式,例如使用命令行参数或环境变量来指定使用哪个环境配置文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值