@Profile 动态切换环境

Posted 方方方方方方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Profile 动态切换环境相关的知识,希望对你有一定的参考价值。

一、dbconfig.properties

db.user=root
db.password=123456
db.driverClass=com.mysql.jdbc.Driver

二、配置类

package com.config;

import javax.sql.DataSource;
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 org.springframework.context.annotation.PropertySource;
import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * Profile:
 *         Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
 * 
 * 开发环境、测试环境、生产环境的数据源分别为 dev、test、prod
 * 
 * 
 * @Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件
 * 
 * 1)、加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境
 * 2)、写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
 * 3)、没有标注环境标识的bean在,任何环境下都是加载的;
 */

@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile{
    
    @Value("${db.user}")
    private String user;
    
    @Value("${db.pwd}")
    private String pwd;
    
    @Value("${db.driverClass}")
    private String driverClass;
    
    
    //测试环境的数据源
    @Profile("test") //标注环境表标识 test ( 测试环境 )
    @Bean("testDataSource")
    public DataSource dataSourceTest() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    
    //开发环境的数据源
    @Profile("dev") //标注环境标识为 dev  ( 开发环境 )
    @Bean("devDataSource")
    public DataSource dataSourceDev() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }
    
    //生产环境的数据源
    @Profile("prod") //标注环境标识为 prod ( 生产环境 )
    @Bean("prodDataSource")
    public DataSource dataSourceProd() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/prod");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

}

三、测试代码

public class IOCTest_Profile {
    //使指定环境生效的两种方法如下
    //1、使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
    //2、代码的方式激活某种环境;
    @Test
    public void test01(){
        //1、创建一个applicationContext
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();       
        //2、设置需要激活的环境
        applicationContext.getEnvironment().setActiveProfiles("dev");
        //3、注册主配置类
        applicationContext.register(MainConfigOfProfile.class);
        //4、启动刷新容器
        applicationContext.refresh();
        
        String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class);
        for (String string : namesForType) {
            System.out.println(string);
        }
                
        applicationContext.close();
    }

}

 

以上是关于@Profile 动态切换环境的主要内容,如果未能解决你的问题,请参考以下文章

24自动装配-@Profile环境搭建

spring切换环境变量——@Profile注解的使用

如何使用导航组件切换到不同后堆栈中的其他片段?

SpringBoot 通过 Profile 实现不同环境下的配置切换

spring通过profile实现开发和测试环境切换

SpringBoot2——指标监控actuator多环境切换Profile和自定义starter