获取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多平台发布

相关推荐
机器之心1 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
.生产的驴2 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲2 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端
机器之心2 小时前
AAAI 2025|时间序列演进也是种扩散过程?基于移动自回归的时序扩散预测模型
人工智能·后端
hanglove_lucky3 小时前
本地摄像头视频流在html中打开
前端·后端·html
皓木.4 小时前
(自用)配置文件优先级、SpringBoot原理、Maven私服
java·spring boot·后端
i7i8i9com5 小时前
java 1.8+springboot文件上传+vue3+ts+antdv
java·spring boot·后端
秋意钟5 小时前
Spring框架处理时间类型格式
java·后端·spring
我叫啥都行5 小时前
计算机基础复习12.22
java·jvm·redis·后端·mysql
Stark、5 小时前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端