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并发编程必备之Future机制
Jun 30 Java/Android
Java生成读取条形码和二维码的简单示例
Jul 09 Java/Android
JavaWeb 入门:Hello Servlet
Jul 16 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
Jul 16 Java/Android
gateway与spring-boot-starter-web冲突问题的解决
Jul 16 Java/Android
Java spring定时任务详解
Oct 05 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
Java实现简单小画板
Jun 10 Java/Android
Spring Security动态权限的实现方法详解
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实现简易计算器功能
2020/08/28 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
Javascript 错误处理的几种方法
2009/06/13 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
python 测试实现方法
2008/12/24 Python
Python编写一个闹钟功能
2017/07/11 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Python I/O与进程的详细讲解
2019/03/08 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python接收手机短信的代码整理
2020/08/02 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
大学本科毕业生求职信范文
2013/12/18 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
关于环保的建议书
2014/05/12 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
绵山导游词
2015/02/05 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers