最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

Spring 中獲取配置的三種方式

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

通過 @Value 動(dòng)態(tài)獲取單個(gè)配置

1.作用

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

2.優(yōu)點(diǎn)

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

3.缺點(diǎn)

  • 配置名不能被有效枚舉到
  • 每一個(gè)配置的使用都需重新定義,使用較為麻煩
  • 項(xiàng)目強(qiáng)依賴配置的定義,配置不存在則會(huì)導(dǎo)致項(xiàng)目無法啟動(dòng)

4.使用場景

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

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)點(diǎn)

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

3.缺點(diǎn)

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

4.使用場景

  • 需要同時(shí)使用多前綴相同 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 動(dòng)態(tài)獲取單個(gè)配置

1.作用

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

2.優(yōu)點(diǎn)

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

3.缺點(diǎn)

  • 使用較復(fù)雜,需繼承 Environment 接口形成工具類進(jìn)行獲取
  • 獲取 key 對(duì)應(yīng)的枚舉與 key 定義分離,value 獲取鏈路較長

4.使用場景

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

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

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

相關(guān)文章

  • Java后端長時(shí)間無操作自動(dòng)退出的實(shí)現(xiàn)方式

    Java后端長時(shí)間無操作自動(dòng)退出的實(shí)現(xiàn)方式

    這篇文章主要介紹了Java后端長時(shí)間無操作自動(dòng)退出的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java多線程中的wait/notify通信模式實(shí)例詳解

    Java多線程中的wait/notify通信模式實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Java多線程中wait/notify通信模式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 一行命令同時(shí)修改maven項(xiàng)目中多個(gè)module的版本號(hào)的方法

    一行命令同時(shí)修改maven項(xiàng)目中多個(gè)module的版本號(hào)的方法

    這篇文章主要介紹了一行命令同時(shí)修改maven項(xiàng)目中多個(gè)module的版本號(hào)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • Java詳細(xì)分析LCN框架分布式事務(wù)

    Java詳細(xì)分析LCN框架分布式事務(wù)

    這篇文章主要介紹了Java LCN框架分布式事務(wù),分布式事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上
    2022-07-07
  • java中fork-join的原理解析

    java中fork-join的原理解析

    Fork/Join框架是Java7提供用于并行執(zhí)行任務(wù)的框架,是一個(gè)把大任務(wù)分割成若干個(gè)小任務(wù),今天通過本文給大家分享java中fork join原理,感興趣的朋友一起看看吧
    2021-04-04
  • java將word轉(zhuǎn)pdf的方法示例詳解

    java將word轉(zhuǎn)pdf的方法示例詳解

    這篇文章主要介紹了java將word轉(zhuǎn)pdf的相關(guān)資料,文中講解了使用Aspose-Words工具將Word文檔轉(zhuǎn)換為PDF的優(yōu)劣,并提供了一種在Java項(xiàng)目中使用Aspose-Words進(jìn)行Word轉(zhuǎn)PDF的示例方法,需要的朋友可以參考下
    2025-01-01
  • SpringBoot中@Transiactional注解沒有效果的解決

    SpringBoot中@Transiactional注解沒有效果的解決

    這篇文章主要介紹了SpringBoot中@Transiactional注解沒有效果的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java注解簡單使用實(shí)例解析

    Java注解簡單使用實(shí)例解析

    這篇文章主要介紹了Java注解簡單使用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫分表的示例代碼

    SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫分表的示例代碼

    本文主要介紹了SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫分表的示例代碼,以分庫,分表,分庫分表三種方式來實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java讀取文件的簡單實(shí)現(xiàn)方法

    Java讀取文件的簡單實(shí)現(xiàn)方法

    這篇文章主要介紹了Java讀取文件的簡單實(shí)現(xiàn)方法,通過一個(gè)讀取txt格式的log文件為例,詳細(xì)的講述了Java讀取文件的方法及原理,需要的朋友可以參考下
    2014-09-09

最新評(píng)論

卓尼县| 西藏| 皋兰县| 永定县| 商洛市| 北辰区| 临泽县| 乌兰察布市| 元阳县| 平和县| 会理县| 阿勒泰市| 施秉县| 清丰县| 铜陵市| 富民县| 平和县| 泰安市| 新密市| 中山市| 张北县| 宁海县| 绥芬河市| 双流县| 治县。| 黔西县| 鄂温| 武功县| 开远市| 河池市| 邵武市| 苏尼特右旗| 车险| 长春市| 成安县| 区。| 驻马店市| 莱西市| 天气| 甘德县| 绍兴市|