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 相关文章推荐
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
详解Java实践之抽象工厂模式
Jun 18 Java/Android
详解Java线程池是如何重复利用空闲线程的
Jun 26 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
logback 实现给变量指定默认值
Aug 30 Java/Android
Java异常处理try catch的基本用法
Dec 06 Java/Android
java代码实现空间切割
Jan 18 Java/Android
Java虚拟机内存结构及编码实战分享
Apr 07 Java/Android
Java 关于String字符串原理上的问题
Apr 07 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
基于Android10渲染Surface的创建过程
Aug 14 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函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
jsonp原理及使用
2013/10/28 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jQuery.each使用详解
2015/07/07 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
解析Python中while true的使用
2015/10/13 Python
Python常用知识点汇总
2016/05/08 Python
代码分析Python地图坐标转换
2018/02/08 Python
谈谈python中GUI的选择
2018/03/01 Python
python skimage 连通性区域检测方法
2018/06/21 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
利用python进行文件操作
2020/12/04 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
C语言笔试题
2014/09/04 面试题
4s店总经理岗位职责
2013/12/31 职场文书
2015大学迎新标语
2015/07/16 职场文书
信息技术研修心得体会
2016/01/08 职场文书
同学聚会开幕词
2019/04/02 职场文书