获取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 分钟前
Spring Boot拦截器结合HMAC-SHA256实现API安全验证
后端
想不明白的过度思考者8 分钟前
基于 Spring Boot 的 Web 三大核心交互案例精讲
前端·spring boot·后端·交互·javaee
程序员爱钓鱼16 分钟前
Python编程实战:Python常用命令速查表(超全整理)
后端·python·trae
程序员爱钓鱼18 分钟前
Python 编程实战:常用第三方库清单
后端·python·trae
程序员三明治20 分钟前
【Spring进阶】Spring IOC实现原理是什么?容器创建和对象创建的时机是什么?
java·后端·spring·ioc·bean生命周期
Victor3561 小时前
Redis(142)Redis的Cluster的主从复制是如何实现的?
后端
e***58231 小时前
Spring Cloud GateWay搭建
android·前端·后端
Victor3561 小时前
Redis(143)Redis的Cluster的重新分片是如何实现的?
后端
x***13394 小时前
【MyBatisPlus】MyBatisPlus介绍与使用
android·前端·后端
f***68606 小时前
【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)
java·spring boot·后端