欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Spring獲取配置的三種方式

 更新時間:2022年03月08日 08:30:50   作者:cartoon  
這篇文章主要為大家詳細介紹了Spring獲取配置的三種方式:@Value方式動態(tài)獲取單個配置、@ConfigurationProperties+前綴方式批量獲取配置以及Environment動態(tài)獲取單個配置,感興趣的可以了解一下

前言

最近在寫框架時遇到需要根據(jù)特定配置(可能不存在)加載 bean 的需求,所以就學習了下 Spring 中如何獲取配置的幾種方式。

Spring 中獲取配置的三種方式

  • 通過 @Value 方式動態(tài)獲取單個配置
  • 通過 @ConfigurationProperties + 前綴方式批量獲取配置
  • 通過 Environment 動態(tài)獲取單個配置

通過 @Value 動態(tài)獲取單個配置

1.作用

可修飾到任一變量獲取,使用較靈活

2.優(yōu)點

使用簡單,且使用關聯(lián)的鏈路較短

3.缺點

  • 配置名不能被有效枚舉到
  • 每一個配置的使用都需重新定義,使用較為麻煩
  • 項目強依賴配置的定義,配置不存在則會導致項目無法啟動

4.使用場景

  • 項目強依賴該配置的加載,想要從源頭避免因配置缺失導致的未知問題
  • 只想使用少數(shù)幾個配置

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 = LoggerFactory.getLogger(MultipartGetConfigTest.class);

    @Autowired
    private ConfigByValueAnnotation configByValueAnnotation;

    @Test
    public void getByValueAnnotation(){
        log.info("get by @Value, value: {}", configByValueAnnotation.getServerPort());
    }
}

7.測試結(jié)果

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

通過@ConfigurationProperties+前綴方式批量獲取

1.作用

用于配置類的修飾或批量配置的獲取

2.優(yōu)點

  • 使用配置只需確定 key 的前綴即能使用,有利于批量獲取場景的使用
  • 因采用前綴匹配,所以在使用新的相同前綴 key 的配置時無需改動代碼

3.缺點

  • 使用復雜,需定義配置類或者手動創(chuàng)建 bean 后引入使用
  • 增加新的前綴相同 key 時可能會引入不穩(wěn)定因素

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 = 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.測試結(jié)果

org.spring.demo.MultipartGetConfigTest   : get by @ConfigurationProperties, value: 7100
org.spring.demo.MultipartGetConfigTest   : get by @ConfigurationProperties and manual create bean, value: 7100

通過 Environment 動態(tài)獲取單個配置

1.作用

用于動態(tài)在程序代碼中獲取配置,而配置 key 不需提前定義

2.優(yōu)點

  • 獲取的配置的 key 可不提前定義,程序靈活性高
  • 配置 key 可使用枚舉統(tǒng)一放置與管理

3.缺點

  • 使用較復雜,需繼承 Environment 接口形成工具類進行獲取
  • 獲取 key 對應的枚舉與 key 定義分離,value 獲取鏈路較長

4.使用場景

  • 只需使用少量的配置
  • 獲取配置的 key 無提前定義,需要根據(jù)對配置的有無進行靈活使用

5.代碼示例

@Component
public 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.測試結(jié)果

org.spring.demo.MultipartGetConfigTest   : get by environment, value: 7100

總結(jié)

