Spring Boot @ConfigurationProperties使用指導


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,一個MapCredentials 類:

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驗證。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM