开发者

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

开发者 https://www.devze.com 2023-04-14 10:49 出处:网络 作者: 刘牌
目录前言环境搭建项目结构application.ymlapplication-dev.ymlapplication-test.ymlapplication-prod.yml数据源配置DataSourceConfigurationDataSourceController测试Controller编程客栈使用Postman进行测试spring.p
目录
  • 前言
  • 环境搭建
    • 项目结构
    • application.yml
    • application-dev.yml
    • application-test.yml
    • application-prod.yml
    • 数据源配置DataSourceConfiguration
    • DataSourceController测试Controller编程客栈
  • 使用Postman进行测试
    • spring.profiles.active = dev
    • spring.profilesjs.active = test
    • spring.profiles.active = prod
  • 使用Maven配置
    • pom.XML
    • application.yml
  • 后记

    前言

    在进行软件开发过程中,一般会将项目分为开发环境,测试环境,生产环境,开发人员在开发环境进行开发,然后将代码合并到测试环境让 测试工程师进行测试,测试完成后,开发人员修改完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

    sp开发者_Go教程ring:
      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三个库,我也在数据库创建了三个数据,等一下我们要根据不同的配置获取不同的数据库的数据, 三个数据库如下,其中每个库里面都有一张表,分别放了一条测试数据。

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

    数据源配置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.sprpythoningframework.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;
    
     python   @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注解@Profile实现开发环境/测试环境/生产环境的切换

    spring.profiles.active = test

    spring:
      profiles:
        active: test
    

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

    spring.profiles.active = prod

    spring:
      profiles:
        active: dev

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

    到这里我们完成了开发环境,测试环境,生产环境的切换,其核心就是spring.profiles.active@Profile注解,那么这时候你可能会觉得,每次打包发布前都需要 去application.yml配置文件中修改spring.profileandroids.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中修改是一样的。 

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

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

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

    后记

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

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

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号