SpringBoot 多环境配置文件切换

背景

很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置。

解决方案

spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。

一、新建配置文件

注:配置文件优先级(由高到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

此处使用.yml文件格式,在src/main/resources下新建如下文件

application.yml (主配置)

server:
  port: 9990

spring:
  profiles:
    active: dev #选定配置

#自定义默认值
curvar:
  context: default.curvar

application-pro.yml (开发配置)

#模拟开发配置
curvar:
  context: "开发配置变量"

application-pro.yml(生产配置)

#模拟生产配置
curvar:
  context: "生产配置变量"

二、 服务调用测试

2.1 新建调用类

@Slf4j
@RestController
public class IndexController {

    @Value("${curvar.context}")
    private String cusvar;

    /**
     * .
     * 使用哪一个配置
     *
     * @return
     */
    @RequestMapping("/test")
    public String test() {
        log.debug("使用:[{}]", cusvar);
        return "使用配置: " + cusvar;
    }

}

2.2 使用样例项目

打开浏览器输入:http://localhost:9990/test

SpringBoot 多环境配置文件切换

三、扩展练习

3.1 使用注解标记配置,首先定义一个接口

public interface Connector {

    String configure();
}

3.2 分别定义俩个实现类来实现它

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("pro-db")//标记文件,环境切换
public class ProConnector implements Connector {

    @Override
    public String configure() {
        return "pro生产标记文件...";
    }
}
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("dev-db")//标记文件,环境切换
public class DevConnector implements Connector {

    @Override
    public String configure() {
        return "dev开发标记文件...";
    }
}

3.3 修改 application.yml 文件激活配置

spring:
  profiles:
    #active: dev #选定配置
     active: pro-db #选定配置激活标记文件

3.4 新增查询方法

@Autowired
    private Connector connector; //注入

   /**
     * .
     * 使用哪一个被标记文件
     *
     * @return
     */
    @GetMapping("/proFile")
    public String proFile() {
        log.debug("使用配置文件:[{}]", connector.configure());
        return connector.configure();
    }

打开浏览器输入:http://localhost:9990/proFile

SpringBoot 多环境配置文件切换

3.5 使用一个或多个配置文件及激活标记文件

3.5.1 修改 application.yml文件,进行属性叠加

spring:
  profiles:
    include: pro,dev-db #指定配置文件及激活标记文件
    #active: pro-db #选定标记文件

3.5.2 新增查询方法

/**
     * .
     * 使用哪一个配置文件及标记文件
     *
     * @return
     */
    @GetMapping("/include")
    public String include() {
        return String.format("使用配置文件:%s,使用标记文件:%s", cusvar, connector.configure());
    }

打开浏览器输入:http://localhost:9990/include

SpringBoot 多环境配置文件切换

3.6 切换日志文件

3.6.1 新建logback文件

SpringBoot 多环境配置文件切换

logback-pro.yml (生产日志)

xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <contextName>logbackcontextName>

    <property name="log.path" value="./pro.log"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debuglevel>
        filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName  [%thread] %-5level %logger{36} [%file : %line] - %msg%n
            pattern>
        encoder>
    appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.%i.gzfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>

            <maxHistory>7maxHistory>
        rollingPolicy>

        <encoder>
            <pattern>%date %level  [%thread] %logger{36} [%file : %line] %msg%n
            pattern>
        encoder>
    appender>

    <root level="debug">
        <appender-ref ref="console"/>
    root>

    <root level="info">
        <appender-ref ref="file"/>
    root>
    <logger name="org.springframework.scheduling" level="error"/>
    <Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
    <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
    <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
    <Logger name="org.springframework" level="info"/>
    <Logger name="org.freeswitch.esl" level="warn"/>
    <logger name="java.sql" level="error"/>
    <logger name="org.mybatis" level="info"/>
    <logger name="com.example" level="debug"/>
configuration>

3.6.2 修改 application.yml 文件,配置日志属性

spring:
  profiles:
    #include: pro,dev-db #指定配置文件及激活标记文件
    #active: pro-db #选定标记文件
    active: pro #指定配置文件

#日志
logging:
   config: classpath:logback-${spring.profiles.active}.xml #本地IDEA启动配置
   #config: config/logback-${spring.profiles.active}.xml # java -jar 包启动配置

项目启动访问接口,控制台打印日志

SpringBoot 多环境配置文件切换

友情提示:jar运行指定配置

java -jar xxx.jar --spring.profiles.active=dev  #指定dev配置

java -jar xxx.jar --server.port=9090 #指定启动端口

参考链接

Original: https://www.cnblogs.com/bgyb/p/16072713.html
Author: 南国以南i
Title: SpringBoot 多环境配置文件切换

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570726/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 几种impala-shell输出模拟结果及方法

    一、impala-shell外部命令所谓的外部命令指的是不需要进入到impala-shell交互命令行当中即可执行的命令参数。impala-shell后面执行的时候可以带很多参数。…

    Java 2023年6月9日
    084
  • docker 安装 Elasticsearch + kibana

    在使用 Elasticsearch 之前,首先要保证虚拟机或云服务器有足够的内存; Elasticsearch 因其底层原理,非常吃内存; 1、docker 下载 Elastics…

    Java 2023年6月5日
    081
  • 数据库系统概论小结(三)【面向考试】

    数据库系统概论小结(三)【面向考试】 第三章 关系数据库标准语言SQL 前面学习实操的时候已经做过总结 第四章 数据库安全性 4.1数据库安全性概述 4.1.1数据库不安全因素 非…

    Java 2023年6月16日
    076
  • Mongodb使用总结

    Mongodb使用总结 基于内存操作,便于与网站交互 数据库-集合-文档(存储多种数据类型),我们的操作都是基于单文档进行操作,并且通过冗余字段进行操作 嵌入式数组文档减少了对昂贵…

    Java 2023年6月14日
    0113
  • 如何使用Java代码修改数组大小呢?

    数组是Java开发中非常重要的一个数据存储容器, 那可以存储多种类型,基础类型,引用类型,但是它有一个缺点,就是一旦创建后,就不可以修改数组的大小, 那么我们如何动态的扩容数组的大…

    Java 2023年6月15日
    078
  • Spring与Web环境集成

    Spring与Web环境集成 1. ApplicationContext应用上下文获取方式 应用上下文对象是通过 new ClassPathXmlApplicationContex…

    Java 2023年6月5日
    0105
  • 为什么重写equals必须重写hashCode

    equals常见面试题 为什么要重写equals 重写equals不重写hashCode会存在什么问题 总结 equals常见面试题 在开始聊之前,我们先看几个常见的面试题,看看你…

    Java 2023年6月5日
    080
  • IDEA如何导入jar包?

    IDEA 如何导入jar包 01 准备步骤 通过Apache官网或者maven下载需要的jar包 02 具体步骤 step1: 在src目录下,创建一个package,取名为lib…

    Java 2023年6月5日
    091
  • MyBatis的一级缓存

    概述 在 MyBatis 中, 一级缓存是默认开启的 。 参考: 通过场景来理解: ​​ ‍ ‍ ​​ 场景一 1、在一个 SqlSession 中,对 User 表进行两次根据 …

    Java 2023年6月5日
    098
  • 记录Feign调用时对LocalDateTime的处理

    feign api调用参数类型为LocalDateTime一直报错,类型转换错误 简单记录一下解决方式吧 调用方 import org.springframework.contex…

    Java 2023年6月8日
    086
  • Android连载42-复习自定义控件

    继承关系 所有的控件都直接或者间接继承自View View是Android中的一种基本的UI组件,可以在屏幕上绘制一块矩形区域 ViewGroup则是一种特殊的View,它可以包含…

    Java 2023年6月13日
    084
  • OO 第三单元总结

    OO 第三单元总结 OO 第三单元总结 规格的阅读与实现心得 JML的阅读方法 JML迭代 测试数据与JML 容器的选择 算法和性能分析 Network 扩展考虑 题目要求 架构分…

    Java 2023年6月13日
    082
  • Java并发

    Java并发 JAVA技术交流群:737698533 CAS compare and swap 比较并交换,cas又叫做无锁,自旋锁,乐观锁,轻量级锁 例如下面的代码,如果想在多线…

    Java 2023年6月6日
    085
  • hit软构博客1–git工具使用的学习

    做实验一时只会基本的git使用,对git并不熟悉,因此进行学习。 1工作区:项目文件夹 2暂存区 3本地库 4远端仓库 git学习 #常用命令 git config –…

    Java 2023年6月5日
    0100
  • 宝塔nginx无法安装wordfence怎么解决?使用chattr i命令

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/ytkah/p/15543431.htmlAuthor:…

    Java 2023年5月30日
    081
  • .NET 7 RC1 正式发布

    可以通过个网站( )跟踪.NET 7的issue 情况,今天截止还有36项在接下来的2个月时间内消灭。 下面是最新的燃尽图: 微软的公告主要回顾了与.NET MAUI、云原生最佳实…

    Java 2023年6月5日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球