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

在容器中如果存在同一类型的多个组件,也可以使用@Profile注解标识要获取的是哪一个bean,这在不同的环境使用不同的变量的情景特别有用。例如,开发环境、测试环境、生产环境使用不同的数据源,在不改变代码的情况下,可以使用这个注解来切换要连接的数据库。

步骤如下: 

1. 在bean上加@Profile注解,其value属性值为环境标识,可以自定义;

2. 使用无参构造方法创建容器

3. 设置容器环境,其值为第1步设置的环境标识

4. 设置容器的配置类

5. 刷新容器

注:2、4、5步其实是带参构造方法的步骤,相当于把带参构造方法拆开,在其中插入一条语句设置容器环境,详spring源码

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
   this();
   register(annotatedClasses);
   refresh();
}

以下是在不同环境下不同的数据源组件的示例

/**
 * 容器配置类
 * 用于测试@Profile注解
 */
@Configuration
@PropertySource(value = {"classpath:/dbconfig.properties"})
public class ProfileBeanConfig implements EmbeddedValueResolverAware {

    //数据库连接用户名
    @Value(value = "${jdbc.username}")
    private String username;
    //数据库连接密码
    private String password;

    //开发环境数据源
    @Bean(value = "dataSourceDev")
    @Profile(value = "dev")
    public DataSource dataSourceDev(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setUser(this.username);
        comboPooledDataSource.setPassword(this.password);
        comboPooledDataSource.setDriverClass(driverClass);
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
        return comboPooledDataSource;
    }

    //测试环境数据源
    @Bean(value = "dataSourceTest")
    @Profile("test")
    public DataSource dataSourceTest(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setUser(this.username);
        comboPooledDataSource.setPassword(this.password);
        comboPooledDataSource.setDriverClass(driverClass);
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        return comboPooledDataSource;
    }

    //生产环境数据源
    @Bean(value = "dataSourceProduction")
    @Profile("production")
    public DataSource dataSourceProduction(@Value("${jdbc.driverClass}") String driverClass) throws PropertyVetoException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setUser(this.username);
        comboPooledDataSource.setPassword(this.password);
        comboPooledDataSource.setDriverClass(driverClass);
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/production");
        return comboPooledDataSource;
    }

    //获取字符串解析器
    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        //解析配置文件,然后对数据库连接密码进行赋值
        this.password = resolver.resolveStringValue("jdbc.password");
    }
}

以下是切换数据源示例

//创建匿名容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//设置环境,其值为@Profile注解的属性值
applicationContext.getEnvironment().setActiveProfiles("test");
//注册容器类
applicationContext.register(ProfileBeanConfig.class);
//刷新容器
applicationContext.refresh();

原文地址:https://www.cnblogs.com/dubhlinn/p/10708240.html

时间: 2024-08-05 10:34:39

spring切换环境变量——@Profile注解的使用的相关文章

Spring Boot 环境变量读取 和 属性对象的绑定

凡是被Spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量. 如: @Configuration public class MyWebAppConfigurer implements EnvironmentAware { private static final Logger logger = LoggerFactory.getLogger(MyWebAppConfi

十五、Spring Boot 环境变量读取 和 属性对象的绑定

凡是被spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量. 如: @Configuration public class MyWebAppConfigurer implements EnvironmentAware { private static final Logger logger = LoggerFactory.getLogger(MyWebAppConfi

spring 对静态变量进行注解

要对静态变量进行注入 @Resource private static ITecharchService techarchService;//注入为空,spring注解注入不支持静态变量注入 查资料找到可以这样注入 @Component //必须是组件,才可以用@PostConstruct public class DDUtils{ @Resource private ITecharchService techarchService; private static DDUtils dd; @Po

Linux环境变量具体解释

设置环境变量 profile和bashrc文件 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件.此文件为系统的每一个用户设置环境信息,当用户第一次登录时,该文件被运行. 并从/etc/profile.d文件夹的配置文件里搜集shell的设置. /etc/bashrc:为每个执行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. ~/.bash_profile:每一个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该

在Ubuntu下设置环境变量

在Ubuntu中有如下几个文件可以设置环境变量 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. /etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量 ~/.profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他

spring boot 环境配置(profile)切换

Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 spring boot 连接Mysql spring boot配置druid连接池连接mysql spring boot集成mybatis(1) spring boot集成mybatis(2) – 使用pagehelper实现分页 spring boot集成mybatis(3) – mybatis ge

【Spring Cloud】Spring Cloud之自定义@SpringCloudProfile注解实现@Profile注解的功能

一.为什么会想到定义@SpringCloudProfile这样的注解 首页提一下@Profile注解:它主要用与Spring Boot多环境配置中,指定某个类只在指定环境中生效,比如swagger的配置只允许开发和测试环境开发,线上需要禁止使用. 使用@Profile进行如下配置: @Configuration @EnableSwagger2@Profile({"dev", "test"}) public class Swagger2Config { @Bean p

环境变量配置文件profile

环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量1./etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.2./etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量.3.~/.bash_profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时

(转)Linux 中/etc/profile、~/.bash_profile 环境变量配置及执行过程

环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell.对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell.对于UNIX,可能是CShelll.环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用.对于bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量.下面通过几个实例来说明.1)etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被