獲取配置方式優(yōu)點缺點使用場景
通過 @Value 動態(tài)獲取單個配置使用簡單,且使用關聯(lián)的鏈路較短1. 配置名不能被有效枚舉到
2. 每一個配置的使用都需重新定義,使用較為麻煩
3. 項目強依賴配置的定義,配置不存在則會導致項目無法啟動
1. 項目強依賴該配置的加載,想要從源頭避免因配置缺失導致的未知問題
2. 只想使用少數(shù)幾個配置
通過 @ConfigurationProperties + 前綴方式批量獲取1. 使用配置只需確定 key 的前綴即能使用,有利于批量獲取場景的使用
2. 因采用前綴匹配,所以在使用新的相同前綴 key 的配置時無需改動代碼
1. 使用復雜,需定義配置類或者手動創(chuàng)建 bean 后引入使用
2. 增加新的前綴相同 key 時可能會引入不穩(wěn)定因素
1. 需要同時使用多前綴相同 key 的配置
2. 期望增加新配置但不修改代碼的 properties 注入
通過 Environment 動態(tài)獲取單個配置1. 獲取的配置的 key 可不提前定義,程序靈活性高
2. 配置 key 可使用枚舉統(tǒng)一放置與管理
1. 使用較復雜,需繼承 Environment 接口形成工具類進行獲取
2. 獲取 key 對應的枚舉與 key 定義分離,value 獲取鏈路較長
1. 只需使用少量的配置
2. 獲取配置的 key 無提前定義,需要根據(jù)對配置的有無進行靈活使用

以上就是詳解Spring獲取配置的三種方式的詳細內(nèi)容,更多關于Spring 獲取配置的資料請關注腳本之家其它相關文章!

相關文章

  • Java跨平臺原理與虛擬機相關簡介

    Java跨平臺原理與虛擬機相關簡介

    這篇文章主要介紹了Java跨平臺原理與虛擬機的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 深入理解Java中的類加載器原理

    深入理解Java中的類加載器原理

    這篇文章主要介紹了深入理解Java中的類加載器原理,類加載器負責加載所有的類,系統(tǒng)為所有被載入內(nèi)存中的類生成一個java.lang.Class實例,需要的朋友可以參考下
    2024-01-01
  • SpringMVC異常處理的三種方式小結(jié)

    SpringMVC異常處理的三種方式小結(jié)

    本文主要介紹了SpringMVC異常處理的三種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 關于Spring Cloud健康檢查的陷阱

    關于Spring Cloud健康檢查的陷阱

    這篇文章主要介紹了關于Spring Cloud健康檢查的陷阱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 一篇文章帶你搞定JAVA注解

    一篇文章帶你搞定JAVA注解

    這篇文章主要介紹了詳解Java注解的實現(xiàn)與使用方法的相關資料,希望通過本文大家能夠理解掌握Java注解的知識,需要的朋友可以參考下
    2021-07-07
  • springboot跨域CORS處理代碼解析

    springboot跨域CORS處理代碼解析

    這篇文章主要介紹了springboot跨域CORS處理代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式實例

    SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式實例

    最近在項目開發(fā)中,需要為一個使用MySQL數(shù)據(jù)庫的SpringBoot項目,新添加一個PLSQL數(shù)據(jù)庫數(shù)據(jù)源,下面這篇文章主要給大家介紹了關于SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式,需要的朋友可以參考下
    2022-04-04
  • druid配置數(shù)據(jù)庫連接使用密文密碼方式

    druid配置數(shù)據(jù)庫連接使用密文密碼方式

    這篇文章主要介紹了druid配置數(shù)據(jù)庫連接使用密文密碼方式,具有很好的參考價值,希望對大家有所幫助,
    2023-12-12
  • Java實現(xiàn)設計模式之責任鏈模式

    Java實現(xiàn)設計模式之責任鏈模式

    責任鏈模式是一種行為設計模式,允許你將請求沿著處理鏈發(fā)送,然后處理者都可對其進行處理,完成后可以再將其傳遞給下一個處理者。下面將會舉例說明什么是責任鏈模式,責任鏈模式該如何使用
    2022-08-08
  • 詳細說明關于Java的數(shù)據(jù)庫連接(JDBC)

    詳細說明關于Java的數(shù)據(jù)庫連接(JDBC)

    這篇文章主要介紹了詳細說明關于Java的數(shù)據(jù)庫連接JDBC,JDBC是用Java語言向數(shù)據(jù)庫發(fā)送SQL語句,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09

最新評論