Spring注解@Profile实现开发环境/测试环境/生产环境的切换

 更新时间:2023年04月14日 09:58:35   作者:刘牌  
在进行软件开发过程中,一般会将项目分为开发环境,测试环境,生产环境。本文主要介绍了Spring如何通过注解@Profile实现开发环境、测试环境、生产环境的切换,需要的可以参考一下

前言

在进行软件开发过程中,一般会将项目分为开发环境,测试环境,生产环境,开发人员在开发环境进行开发,然后将代码合并到测试环境让 测试工程师进行测试,测试完成后,开发人员修改完bug,然后再进行测试,测试工程师测试没有bug后,再将代码合并到生产环境,生产环境 就是最终给用户用的,现在的项目一般都是走CI/CD流水线,整个过程就是一条流水线,而在没有CI/CD之前,开发人员开发完毕后,可能需要将代码 部署上服务器,测试人员再进行测试,还有的直接让测试人员拉代码来自己运行,自己测试,这样效率实在是太低了。那么在这么多环境之间进行切换, 我们应该需要一定的策略,下面我就是用Spring的@Profile注解来实现环境之间的切换。

环境搭建

项目结构

DruidDataSource
└── src
    └── main
        └── java
            └── com.steakliu.druiddatasource
               ├── controller
               │   └── DataSourceController.java
               └── datasource
               │   └── DataSourceConfiguration.java
               └── DruidDataSourceApplication.java
            └── resource
                └── application.yml
                └── application-dev.yml
                └── application-prod.yml
                └── application-test.yml

application.yml

application.yml内容如下,里面主要放的是公共的配置,比如项目的名称啊,端口啊这些,使用spring.profiles.active = dev/test/prod切换不同的环境。

server:
  port: 8080
spring:
  profiles:
    active: dev

application-dev.yml

spring:
  datasource:
    druid:
      username: root
      password: xiaosi520@
      url: jdbc:mysql://127.0.0.1:3306/store-dev
      driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

application-test.yml

spring:
  datasource:
    druid:
      username: root
      password: xiaosi520@
      url: jdbc:mysql://127.0.0.1:3306/store-test
      driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

application-prod.yml

spring:
  datasource:
    druid:
      username: root
      password: xiaosi520@
      url: jdbc:mysql://127.0.0.1:3306/store-prod
      driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

从上面我们知道,三个yaml文件主要配置的是数据库,分为dev,test,prod三个库,我也在数据库创建了三个数据,等一下我们要根据不同的配置获取不同的数据库的数据, 三个数据库如下,其中每个库里面都有一张表,分别放了一条测试数据。

数据源配置DataSourceConfiguration

DataSourceConfiguration是一个数据源配置类,我们使用alibaba的Druid数据源,使用@Value注解来获取yaml文件的数据库配置, 定义了三个Bean,并使用@Profile来进行开发环境,测试环境,生产环境的区分,这里它会识别application.yml文件中的spring.profiles.active

package com.steakliu.druiddatasource.datasource;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfiguration {

    @Value("${spring.datasource.druid.username}")
    private String username;
    @Value("${spring.datasource.druid.password}")
    private String password;
    @Value("${spring.datasource.druid.url}")
    private String url;
    @Value("${spring.datasource.druid.driver-class-name}")
    private String driverClassName;

    @Profile("dev")
    @Bean
    public DataSource devDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        return dataSource;
    }

    @Profile("test")
    @Bean
    public DataSource testDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        return dataSource;
    }

    @Profile("prod")
    @Bean
    public DataSource prodDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        return dataSource;
    }
}

DataSourceController测试Controller

创建一个Controller来测试获取数据,这里使用JdbcTemplate来获取数据,

package com.steakliu.druiddatasource.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;

@RestController
public class DataSourceController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("datasource")
    public List<Map<String, Object>> datasource(){
        List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM sys_env");
        return maps;
    }
}

使用Postman进行测试

spring.profiles.active = dev

spring:
  profiles:
    active: dev

spring.profiles.active = test

spring:
  profiles:
    active: test

