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 相关文章推荐
总结一下关于在Java8中使用stream流踩过的一些坑
Jun 24 Java/Android
详解Java线程池是如何重复利用空闲线程的
Jun 26 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
Java基础之详解HashSet的使用方法
Jun 30 Java/Android
springboot 启动如何排除某些bean的注入
Aug 02 Java/Android
Spring Security中用JWT退出登录时遇到的坑
Oct 16 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Java8 CompletableFuture 异步回调
Apr 28 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 Java/Android
Java时间工具类Date的常用处理方法
May 25 Java/Android
Java处理延时任务的常用几种解决方案
Jun 01 Java/Android
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
Jun 01 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
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php中常用的预定义变量小结
2012/05/09 PHP
php post换行的方法
2020/02/03 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
python调用cmd复制文件代码分享
2013/12/27 Python
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
bpython 功能强大的Python shell
2016/02/16 Python
python实现周期方波信号频谱图
2018/07/21 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
python GUI模拟实现计算器
2020/06/22 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
专科毕业生自我鉴定
2013/12/01 职场文书
日语专业毕业生求职信
2013/12/04 职场文书
人事专员工作职责
2014/02/22 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
环境整治工作方案
2014/05/18 职场文书
党员承诺践诺书
2014/05/20 职场文书
会员卡清退活动总结
2014/08/27 职场文书
单位介绍信格式范文
2015/05/04 职场文书
校园开放日新闻稿
2015/07/17 职场文书
怎么用Python识别手势数字
2021/06/07 Python