详解Spring获取配置的三种⽅式
⽬录
前⾔
Spring中获取配置的三种⽅式
通过@Value动态获取单个配置
通过@ConfigurationProperties+前缀⽅式批量获取
通过Environment动态获取单个配置
总结
前⾔
最近在写框架时遇到需要根据特定配置(可能不存在)加载 bean 的需求,所以就学习了下 Spring 中如何获取配置的⼏种⽅式。
Spring 中获取配置的三种⽅式
通过 @Value ⽅式动态获取单个配置
通过 @ConfigurationProperties + 前缀⽅式批量获取配置
通过 Environment 动态获取单个配置
通过 @Value 动态获取单个配置
1.作⽤
可修饰到任⼀变量获取,使⽤较灵活
2.优点
使⽤简单,且使⽤关联的链路较短
3.缺点
配置名不能被有效枚举到
每⼀个配置的使⽤都需重新定义,使⽤较为⿇烦
项⽬强依赖配置的定义,配置不存在则会导致项⽬⽆法启动
4.使⽤场景
项⽬强依赖该配置的加载,想要从源头避免因配置缺失导致的未知问题
只想使⽤少数⼏个配置
5.代码⽰例
@Configuration
public class ConfigByValueAnnotation {
@Value("${server.port}")
private String serverPort;
public String getServerPort() {
return serverPort;
}
}
6.测试代码
@DisplayName("multipart get config")
@SpringBootTest
public class MultipartGetConfigTest {
private static final Logger log = Logger(MultipartGetConfigTest.class);
@Autowired
private ConfigByValueAnnotation configByValueAnnotation;
@Test
public void getByValueAnnotation(){
log.info("get by @Value, value: {}", ServerPort());
}
}
7.测试结果
org.spring.demo.MultipartGetConfigTest  : get by @Value, value: 7100
通过@ConfigurationProperties+前缀⽅式批量获取1.作⽤
⽤于配置类的修饰或批量配置的获取
2.优点
使⽤配置只需确定 key 的前缀即能使⽤,有利于批量获取场景的使⽤
因采⽤前缀匹配,所以在使⽤新的相同前缀 key 的配置时⽆需改动代码3.缺点
使⽤复杂,需定义配置类或者⼿动创建 bean 后引⼊使⽤
增加新的前缀相同 key 时可能会引⼊不稳定因素
4.使⽤场景
需要同时使⽤多前缀相同 key 的配置
期望增加新配置但不修改代码的 properties 注⼊
5.代码⽰例
@Component
@ConfigurationProperties(prefix = "server", ignoreInvalidFields = true)
public class ConfigByConfigurationProperties {
private Integer port;
public Integer getPort() {
return port;
}
public ConfigByConfigurationProperties setPort(Integer port) {
this.port = port;
return this;
}
}
@Configuration
public class ConfigByConfigurationPropertiesV2 {
@Bean("configByValueAnnotationV2")
@ConfigurationProperties(prefix = "server2")
public Properties properties(){
return new Properties();
}
}
6.测试代码
@DisplayName("multipart get config")
@SpringBootTest
public class MultipartGetConfigTest {
private static final Logger log = Logger(MultipartGetConfigTest.class);
@Autowired
private ConfigByConfigurationProperties configByConfigurationProperties;
@Autowired
@Qualifier("configByValueAnnotationV2")
private Properties properties;
@Test
public void getByConfigurationProperties(){
log.info("get by @ConfigurationProperties, value: {}", Port());
log.info("get by @ConfigurationProperties and manual create bean, value: {}", Property("port"));
}
}
7.测试结果
org.spring.demo.MultipartGetConfigTest  : get by @ConfigurationProperties, value: 7100
org.spring.demo.MultipartGetConfigTest  : get by @ConfigurationProperties and manual create bean, value: 7100
通过 Environment 动态获取单个配置
1.作⽤
⽤于动态在程序代码中获取配置,⽽配置 key 不需提前定义
2.优点
获取的配置的 key 可不提前定义,程序灵活性⾼
配置 key 可使⽤枚举统⼀放置与管理
3.缺点
使⽤较复杂,需继承 Environment 接⼝形成⼯具类进⾏获取
获取 key 对应的枚举与 key 定义分离,value 获取链路较长
4.使⽤场景
只需使⽤少量的配置
获取配置的 key ⽆提前定义,需要根据对配置的有⽆进⾏灵活使⽤
5.代码⽰例
@Component
public class ConfigByEnvironment implements EnvironmentAware {
private static final Logger log = Logger(ConfigByEnvironment.class);
private Environment environment;
public Optional<String> get(String configKey){
String config = Property(configKey);
return Objects.isNull(config) ? pty() : Optional.of(config);
}
public void get(String configKey, Consumer<String> consumer){
Optional<String> config = get(configKey);
if(!config.isPresent()){
log.warn("application config, get config by key fail, key: {}", configKey);
}
config.ifPresent(consumer);
}
@Override
public void setEnvironment(@NonNull Environment environment) {
}
}
public enum ConfigByEnvironmentKey {
SERVER_PORT("server.port", "server port");
private String key;
private String description;
ConfigByEnvironmentKey(String key, String description) {
this.key = key;
this.description = description;
}
public String getKey() {
return key;
}
public String getDescription() {
return description;
}
}
6.测试代码
@DisplayName("multipart get config")
@SpringBootTest
public class MultipartGetConfigTest {
private static final Logger log = Logger(MultipartGetConfigTest.class);
@Autowired
private ConfigByEnvironment configByEnvironment;
@Test
public void getByEnvironment(){
<(ConfigByEnvironmentKey.Key()).ifPresent(value -> log.info("get by environment, value: {}", value));      }
}
7.测试结果
org.spring.demo.MultipartGetConfigTest  : get by environment, value: 7100
总结
获取配置⽅式优点缺点使⽤场景
通过 @Value 动态获取单个配置使⽤简单,且使⽤关联的链路较
1. 配置名不能被有效枚举到
2. 每⼀个配置的使⽤都需重
新定义,使⽤较为⿇烦
3. 项⽬强依赖配置的定义,
配置不存在则会导致项⽬⽆
法启动
1. 项⽬强依赖该配置的加载,想
要从源头避免因配置缺失导致的
未知问题
2. 只想使⽤少数⼏个配置
通过
@ConfigurationProperties + 前缀⽅式批量获取1. 使⽤配置只需确定 key 的前缀
即能使⽤,有利于批量获取场景
的使⽤
2. 因采⽤前缀匹配,所以在使⽤
新的相同前缀 key 的配置时⽆需
改动代码
1. 使⽤复杂,需定义配置类
或者⼿动创建 bean 后引⼊
使⽤
2. 增加新的前缀相同 key 时
可能会引⼊不稳定因素
1. 需要同时使⽤多前缀相同 key
的配置
2. 期望增加新配置但不修改代码
实例化bean的三种方式的 properties 注⼊
通过 Environment 动态获取单个配置1. 获取的配置的 key 可不提前定
义,程序灵活性⾼
2. 配置 key 可使⽤枚举统⼀放置
与管理
1. 使⽤较复杂,需继承
Environment 接⼝形成⼯具
类进⾏获取
2. 获取 key 对应的枚举与
key 定义分离,value 获取链
路较长
1. 只需使⽤少量的配置
2. 获取配置的 key ⽆提前定义,
需要根据对配置的有⽆进⾏灵活
使⽤
以上就是详解Spring获取配置的三种⽅式的详细内容,更多关于Spring 获取配置的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。