获取Spring当前配置的2种方式

获取Spring当前配置的2种方式

获取配置名称的2种方式

  1. 通过@Value注解获取
  2. 通过Environment类获取

代码示例如下

java 复制代码
package org.example.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
@Slf4j
public class Config1 implements InitializingBean, EnvironmentAware {
    // 如果没有配置会报错,所以必须指定默认值
    @Value("${spring.profiles.active:''}")
    private String envName;
    @Value("${spring.application.name:''}")
    private String appName;
    private Environment environment;

    // 使用注入的方式也可以获取到 Environment 对象
    //@Resource
    //private Environment environment2;


    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("[环境名称]通过Value注解获取 = {}", envName);
        log.info("[应用名称]通过Value注解获取 = {}", appName);
        String property = environment.getProperty("spring.application.name");
        log.info("[应用名称]通过environment获取 = {}", property);
        String[] activeProfiles = environment.getActiveProfiles();
        String[] defaultProfiles = environment.getDefaultProfiles();
        if (activeProfiles.length > 0) {
            log.info("[环境名称]通过environment获取 = {}", activeProfiles[0]);
        } else {
            log.info("[activeProfiles为空]");
        }
        if (defaultProfiles.length > 0) {
            log.info("[环境名称]通过environment获取 = {}", defaultProfiles[0]);
        } else {
            log.info("defaultProfiles为空");
        }
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
}

运行Application

java 复制代码
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

可以得到如下结果

scss 复制代码
[环境名称]通过Value注解获取 = ''
[应用名称]通过Value注解获取 = spring-profiles-test-default
[应用名称]通过environment获取 = spring-profiles-test-default
[activeProfiles为空]
[环境名称]通过environment获取 = default

注意

默认启动应用时,我们并未显式的指定任何profiles名称。这是Spring默认是default。如果使用@Profile注解激活需要这样使用

java 复制代码
@Profile({"default"})

需要注意的是,默认启动应用时。使用@Value("${spring.profiles.active}")这种方式并不能获取到环境的名称,因为我们没有在任何地方定义spring.profiles.active这个变量。所以需要指定默认值,否则会报错。

思考

思考:哪些应用场景下,我们需要获取当前配置的名称。

  • 某段代码不想放到生产环境中,但在测试环境由于某些原因又必须需要(比如方便快速定位bug等原因)
  • 开发一款插件,对外提供高度定制化的配置项

假如我们要开发一款插件(或者别的项目),打包成jar包放到maven仓库供全网程序猿使用。比如pagehelper这样有修改的插件。那插件中一定会暴露出很多配置项供开发者选择。假设我们现在有一个需求,这个插件只能在非生产环境运行。该怎么办呢?解决思路其实很简单,就是动态配置

动态配置

如何做到动态配置呢。比如这里我开发一个插件是ibatistools,我们可以预留一个配置项activeEnv------表示在哪些环境下可以激活,这样我们就可以读取application.yml来获取activeEnv的值。

本文由mdnice多平台发布

相关推荐
程序员三明治29 分钟前
选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
java·redis·后端·缓存·rocketmq·stream·队列
cj6341181505 小时前
【MySQL】mysqldump使用方法
java·后端
JIngJaneIL5 小时前
停车场管理|停车预约管理|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·停车场管理系统
雪域迷影6 小时前
Go语言中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·后端·http·golang·get
于小汐在咯9 小时前
深入浅出:增强现实(AR)技术全解析
后端·ar·restful
爱上妖精的尾巴9 小时前
5-27 WPS JS宏数组元素添加删除应用2
后端·restful·wps·js宏
努力的小郑9 小时前
与产品经理的“模糊”对决:Elasticsearch实现MySQL LIKE '%xxx%' 的奇幻之旅
后端·elasticsearch·搜索引擎
一 乐10 小时前
物业管理系统|小区物业管理|基于SprinBoot+vue的小区物业管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
稚辉君.MCA_P8_Java10 小时前
RocketMQ 是什么?它的架构是怎么样的?和 Kafka 又有什么区别?
后端·架构·kafka·kubernetes·rocketmq
yolo_Yang10 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·后端