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 相关文章推荐
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
新手入门Jvm-- JVM对象创建与内存分配机制
Jun 18 Java/Android
详解Java实现数据结构之并查集
Jun 23 Java/Android
ObjectMapper 如何忽略字段大小写
Jun 29 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
Java 数据结构七大排序使用分析
Apr 02 Java/Android
Java字符缓冲流BufferedWriter
Apr 09 Java/Android
mybatis-plus模糊查询指定字段
Apr 28 Java/Android
Java界面编程实现界面跳转
Jun 16 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
Java实现贪吃蛇游戏的示例代码
Sep 23 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中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
JS控件的生命周期介绍
2012/10/22 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
ansible作为python模块库使用的方法实例
2017/01/17 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python抖音表白程序源代码
2019/04/07 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
python导入库的具体方法
2020/06/18 Python
django下创建多个app并设置urls方法
2020/08/02 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
过滤器的用法
2013/10/08 面试题
安全生产投入制度
2014/01/29 职场文书
车间机修工岗位职责
2014/02/28 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL