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 相关文章推荐
Win10系统下配置Java环境变量
Jun 13 Java/Android
教你用Java在个人电脑上实现微信扫码支付
Jun 13 Java/Android
Java常用函数式接口总结
Jun 29 Java/Android
java实现对Hadoop的操作
Jul 01 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
Java 获取Word中所有的插入和删除修订的方法
Apr 06 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
Java死锁的排查
May 11 Java/Android
spring IOC容器的Bean管理XML自动装配过程
May 30 Java/Android
OpenFeign实现远程调用
Aug 14 Java/Android
Springboot集成kafka高级应用实战分享
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
对javascript和select部件的结合运用
2006/10/09 PHP
一个基于PDO的数据库操作类
2011/03/24 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
python中yield的用法详解
2021/01/13 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
网络安全方面的面试题
2015/11/04 面试题
高职教师岗位职责
2013/12/24 职场文书
音乐器材管理制度
2014/01/31 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
21岁生日感言
2014/02/27 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js
Go 内联优化让程序员爱不释手
2022/06/21 Golang