SpringBoot中获取profile的方法详解


Posted in Java/Android onApril 08, 2022

spring boot与profile

spring boot 的项目中不再使用xml的方式进行配置,并且,它还遵循着约定大于配置。

静态获取方式

静态工具类获取当前项目的profile环境。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.Locale;

/**
 * 

 */
/**
 * @author wangjiuzhou (835540436@qq.com)
 * @date 2018/10/27
 * 项目名称:
 * 类名: SpringContextUtil
 * 描述: 获取bean的工具类,可用于在线程里面获取bean
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {

    public static final String LOCAL_PROFILE = "local";
    public static final String DEV_PROFILE = "dev";
    public static final String TEST_PROFILE = "test";
    public static final String PRO_PROFILE = "pro";


    private static ApplicationContext context = null;


    /* (non Javadoc)
     * @Title: setApplicationContext
     * @Description: spring获取bean工具类
     * @param applicationContext
     * @throws BeansException
     * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        context = applicationContext;
    }
 
    // 传入线程中
    public static <T> T getBean(String beanName) {
        return (T) context.getBean(beanName);
    }
 
    // 国际化使用
    public static String getMessage(String key) {
        return context.getMessage(key, null, Locale.getDefault());
    }
 
    // 获取当前环境
    public static String getActiveProfile() {
        return context.getEnvironment().getActiveProfiles()[0];
    }
}

点评:

这种方式在使用起来很方便也是现在各个博客文章所撰写的方式,在很多Service的业务代码中使用起来很方便,毕竟是静态的方式嘛!

但是有一种缺陷,因为实现ApplicationContextAware接口,而spring中的这个接口是在所有的Bean注入完毕,才会执行setApplicationContext方法,那么问题来了,往往在项目中我们可能会对一些Bean进行一些config操作,例如:@Bean注入,而有时候我们会根据不同的profile进行不同的定制化config。这个时候恰恰我们的工具类SpringContextUtil还没有执行setApplicationContext此时工具类中的context对象还是null。就会出现异常的情况。下面的方式可以弥补这个缺陷。

autowire ProfileConfig

使用这种方式首先声明一下,其实就相当于一个特殊的configBean一样,因为只有这样,这个类才不会在所有bean全部加载完毕后才能获取到context。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;

/**
 * @author wangjiuzhou (835540436@qq.com)
 * @date 2018/11/07
 *
 * 获取当前项目环境:local、dev、test、pro
 */
@Configuration
public class ProfileConfig {
    public static final String LOCAL_PROFILE = "local";
    public static final String DEV_PROFILE = "dev";
    public static final String TEST_PROFILE = "test";
    public static final String PRO_PROFILE = "pro";

    @Autowired
    private ApplicationContext context;

    public String getActiveProfile() {
        return context.getEnvironment().getActiveProfiles()[0];
    }
}

点评:

ProfileConfig ,首先是作为一个相当于Bean的形式存在着,此处的不在解释@configuration和@component的区别;

注入ApplicationContext因为该接口extends于EnvironmentCapable,所以可以获取到环境的一些信息;

以上就是SpringBoot中获取profile的方法详解的详细内容,更多关于SpringBoot获取profile的资料请关注三水点靠木其它相关文章!

Java/Android 相关文章推荐
为什么在foreach循环中JAVA集合不能添加或删除元素
Jun 11 Java/Android
Java Dubbo框架知识点梳理
Jun 26 Java/Android
JavaWeb 入门:Hello Servlet
Jul 16 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 Java/Android
java代码实现空间切割
Jan 18 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
Java 超详细讲解十大排序算法面试无忧
Apr 08 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Apr 22 Java/Android
Java异常体系非正常停止和分类
Jun 14 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
Jun 21 Java/Android
教你在 Java 中实现 Dijkstra 最短路算法的方法
Java 垃圾回收超详细讲解记忆集和卡表
Java 常见的限流算法详细分析并实现
Java 超详细讲解ThreadLocal类的使用
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Java详细解析==和equals的区别
Apr 07 #Java/Android
Java 超详细讲解hashCode方法
Apr 07 #Java/Android
You might like
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
Python中设置变量访问权限的方法
2015/04/27 Python
python对象及面向对象技术详解
2016/07/19 Python
Python正规则表达式学习指南
2016/08/02 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
python中while和for的区别总结
2019/06/28 Python
python实现按行分割文件
2019/07/22 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
工作中的自我评价如何写好
2013/10/28 职场文书
车辆安全检查制度
2014/01/12 职场文书
怎样填写就业意向
2014/04/02 职场文书
金融事务专业求职信
2014/04/25 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS