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

相关推荐
用户1474853079741 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1231 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething3652 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
一个做软件开发的牛马2 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
码事漫谈2 小时前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队
后端
吃饱了得干活2 小时前
深入解析 OpenFeign:从重试、拦截到负载均衡的全维度实践
后端
onething3652 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 6 —— 业务完善 + 会话消息预览
人工智能·后端·全栈
BingoGo2 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack3 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
IT_陈寒3 小时前
SpringBoot自动配置的坑,我爬了三天才出来
前端·人工智能·后端