1.簡介
Spring Boot的一個非常有用的功能是外部化配置,並且可以輕松訪問屬性文件中定義的屬性。
我們現在將詳細地探索@ConfigurationProperties注釋。
2.設置
本文使用相當標准的設置。我們首先在我們的pom.xml中添加spring-boot-starter-parent作為父項:
<!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
為了能夠驗證文件中定義的屬性,我們還需要JSR-303的實現。hibernate-validator就是其中之一。我們也將它添加到我們的pom.xml中:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.16.Final</version> </dependency>
3.簡單屬性
官方文檔建議我們將配置屬性隔離到單獨的POJO中。那么讓我們從這開始:
1 @Configuration 2 @PropertySource("classpath:configprops.properties") 3 @ConfigurationProperties(prefix = "mail") 4 public class ConfigProperties { 5 6 private String hostName; 7 private int port; 8 private String from; 9 10 // standard getters and setters 11 }
我們使用@Configuration,以便Spring在應用程序上下文中創建一個Spring bean。
我們還使用@PropertySource來定義屬性文件的位置。否則,Spring使用默認位置(classpath:application.properties)。
@ConfigurationProperties最適用於具有相同前綴的分層屬性。所以我們這里添加一個前綴mail。
Spring框架使用標准的Java bean設置器,因此我們需要為每個屬性聲明setter方法(用於為字段賦值)。
注意:如果我們不在POJO中使用@Configuration ,那么我們需要在主Spring應用程序類中添加@EnableConfigurationProperties(ConfigProperties.class) 以將屬性綁定到POJO:
@SpringBootApplication @EnableConfigurationProperties(ConfigProperties.class) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
完事!Spring將自動綁定在我們的屬性文件中定義的任何屬性,該屬性具有前綴mail並且后續字段與ConfigProperties類中的一個字段有相同的名稱。
Spring使用一些寬松的綁定屬性規則。因此以下變體都綁定到屬性hostName:
mail.hostName mail.hostname mail.host_name mail.host-name mail.HOST_NAME
我們可以使用以下屬性文件來設置所有字段:
#Simple properties mail.hostname=host@mail.com mail.port=9000 mail.from=mailer@mail.com
4.嵌套屬性
我們可以在list、map和類中使用嵌套屬性。
讓我們創建一個新的Credentials類,用於一些嵌套屬性:
public class Credentials { private String authMethod; private String username; private String password; // standard getters and setters }
我們還更新ConfigProperties類使用List,一個Map和Credentials 類:
public class ConfigProperties { private String host; private int port; private String from; private List<String> defaultRecipients; private Map<String, String> additionalHeaders; private Credentials credentials; // standard getters and setters }
以下屬性文件將設置所有字段:
#Simple properties mail.hostname=mailer@mail.com mail.port=9000 mail.from=mailer@mail.com #List properties mail.defaultRecipients[0]=admin@mail.com mail.defaultRecipients[1]=owner@mail.com #Map Properties mail.additionalHeaders.redelivery=true mail.additionalHeaders.secure=true #Object properties mail.credentials.username=john mail.credentials.password=password mail.credentials.authMethod=SHA1
5.屬性驗證
@ConfigurationProperties使用JSR-303格式提供屬性驗證。這允許各種整潔的東西。
例如,讓我們強制使用hostName屬性:
@NotBlank private String hostName;
並且authMethod屬性長度為1到4個字符:
@Length(max = 4, min = 1) private String authMethod;
和端口屬性從1025到65536:
@Min(1025) @Max(65536) private int port;
最后,from屬性必須與電子郵件地址格式匹配:
@Pattern(regexp = "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,6}$") private String from;
這有助於我們減少代碼中的大量if - else條件,使其看起來更清晰簡潔。
如果這些驗證中的任何一個失敗,那么主應用程序將無法啟動,報錯信息IllegalStateException。
Hibernate Validation框架使用標准的Java bean getter和setter,因此我們為每個屬性聲明getter和setter非常重要。
六,結論
我們已經探索了@ConfigurationProperties注釋,並看到了它提供的一些方便的功能,如輕松綁定和Bean驗證。