spring.profiles.active = prod

spring:
  profiles:
    active: dev

到这里我们完成了开发环境,测试环境,生产环境的切换,其核心就是spring.profiles.active@Profile注解,那么这时候你可能会觉得,每次打包发布前都需要 去application.yml配置文件中修改spring.profiles.active,是不是有点麻烦,没错,确实会有点麻烦,那么我们下面对其改造,使用Maven的profile 来改造,实现勾选式的配置。

使用Maven配置

我们在maven中对dev,test,prod进行定义,如下,使用<profiles>标签进行包裹,使用<activeByDefault>标签将dev作为默认的环境, 在<properties>中定义环境标识(dev,test,prod),<mvn.profile>是自定义的,可以任意定义,它和application.yml 那边进行对应。

pom.xml

<profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <mvn.profile>dev</mvn.profile>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <mvn.profile>test</mvn.profile>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <mvn.profile>prod</mvn.profile>
            </properties>
        </profile>
    </profiles>

application.yml

application.yml里面使用@mvn.profile@这种方式来读取pom.xml中的配置。

spring:
  profiles:
    active: @mvn.profile@

定义好上面的pom.xmlapplication.yml后,会在我们IDEA编译器右侧的Maven栏下出现Profiles,就可以 进行选择了,所实现的效果和直接在applicaiton.yml中修改是一样的。 

除了上面的这两种,我们还可以在IDEA里面进行指定,也能达到同样的效果。

后记

关于使用Spring的@Profile实现环境之间的切换就说到这里,配置多环境有很多中方案,主要是看那种适合我们。

以上就是Spring注解@Profile实现开发环境/测试环境/生产环境的切换的详细内容,更多关于Spring @Profile环境切换的资料请关注脚本之家其它相关文章!

相关文章

  • Java实现双链表互相交换任意两个节点的方法示例

    Java实现双链表互相交换任意两个节点的方法示例

    这篇文章主要介绍了Java实现双链表互相交换任意两个节点的方法,简单讲述了双链表的概念,并结合实例形式给出了java双链表实现任意两个节点交换的操作技巧,需要的朋友可以参考下
    2017-11-11
  • Spring Cloud Zipkin服务端追踪服务

    Spring Cloud Zipkin服务端追踪服务

    这篇文章主要介绍了Spring Cloud Zipkin服务端追踪服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java实用小技能之快速创建List常用几种方式

    Java实用小技能之快速创建List常用几种方式

    java集合可以说无论是面试、刷题还是工作中都是非常常用的,下面这篇文章主要给大家介绍了关于Java实用小技能之快速创建List常用的几种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Spring Security实现退出登录和退出处理器

    Spring Security实现退出登录和退出处理器

    本文主要介绍了Spring Security实现退出登录和退出处理器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Spring中Bean的创建流程详细解读

    Spring中Bean的创建流程详细解读

    这篇文章主要介绍了Spring中Bean的创建流程详细解读,Spring 中创建 Bean ,是通过调用 GetBean 方法来触发的,所以,我们会从这个方法开始,需要的朋友可以参考下
    2023-10-10
  • Spring cloud Eureka注册中心搭建的方法

    Spring cloud Eureka注册中心搭建的方法

    这篇文章主要介绍了Spring cloud Eureka注册中心搭建的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • SpringAOP+RabbitMQ+WebSocket实战详解

    SpringAOP+RabbitMQ+WebSocket实战详解

    这篇文章主要介绍了SpringAOP+RabbitMQ+WebSocket实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 基于Mybatis实现CRUD操作过程解析(xml方式)

    基于Mybatis实现CRUD操作过程解析(xml方式)

    这篇文章主要介绍了基于Mybatis实现CRUD操作过程解析(xml方式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java List简介_动力节点Java学院整理

    Java List简介_动力节点Java学院整理

    Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解。需要的朋友参考下吧
    2017-05-05
  • 详解JVM的内存对象介绍[创建和访问]

    详解JVM的内存对象介绍[创建和访问]

    这篇文章主要介绍了JVM的内存对象介绍[创建和访问],文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论