成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不可不知!SpringBoot 3.4 中 @DefaultValue 注解的妙用與實戰

開發 前端
@DefaultValue? 注解是 Spring Boot 3.4 中非常實用的功能,它使得我們在屬性綁定時能夠為缺失的屬性提供默認值,減少了因缺失配置而產生的異常和錯誤。

在 Spring Boot 3.4 中,@DefaultValue 注解為我們提供了更加靈活的配置方式,尤其是在配置屬性綁定時。在實際開發中,配置文件的屬性綁定通常會通過兩種方式來實現,分別是 @ConfigurationProperties 和 @Value。盡管兩者都能夠完成綁定任務,但通常推薦使用 @ConfigurationProperties,因為它提供了更高的結構化和類型安全性。

@ConfigurationProperties VS @Value

@ConfigurationProperties 為配置文件屬性綁定提供了一個更清晰且類型安全的方式。它將配置文件中的屬性映射到 Java 類的字段上,增強了代碼的可讀性和可維護性。而 @Value 雖然也能夠完成綁定任務,但通常只適用于簡單的屬性,并且在處理復雜綁定時,它缺乏類型安全的保障。使用 @Value 時,還可能需要額外的自定義類型轉換器。

因此,在 Spring Boot 項目中,為了提升代碼的可維護性和避免潛在的錯誤,通常推薦使用 @ConfigurationProperties 來綁定配置屬性。通過這種方式,代碼結構更加清晰,同時也能避免運行時錯誤。

使用構造函數進行屬性綁定

通常情況下,@ConfigurationProperties 會通過 setter 方法來進行屬性綁定。然而,Spring Boot 還支持使用構造函數來進行屬性綁定,提供了更為靈活的綁定方式。以下示例演示了如何使用構造函數進行綁定:

package com.icoderoad.config;


import org.springframework.boot.context.properties.ConfigurationProperties;


@ConfigurationProperties(prefix = "pack.app")
public class PackApp {
    private String title;
    private String version;
    private Integer sno;


    public PackApp(String title, String version, Integer sno) {
        this.title = title;
        this.version = version;
        this.sno = sno;
    }


    // getters, setters
}

在這個示例中,PackApp 類將會使用構造函數進行屬性綁定。

處理多個構造函數

當配置類中存在多個構造函數時,Spring Boot 默認會使用 setter 方法進行綁定。如果希望指定使用某一個構造函數進行綁定,可以使用 @ConstructorBinding 注解:

package com.icoderoad.config;


import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.boot.context.properties.ConfigurationProperties;


@ConfigurationProperties(prefix = "pack.app")
public class PackApp {
    private String title;
    private String version;
    private Integer sno;


    @ConstructorBinding
    public PackApp(String title, String version) {
        this.title = title;
        this.version = version;
    }
}

這種情況下,Spring Boot 會使用帶有兩個參數的構造函數進行屬性綁定。

默認構造函數與私有構造函數

如果配置類只有一個有參構造函數,Spring Boot 會默認使用這個構造函數進行綁定。如果不希望使用該構造函數進行綁定,可以將其設置為 private 或者使用 @Autowired 注解:

package com.icoderoad.config;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;


@ConfigurationProperties(prefix = "pack.app")
public class PackApp {
    private String title;
    private String version;
    private Integer sno;


    @Autowired
    public PackApp(MyBean bean) {
        // 初始化代碼
    }
}

通過這種方式,Spring Boot 會使用 setter 方法來完成屬性綁定。

@DefaultValue 注解的使用

當使用構造函數綁定時,如果某些屬性在配置文件中沒有找到對應的值,@DefaultValue 注解可以為這些屬性設置默認值。

假設配置文件如下:

pack:
  app:
    title: xxxx.xxxx
    version: 1.0.0

若配置文件中沒有定義 pack.app.sno 屬性,默認情況下 sno 會被賦值為 null。但如果我們希望在沒有配置該屬性時使用默認值,可以使用 @DefaultValue 注解:

package com.icoderoad.config;


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.beans.factory.annotation.Value;


@ConfigurationProperties(prefix = "pack.app")
public class PackApp {
    private String title;
    private String version;


    @DefaultValue("888")
    private Integer sno;


    public PackApp(String title, String version, Integer sno) {
        this.title = title;
        this.version = version;
        this.sno = sno;
    }


    // getters, setters
}

運行時,如果 pack.app.sno 沒有在配置文件中提供值,sno 會自動使用默認值 888。

嵌套屬性的默認值

如果你的配置類包含嵌套屬性,也可以使用 @DefaultValue 為這些嵌套屬性設置默認值。例如:

package com.icoderoad.config;


@ConfigurationProperties(prefix = "pack.app")
public class PackApp {
    private String title;
    private String version;
    private Integer sno;


    private Security security;


    public PackApp(String title, String version, Integer sno, @DefaultValue("Security [username=null]") Security security) {
        this.title = title;
        this.version = version;
        this.sno = sno;
        this.security = security;
    }


    // getters, setters
}

如果 security 屬性沒有在配置文件中進行配置,Spring Boot 會將其設置為一個默認值,即 Security [username=null]。

嵌套集合屬性的默認值

同樣,對于集合類型的嵌套屬性,也可以使用 @DefaultValue 注解設置默認值。例如:

package com.icoderoad.config;


@ConfigurationProperties(prefix = "pack.app")
public class PackApp {
    private List<String> roles;


    public PackApp(String title, String version, Integer sno, @DefaultValue({"ADMIN", "MGR"}) List<String> roles) {
        this.roles = roles;
    }
}

如果 roles 屬性沒有在配置文件中提供,roles 將會使用默認的 {"ADMIN", "MGR"} 值。

Record 類型與默認值

Spring Boot 還支持使用 Record 類型作為配置類,并為 Record 類型的字段設置默認值。例如:

package com.icoderoad.config;


@ConfigurationProperties(prefix = "pack.app")
public record AppRecord(String title, String version, @DefaultValue("999") Integer sno) {}

這種方式允許我們將默認值應用到 Record 類型的字段,增強了代碼的簡潔性和類型安全性。

總結

@DefaultValue 注解是 Spring Boot 3.4 中非常實用的功能,它使得我們在屬性綁定時能夠為缺失的屬性提供默認值,減少了因缺失配置而產生的異常和錯誤。結合構造函數綁定和嵌套屬性的默認值功能,@DefaultValue 注解為我們提供了更加靈活和安全的配置方式,極大地提升了代碼的可維護性與穩定性。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2010-06-11 14:46:38

可路由協議

2020-11-30 13:12:04

Linux文本命令

2015-01-15 09:34:28

2010-10-27 10:39:44

求職

2014-06-20 14:35:48

浪潮數據

2019-08-18 23:10:14

數據科學算法數學

2021-01-27 09:45:17

負載均衡

2015-07-30 17:30:43

Linux命令

2020-01-17 06:12:10

物聯網IOT技術

2024-03-21 08:57:39

語言軟件開發

2020-11-11 21:27:55

緩沖文件調用

2010-04-16 17:09:18

Oracle查看鎖

2025-01-03 17:10:54

2018-06-12 11:05:33

2019-12-02 14:14:20

緩沖系統調用函數

2014-06-09 13:21:27

2009-06-10 09:08:13

WCF變更處理契約

2012-04-28 15:52:39

2021-08-12 16:02:22

Jupyter NotPython命令

2011-05-19 15:41:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新中文字幕在线 | 免费影视在线观看 | 日韩在线国产 | 欧美日韩综合 | 99国产精品99久久久久久 | 精品视频一区二区 | 精品无码久久久久久国产 | 黄色片a级 | 国产高清一二三区 | 日本在线视频一区二区 | 一区日韩| 成年人黄色一级毛片 | 精品一二三区 | 国产在线精品免费 | 久久久久久久久久久高潮一区二区 | 欧美在线不卡 | 精品视频在线观看 | 五月婷婷 六月丁香 | 亚洲视频二区 | 不卡视频一区 | 99久久久久| 亚洲一区精品视频 | 极品粉嫩国产48尤物在线播放 | 精品亚洲一区二区三区四区五区高 | 日韩电影一区 | 国精日本亚洲欧州国产中文久久 | 国产成人在线观看免费 | 亚洲乱码一区二区三区在线观看 | 成人在线视频一区二区三区 | 一区二区三区观看视频 | 成人日韩精品 | 日本人和亚洲人zjzjhd | 日本粉嫩一区二区三区视频 | 999久久久久久久久6666 | 欧美日韩精品综合 | 在线国产一区二区 | 国产精品视频二区三区 | 成人免费看 | 国产成人精品一区二区三区视频 | 欧洲视频一区二区 | 午夜精品一区二区三区在线观看 |