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将文件打包成zip存放或导出
Jun 11 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
Spring Cloud Gateway去掉url前缀
Jul 15 Java/Android
idea 在springboot中使用lombok插件的方法
Aug 02 Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
Java实现二分搜索树的示例代码
Mar 17 Java/Android
Java基础——Map集合
Apr 01 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
Jun 14 Java/Android
Java实现注册登录跳转
Jun 16 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
浅谈js的异步执行
2016/10/18 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python获取网页状态码示例
2014/03/30 Python
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
澳大利亚首屈一指的在线购物目的地:Kogan.com
2017/02/02 全球购物
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
个人自荐信
2013/12/05 职场文书
装饰活动策划方案
2014/02/11 职场文书
建筑投标担保书
2014/05/20 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
客房部经理岗位职责
2015/02/02 职场文书