前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring通过@Profile解决环境变量的问题

spring通过@Profile解决环境变量的问题

作者头像
逍遥壮士
发布2020-09-18 11:35:59
7950
发布2020-09-18 11:35:59
举报
文章被收录于专栏:技术趋势技术趋势

背景

在profile推出之前,通过不同系统的环境变量切换,通过一些手动或者写死的方法进行切换非常费时费力,而且有些系统来回几套系统在切换的时候经常性出现各种问题...

spring @profile解决什么问题?

spring profile是Spring Framework 3.1以后推出一个解决切换环境变量的注解。主要解决一个环境问题切换的问题,其原理就是通过spring di在注入的时候通过环境变量来判断注入相应的环变量,以达到减少配置问题引起的各种麻烦。

个人理解:就是通过环境变量中的不同值来判断是正式环境、测试环境、开发环境、本地环境等。

源码实现:

代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 15:18
 * @Description:系统环境
 */
public class SystemConfig {
    private String systemInfo;

    public SystemConfig(String systemInfo) {
        this.systemInfo = systemInfo;
    }

    public String getSystemInfo() {
        return systemInfo;
    }

    public void setSystemInfo(String systemInfo) {
        this.systemInfo = systemInfo;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 15:20
 * @Description:环境配置
 */
@Configuration
public class EnvironmentConfig {
    @Profile("dev")
    @Bean
    public SystemConfig getTest(){
        return new SystemConfig("dev222222");
    }

    @Profile("idc")
    @Bean
    public SystemConfig getIDC(){
        return new SystemConfig("idc2222222222");
    }

}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 10:43
 * @Description:
 */
public class ProfileTest {
    public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        System.out.println("context 已启动!");
        context.getEnvironment().setActiveProfiles("idc");
        //注册主配置类
        context.register(EnvironmentConfig.class);
        context.refresh();
        SystemConfig bean = context.getBean(SystemConfig.class);
        System.out.println(bean.getSystemInfo());
        AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext();
        context2.getEnvironment().setActiveProfiles("dev");
        //注册主配置类
        context2.register(EnvironmentConfig.class);
        context2.refresh();
        SystemConfig bean2 = context2.getBean(SystemConfig.class);
        System.out.println(bean2.getSystemInfo());
    }
}
代码语言:javascript
复制
context 已启动!
七月 10, 2020 3:24:13 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:24:13 CST 2020]; root of context hierarchy
idc
七月 10, 2020 3:24:14 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7dc222ae: startup date [Fri Jul 10 15:24:14 CST 2020]; root of context hierarchy
dev
代码语言:javascript
复制
context 已启动!
七月 10, 2020 3:25:04 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:25:04 CST 2020]; root of context hierarchy
idc2222222222
七月 10, 2020 3:25:04 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7dc222ae: startup date [Fri Jul 10 15:25:04 CST 2020]; root of context hierarchy
dev222222

当然也可以通过jvm来进行配置

代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/7/10 10:43
 * @Description:profile测试
 */
public class ProfileTest {
    public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        System.out.println("context 已启动!");
     //   context.getEnvironment().setActiveProfiles("idc");
        //注册主配置类
        context.register(EnvironmentConfig.class);
        context.refresh();
        SystemConfig bean = context.getBean(SystemConfig.class);
        System.out.println(bean.getSystemInfo());
        AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext();
     //   context2.getEnvironment().setActiveProfiles("dev");
        //注册主配置类
        context2.register(EnvironmentConfig.class);
        context2.refresh();
        SystemConfig bean2 = context2.getBean(SystemConfig.class);
        System.out.println(bean2.getSystemInfo());
    }
}
代码语言:javascript
复制
context 已启动!
七月 10, 2020 3:30:44 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:30:44 CST 2020]; root of context hierarchy
idc2222222222
七月 10, 2020 3:30:44 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6483f5ae: startup date [Fri Jul 10 15:30:44 CST 2020]; root of context hierarchy
idc2222222222

注:

org.springframework.core.env.ConfigurableEnvironment#setActiveProfiles的等级优于VM options

代码下载:https://gitee.com/hong99/spring/issues/I1N1DF

参考文章:

https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile

https://blog.csdn.net/weixin_43950568/article/details/104256427?ops_request_misc=&request_id=&biz_id=102&utm_term=@Profile&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-104256427

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档