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 相关文章推荐
Spring mvc是如何实现与数据库的前后端的连接操作的?
Jun 30 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
浅谈Java父子类加载顺序
Aug 04 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
Aug 30 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
JPA 通过Specification如何实现复杂查询
Nov 23 Java/Android
SpringBoot整合minio快速入门教程(代码示例)
Apr 03 Java/Android
Android Flutter实现图片滑动切换效果
Apr 07 Java/Android
Java虚拟机内存结构及编码实战分享
Apr 07 Java/Android
Java由浅入深通关抽象类与接口(上篇)
Apr 26 Java/Android
一文搞懂Java中的注解和反射
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生成局部唯一识别码LUID的代码
2012/10/06 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python中关于使用模块的基础知识
2015/05/24 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
django rest framework 过滤时间操作
2020/07/12 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
旅游管理毕业生自荐信
2013/11/05 职场文书
党风廉设责任书
2014/04/16 职场文书
公司委托书格式
2014/08/01 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle