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

SpringBoot?常用讀取配置文件的三種方法詳解

 更新時(shí)間:2022年09月28日 09:29:03   作者:雨點(diǎn)的名字  
這篇文章主要介紹了SpringBoot?常用讀取配置文件的3種方法,通過(guò)本文學(xué)習(xí)可以解決Spring Boot有哪些常用的讀取配置文件方式,一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如list,map如何配置,帶著這些問(wèn)題一起通過(guò)本文學(xué)習(xí)吧

我們?cè)赟pringBoot框架進(jìn)行項(xiàng)目開(kāi)發(fā)中該如何優(yōu)雅的讀取配置呢?或者說(shuō)對(duì)于一些List或者M(jìn)ap應(yīng)該如何配置呢?

本篇主要解決如下幾個(gè)問(wèn)題:

1、Spring Boot有哪些常用的讀取配置文件方式?

1)使用 @Value 讀取配置文件

2) 使用 @ConfigurationProperties 讀取配置文件

3)使用 Environment 讀取配置文件

2、一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如List、Map,如何配置?如何讀取呢?

前言

Spring Boot默認(rèn)的配置文件有兩種格式: application.properties 和 application.yml。 查找順序是首先從application.properties 查找,

如果找不到,再查找 application.yml。優(yōu)先級(jí):application.properties > application.yml。

以yml中rabbitmq的配置為例,配置文件如下:

rabbitmq:
  host: 127.0.0.1
  password: root
  port: 5672
  username: root

一、使用 @Value 讀取配置文件

這種方法適用于對(duì)象的參數(shù)比較少的情況

我們可以直接在對(duì)象的屬性上使用 @Value 注解,同時(shí)以 ${} 的形式傳入配置文件中對(duì)應(yīng)的屬性。同時(shí)需要在該類的上方使用 @Configuration 注解,將該類作為配置

文件加入,在啟動(dòng)項(xiàng)目的時(shí)候?qū)崿F(xiàn)注入。

@Configuration
public class RabbitmqProperties {

    @Value("${rabbitmq.host}")
    private String rabbitmqHost;
    @Value("${rabbitmq.port}")
    private String rabbitmqPort;
    @Value("${rabbitmq.username}")
    private String rabbitmqUsername;
    @Value("${rabbitmq.password}")
    private String rabbitmqPassword;
}

如果哪里需要用到,通過(guò) @Autowired 注入進(jìn)去就可以獲取屬性值了

@Component
public class PropertiesTest {

    @Autowired
    private RabbitmqProperties rabbitmqProperties;
}

二、使用 @ConfigurationProperties 讀取配置文件

如果對(duì)象的參數(shù)比較多情況下,推薦使用 @ConfigurationProperties 會(huì)更簡(jiǎn)單一些,不需要在每一個(gè)字段的上面的使用@Value注解。

@ConfigurationProperties注解聲明當(dāng)前類為配置讀取類

prefix="rabbitmq" 表示讀取前綴為rabbitmq的屬性

示例如下:

@ConfigurationProperties(prefix = "rabbitmq")
public class RabbitmqProperties {
    private String host;
    private String port;
    private String username;
    private String password;
}

這里有一點(diǎn)需要注意: 必須保證屬性名稱和字段一模一樣,且類需要提供字段的setter方法

注意 如果僅僅只是使用了 @ConfigurationProperties 注解是沒(méi)有效果的,它并不會(huì)將這個(gè)配置注入容器中,它還需要和注入容器的注解一起使用。

這里有兩種方法實(shí)現(xiàn)將它注入到容器中

1、類上添加@Configuration注解

除了@Configuration,也可以是@Controller、@RestController、@Service、@Componet等注解,加入到Ioc容器里。

@Setter
@Configuration
@ConfigurationProperties(prefix = "rabbitmq")
public class RabbitmqProperties {
    private String host;
    private String port;
    private String username;
    private String password;
}

同樣哪里需要用到,通過(guò) @Autowired 注入進(jìn)去就可以獲取屬性值了

2、使用@EnableConfigurationProperties注解

通過(guò) @EnableConfigurationProperties 注解可以將指定的配置讀取類的對(duì)象加載到Spring容器,也就是說(shuō),在其他配置類上使用一個(gè)@EnableConfigurationProperties注解,

來(lái)將配置文件的參數(shù)和RabbitmqProperties類的屬性綁定。這樣就不需要在RabbitmqProperties類上使用@Configuration注解了

@Configuration
@EnableConfigurationProperties(RabbitmqProperties.class)
public class RabbitmqConfig {

    @Autowired
    private RabbitmqProperties prop;
    
    @Bean
    public Rabbitmq rabbitmq() {
        Rabbitmq mq = new Rabbitmq();
        mq.setHost(prop.getHost());
        mq.setPort(prop.getPort());
        mq.setUsername(prop.getUsername());
        mq.setPassword(prop.getPassword());
        return mq;
    }
}

3、使用@ConfigurationPropertiesScan掃描

在 Spring Boot 2.2.0.RELEASE 中提供了一個(gè)掃描注解@ConfigurationPropertiesScan。它可以掃描特定包下所有的被@ConfigurationProperties標(biāo)記的配置類,

并將它們進(jìn)行IoC注入。

@ConfigurationPropertiesScan
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

三、使用 Environment 讀取配置文件

Environment 是 SpringCore 中的一個(gè)用于讀取配置文件的類,將此類使用 @Autowired 注入到類中就可以使用它的getProperty方法來(lái)獲取某個(gè)配置項(xiàng)的值。

如下代碼所示:

@SpringBootApplication
public class MainApplication implements InitializingBean {
    
    @Autowired
    private Environment environment;

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }

    @Override
    public void afterPropertiesSet() {
        String username = environment.getProperty("rabbitmq.username");
        System.out.println("rabbitmq當(dāng)前用戶名為:  " + username);
    }
}

四、常用的幾種數(shù)據(jù)結(jié)構(gòu)配置讀取

比如我們常見(jiàn)的字符串、整數(shù)、List、Map如何配置和讀取呢?這里以之前自己開(kāi)發(fā)的一個(gè)項(xiàng)目中用到復(fù)雜的配置數(shù)據(jù)來(lái)做示例之前有發(fā)布一個(gè)基于

Spring Cache實(shí)現(xiàn)二級(jí)緩存(Caffeine+Redis) 的項(xiàng)目,里面的配置就比較復(fù)雜。

具體項(xiàng)目地址:基于Spring Cache實(shí)現(xiàn)Caffeine+Redis二級(jí)緩存

這里展示配置示例:

application.yml

# 二級(jí)緩存配置
l2cache:
  config:
    # 是否存儲(chǔ)空值,默認(rèn)true,防止緩存穿透
    allowNullValues: true
    # 組合緩存配置
    composite:
      # 是否全部啟用一級(jí)緩存,默認(rèn)false
      l1AllOpen: false
      # 是否手動(dòng)啟用一級(jí)緩存,默認(rèn)false
      l1Manual: true
      # 手動(dòng)配置走一級(jí)緩存的緩存key集合,針對(duì)單個(gè)key維度
      l1ManualKeySet:
      - userCache:user01
      - userCache:user02
      - userCache:user03
      - userCache:user04
      
    # 一級(jí)緩存
    caffeine:
      # 緩存刷新調(diào)度線程池的大小
      refreshPoolSize: 2
      # 寫入后過(guò)期時(shí)間(秒)
      expireAfterWrite: 180
      # 訪問(wèn)后過(guò)期時(shí)間(秒)
      expireAfterAccess: 180
      # 初始化大小
      initialCapacity: 100
      # 最大緩存對(duì)象個(gè)數(shù),超過(guò)此數(shù)量時(shí)之前放入的緩存將失效
      maximumSize: 300
      
    # 二級(jí)緩存
    redis:
      # 全局過(guò)期時(shí)間,單位毫秒,默認(rèn)不過(guò)期
      defaultExpiration: 300000
      # 每個(gè)cacheName的過(guò)期時(shí)間,單位毫秒
      expires: {userCache: 300000,goodsCache: 50000}
      # 緩存更新時(shí)通知其他節(jié)點(diǎn)的topic名稱 默認(rèn) cache:redis:caffeine:topic
      topic: cache:redis:caffeine:topic

配置實(shí)體類

@Data
@ConfigurationProperties(prefix = "l2cache")
public class L2CacheProperties {
    /**
     * 緩存配置
     */
    private L2CacheConfig config;
}

L2CacheConfig

/**
 *  緩存配置
 * 
 * @author xub
 * @date 2022/9/20 下午6:02
 */
@Data
public class L2CacheConfig {


    /** 是否存儲(chǔ)空值,設(shè)置為true時(shí),可防止緩存穿透 */
    private boolean allowNullValues = true;
    
    /** 組合緩存配置 */
    private final Composite composite = new Composite();
    
    /** 一級(jí)緩存配置 */
    private final Caffeine caffeine = new Caffeine();

    /** 二級(jí)緩存配置 */
    private final Redis redis = new Redis();

    /**
     * 組合緩存配置
     */
    @Data
    public static class Composite {

        /** 是否全部啟用一級(jí)緩存,默認(rèn)false*/
        private boolean l1AllOpen = false;

        /** 是否手動(dòng)啟用一級(jí)緩存,默認(rèn)false */
        private boolean l1Manual = false;

        /** 手動(dòng)配置走一級(jí)緩存的緩存key集合,針對(duì)單個(gè)key維度*/
        private Set<String> l1ManualKeySet = new HashSet<>();
    }
    
    /**
     * 一級(jí)緩存配置
     */
    @Data
    public static class Caffeine {
  
        /** 緩存刷新調(diào)度線程池的大小 默認(rèn)為 CPU數(shù) * 2 */
        private Integer refreshPoolSize = Runtime.getRuntime().availableProcessors();

