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基于webSocket实现扫码登录
Jun 22 Java/Android
基于Java的MathML转图片的方法(示例代码)
Jun 23 Java/Android
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
Java反应式框架Reactor中的Mono和Flux
Jul 25 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
Jul 26 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
Java数据结构之堆(优先队列)
May 20 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
php实现模拟post请求用法实例
2015/07/11 PHP
php开发工具有哪五款
2015/11/09 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
Python实现截屏的函数
2015/07/26 Python
名片管理系统python版
2018/01/11 Python
django ajax json的实例代码
2018/05/29 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
护理职业生涯规划书
2014/01/24 职场文书
高等教育学自荐书范文
2014/02/10 职场文书
社会工作专业自荐信
2014/09/26 职场文书
老公保证书怎么写
2015/02/26 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
JavaScript实现优先级队列
2021/12/06 Javascript