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 相关文章推荐
Java实现斗地主之洗牌发牌
Jun 14 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
图解排序算法之希尔排序Java实现
Jun 26 Java/Android
Spring-cloud Config Server的3种配置方式
Sep 25 Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 Java/Android
Springboot如何同时装配两个相同类型数据库
Nov 17 Java/Android
springboot新建项目pom.xml文件第一行报错的解决
Jan 18 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
JAVA springCloud项目搭建流程
May 11 Java/Android
Springboot集成kafka高级应用实战分享
Aug 14 Java/Android
Spring Boot实现文件上传下载
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
Terran兵种对照表
2020/03/14 星际争霸
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
python在文本开头插入一行的实例
2018/05/02 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
python无序链表删除重复项的方法
2020/01/17 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
商务专员岗位职责
2013/11/23 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
企业消防安全制度
2014/02/02 职场文书
入股合作协议书
2014/10/12 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
小学毕业教师寄语
2019/06/21 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
如何用Python搭建gRPC服务
2021/06/30 Python