首頁  >  文章  >  Java  >  SpringBoot中@ConfigurationProperties怎麼使用

SpringBoot中@ConfigurationProperties怎麼使用

王林
王林轉載
2023-05-19 11:10:061367瀏覽

新增依賴關係

首先我們需要加入Spring Boot依賴:

 org.springframework.boot  < ;artifactId>spring-boot-starter-parent  

一個簡單的範例

@ConfigurationProperties需要和@Configuration搭配使用,我們通常在一個POJO裡面進行設定:

@Data@Configuration@ConfigurationProperties(prefix = "mail")public class ConfigProperties {  private String hostName;  private int port;  private String from;}

上面的範例會讀取properties檔案中所有以郵件開頭的屬性,並與bean中的欄位進行比對:

#Simple propertiesmail.hostname=host@mail.commail.port=9000mail.from=mailer@mail.com

Spring的屬性名字符合支援很多格式,如下所示所有的格式都可以和hostName進行比對:

mail.hostNamemail.hostnamemail.host_namemail.host-namemail.HOST_NAME

如果你不想使用@Configuration, 那麼需要在@EnableConfigurationProperties註解中手動匯入設定檔如下:

@SpringBootApplication@EnableConfigurationProperties(ConfigProperties.class)public class ConfigPropApp {  public static void main(String[] args) {    SpringApplication.run(ConfigProp.App.class,#args); 在@ConfigurationPropertiesScan中指定Config檔案的路徑:

@SpringBootApplication@ConfigurationPropertiesScan("com.flydean.config")public class ConfigPropApp {  public static void main(String[] args) {  p. class,args);  }}

這樣的話程式只會在com.flydean.config套件中尋找config檔。

屬性嵌套

我們可以嵌套class,list,map, 下面我們舉個例子,先建立一個普通的POJO:

# @Datapublic class Credentials {  private String authMethod;  private String username;  private String password;}

然後建立一個巢狀的設定檔:

@Data@Configuration@ConfigurationProperties(prefix = "nestmail ")public class NestConfigProperties {  private String host;  private int port;  private String from;  private List defaultRecipients;  private Map<String, String> defaultRecipients;  private Map<String, String> defaultRecipients;  private Map<String, String>” :

# nest Simple propertiesnestmail.hostname=mailer@mail.comnestmail.port=9000nestmail.from=mailer@mail.com#List propertiesnestmail.defaultRecipients[0]=admin@mail.comnestmail.defaultRecipients[1] =owner@mail.com#Map Propertiesnestmail.additionalHeaders.redelivery=truenestmail.additionalHeaders.secure=true#Object propertiesnestmail.credentials.username=johnnestmail.credentials.password=passwordnestmail.credentials.authMethod=#1# #@ConfigurationProperties和@Bean

@ConfigurationProperties也可以和@Bean一起使用如下圖:

@Datapublic class Item {  private String name;  private int size;}

看怎麼使用:

@Data@Configurationpublic class BeanConfigProperties {  @Bean  @ConfigurationProperties(prefix = "item")  public Item item() {    return new Item(#};

屬性驗證

@ConfigurationProperties可以使用標準的JSR-303格式來做屬性驗證。讓我們舉個例子:

@Data@Validated@Configuration@ConfigurationProperties(prefix = "mail")public class ConfigProperties {  @NotEmpty  private String hostName;  @Min(1025)  @Maxvate String hostName;  @Min(1025)  @Maxvate; @Pattern(regexp = "^[a-z0-9._% -] @[a-z0-9.-] \\.[a-z]{2,6}$")  private String from;}

如果我們的屬性不符合上訴條件,可能出現如下異常:Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'mail' to com .flydean.config.ConfigProperties$$EnhancerBySpringCGLIB$$f0f87cb9 failed:  Property: mail.port  Value: 0  Reason: 最小不能小於1025  Property: mail.hostName  Value: null  Reason: 不能為空Action:Update your application's configurationProcess finished with exit code 1

屬性轉換

@ConfigurationProperties也支援多種屬性轉換,以下我們以Duration和DataSize為例:

我們定義兩個Duration的欄位:

@ConfigurationProperties(prefix = "conversion")public class PropertyConversion {   private Duration timeInDefaultUnit;  private Duration timeInNano;  ...}##在屬性檔案中定義這兩個欄位定義這兩個欄位。 :

conversion.timeInDefaultUnit=10conversion.timeInNano=9ns

我們看到上面的屬性可以帶單位的。可選的單位是:ns, us, ms, s, m, h 和 d,分別對應納秒,微妙,毫秒,秒,分鐘,小時和天。預設單位是毫秒。我們也可以在註解中指定單位:

@DurationUnit(ChronoUnit.DAYS)private Duration timeInDays;

對應的設定檔如下:

conversion.timeInDays=2

下面我們再看看DataSize怎麼使用:

private DataSize sizeInDefaultUnit; private DataSize sizeInGB; @DataSizeUnit(DataUnit.TERABYTES)private DataSize sizeInTB

#對應的屬性檔:

#conversion.sizeInDefaultUnit=300conversion.sizeInGB=2GBconversion.sizeInTB=4

Datasize支援B, KB, MB, GB 和TB。

自訂Converter

同樣的Spring Boot也支援自訂屬性轉換器。我們先定義一個POJO類別:

public class Employee {  private String name;  private double salary;}

對應的屬性檔:

conversion.employee=john,2000

我們需要自己實作一個Converter介面的轉換類別:

@Component@ConfigurationPropertiesBindingpublic class EmployeeConverter implements Converter {   @Override public Employee convert;String, Employee> { data = from.split(",");    return new Employee(data[0], Double.parseDouble(data[1]));  }}###

以上是SpringBoot中@ConfigurationProperties怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除