获取Spring当前配置的2种方式
获取配置名称的2种方式
- 通过@Value注解获取
- 通过
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多平台发布