        /** 寫入后過(guò)期時(shí)間,單位秒 */
        private long expireAfterWrite;

        /** 寫入后刷新時(shí)間,單位秒 */
        private long refreshAfterWrite;

        /** 初始化大小 */
        private int initialCapacity;

        /** 最大緩存對(duì)象個(gè)數(shù),超過(guò)此數(shù)量時(shí)之前放入的緩存將失效 */
        private long maximumSize;
    }

    /**
     * 二級(jí)緩存配置
     */
    @Data
    public static class Redis {

        /** 全局過(guò)期時(shí)間,單位毫秒,默認(rèn)不過(guò)期 */
        private long defaultExpiration = 0;

        /** 每個(gè)cacheName的過(guò)期時(shí)間,單位毫秒,優(yōu)先級(jí)比defaultExpiration高 */
        private Map<String, Long> expires = new HashMap<>();

        /** 緩存更新時(shí)通知其他節(jié)點(diǎn)的topic名稱 */
        private String topic = "cache:redis:caffeine:topic";

    }
}

Configuration類

@Configuration
@EnableConfigurationProperties(L2CacheProperties.class)
public class CacheRedisCaffeineAutoConfiguration {

   @Autowired
   private L2CacheProperties l2CacheProperties;

   @Bean
   public RedisCaffeineCacheManager cacheManager() {
      return new RedisCaffeineCacheManager(l2CacheProperties.getConfig());
   }
}

測(cè)試

項(xiàng)目啟動(dòng)后,進(jìn)行Debug打斷點(diǎn),看有木有注入到L2CacheProperties實(shí)體中

通過(guò)上面截圖就可以看出,所有application.yml配置數(shù)據(jù),都已經(jīng)在L2CacheProperties實(shí)體中,說(shuō)明配置成功,獲取也成功了。

到此這篇關(guān)于SpringBoot 常用讀取配置文件的 3 種方法! 的文章就介紹到這了,更多相關(guān)SpringBoot 讀取配置文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java交換排序之雞尾酒排序?qū)崿F(xiàn)方法

    java交換排序之雞尾酒排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了java交換排序之雞尾酒排序?qū)崿F(xiàn)方法,實(shí)例分析了排序的原理與相關(guān)的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-02-02
  • Springboot整合redis實(shí)現(xiàn)發(fā)布訂閱功能介紹步驟

    Springboot整合redis實(shí)現(xiàn)發(fā)布訂閱功能介紹步驟

    發(fā)布訂閱作為一種設(shè)計(jì)思想在很多開(kāi)源組件中都有體現(xiàn),比如大家熟知的消息中間件等,可謂把發(fā)布訂閱這一思想體現(xiàn)的淋漓盡致了
    2022-09-09
  • Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0)

    Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0)

    在spring 3.2 及以后版本中增加了對(duì)請(qǐng)求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0),感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法

    Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法

    這篇文章主要給大家介紹了關(guān)于Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 簡(jiǎn)單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過(guò)程

    簡(jiǎn)單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過(guò)程

    這篇文章主要介紹了簡(jiǎn)單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過(guò)程,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • java輸入數(shù)字,輸出倒序的實(shí)例

    java輸入數(shù)字,輸出倒序的實(shí)例

    這篇文章主要介紹了java輸入數(shù)字,輸出倒序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Mybatis 逆向工程的三種方法詳解

    Mybatis 逆向工程的三種方法詳解

    這篇文章主要介紹了Mybatis 逆向工程的三種方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java數(shù)字圖像處理基礎(chǔ)使用imageio寫圖像文件示例

    java數(shù)字圖像處理基礎(chǔ)使用imageio寫圖像文件示例

    這篇文章主要介紹了Java 2D的圖像處理API,文章討論和提及的API都是基于JDK6的,Java中寫一個(gè)圖像文件使用ImageIO對(duì)象即可,下面看代碼吧
    2014-01-01
  • 詳解Java引用類型的參數(shù)也是值傳遞

    詳解Java引用類型的參數(shù)也是值傳遞

    這篇文章主要介紹了Java引用類型的參數(shù)也是值傳遞,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 配置java.library.path加載庫(kù)文件問(wèn)題

    配置java.library.path加載庫(kù)文件問(wèn)題

    這篇文章主要介紹了配置java.library.path加載庫(kù)文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論

鄂伦春自治旗| 呼玛县| 万源市| 平江县| 澄城县| 望城县| 阿勒泰市| 诸城市| 方城县| 鄂托克旗| 郯城县| 武穴市| 达尔| 碌曲县| 娱乐| 鄂托克旗| 嘉定区| 海南省| 屯门区| 聂拉木县| 中宁县| 汝州市| 乌兰县| 长垣县| 泸定县| 淄博市| 塔河县| 冷水江市| 威远县| 双鸭山市| 井冈山市| 含山县| 嘉义市| 通州区| 陆川县| 镇赉县| 西林县| 肇庆市| 天峻县| 明星| 开封县|