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

相关推荐
点光6 小时前
使用Sentinel作为Spring Boot应用限流组件
后端
不要秃头啊6 小时前
别再谈提效了:AI 时代的开发范式本质变了
前端·后端·程序员
有志7 小时前
Java 项目添加慢 SQL 查询工具实践
后端
山佳的山7 小时前
KingbaseES 共享锁(SHARE)与排他锁(EXCLUSIVE)详解及测试复现
后端
Leo8997 小时前
rust 从零单排 之 一战到底
后端
程序员清风8 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
鱼人9 小时前
MySQL 实战入门:从“增删改查”到“高效查询”的核心指南
后端
大鹏19889 小时前
告别 Session:Spring Boot 实现 JWT 无状态登录认证全攻略
后端
Java编程爱好者9 小时前
从 AQS 到 ReentrantLock:搞懂同步队列与条件队列,这一篇就够了
后端
鱼人9 小时前
Nginx 全能指南:从反向代理到负载均衡,一篇打通任督二脉
后端