spring 获取配置参数,spring获取配置文件

  spring 获取配置参数,spring获取配置文件

  00-1010序Spring获取配置的三种方式:通过@Value动态获取单个配置,通过@ConfigurationProperties前缀批量获取,通过环境动态获取单个配置汇总

  

目录

最近在写框架的时候,遇到了需要根据一个特定的配置(可能不存在)来加载bean,于是在接下来的春天,我学习了几种如何获取配置的方法。

 

  00-1010通过@Value动态获取单个配置,通过@ConfigurationProperties前缀批量获取配置,通过环境动态获取单个配置

  00-1010 1.功能

  它可以修改为任何变量,使用灵活。

  2.优势

  使用简单,关联链接短。

  3.不足之处

  配置的名称无法有效枚举,每个配置的使用都需要重新定义。麻烦项目的使用很大程度上取决于配置的定义。如果配置不存在,项目将无法启动。4.使用场景

  项目对这个配置的加载有很强的依赖性,想从源头上避免配置缺失导致的未知问题,只想使用少数配置。5.代码示例

  @ configuration public class ConfigByValueAnnotation { @ Value( $ { server . port } )私有字符串server port;公共字符串getserver port(){ return server port;}}6.试验码

  @ display name( multipart get config )@ spring boot test public class MultipartGetConfigTest { private static final Logger log=Logger factory . get Logger(MultipartGetConfigTest . class);@ auto wired private ConfigByValueAnnotation ConfigByValueAnnotation;@ Test public void getByValueAnnotation(){ log . info( get by @ Value,value: {} ,configbyvalueannotation . getserver port());}}7.试验结果

  org . spring . demo . multipartgetconfigtest : get by @ Value,value: 7100

  00-1010 1.功能

  用于配置类的装饰或批量配置的获取。

  2.优势

  该配置只需确定密钥的前缀即可使用,有利于批量采集场景的使用。因为采用了前缀匹配,所以在使用相同前缀键的新配置时,不需要更改代码。3.不足之处

  使用复杂,需要定义配置类或者手动创建bean再引入。使用相同的密钥添加新前缀可能会导致不稳定。4.使用场景

  需要同时使用多个前缀和同一个键的配置期望添加新的配置,但是不修改代码的属性注入。5.代码示例

  @ Component @ configuration properties(prefix= server ,ignoreInvalidFields=true)公共类ConfigByConfigurationProperties { private Integer port;公共整数get port(){ return port;} public ConfigByConfigurationProperties setPort(整数端口){ this.port=port还这个;}}@Configurationpublic类configbyconfigurationproperties v2 { @ Bean( configByValueAnnotationV2 )@ configuration Properties(前缀= server 2 )public Properties Properties(){ ret

  urn new Properties(); }}6.测试代码

  

@DisplayName("multipart get config")@SpringBootTestpublic class MultipartGetConfigTest { private static final Logger log = LoggerFactory.getLogger(MultipartGetConfigTest.class); @Autowired private ConfigByConfigurationProperties configByConfigurationProperties; @Autowired @Qualifier("configByValueAnnotationV2") private Properties properties; @Test public void getByConfigurationProperties(){ log.info("get by @ConfigurationProperties, value: {}", configByConfigurationProperties.getPort()); log.info("get by @ConfigurationProperties and manual create bean, value: {}", properties.getProperty("port")); }}

7.测试结果

 

  

org.spring.demo.MultipartGetConfigTest : get by @ConfigurationProperties, value: 7100org.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.代码示例

  

@Componentpublic class ConfigByEnvironment implements EnvironmentAware { private static final Logger log = LoggerFactory.getLogger(ConfigByEnvironment.class); private Environment environment; public Optional<String> get(String configKey){ String config = environment.getProperty(configKey); return Objects.isNull(config) ? Optional.empty() : 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) { this.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 = LoggerFactory.getLogger(MultipartGetConfigTest.class); @Autowired private ConfigByEnvironment configByEnvironment; @Test public void getByEnvironment(){ configByEnvironment.get(ConfigByEnvironmentKey.SERVER_PORT.getKey()).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. 期望增加新配置但不修改代码的 properties 注入通过 Environment 动态获取单个配置1. 获取的配置的 key 可不提前定义,程序灵活性高2. 配置 key 可使用枚举统一放置与管理1. 使用较复杂,需继承 Environment 接口形成工具类进行获取2. 获取 key 对应的枚举与 key 定义分离,value 获取链路较长1. 只需使用少量的配置2. 获取配置的 key 无提前定义,需要根据对配置的有无进行灵活使用以上就是详解Spring获取配置的三种方式的详细内容,更多关于Spring 获取配置的资料请关注盛行IT其它相关文章!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: