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 相关文章推荐
springboot @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
总结一些Java常用的加密算法
Jun 11 Java/Android
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
JavaWeb Servlet实现网页登录功能
Jul 04 Java/Android
java调用Restful接口的三种方法
Aug 23 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
聊聊SpringBoot自动装配的魔力
Nov 17 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
Feb 24 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 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
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
python爬取NUS-WIDE数据库图片
2016/10/05 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
python中实现字符串翻转的方法
2018/07/11 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
不打扫卫生检讨书
2014/02/12 职场文书
书香校园活动方案
2014/02/28 职场文书
员工2014年度工作总结
2014/12/09 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
建国大业观后感800字
2015/06/01 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
七个Python必备的GUI库
2021/04/27 Python
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS