新增依賴關係
首先我們需要加入Spring Boot依賴:
一個簡單的範例
@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
# 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=4Datasize支援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以上是SpringBoot中@ConfigurationProperties怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!