Spring Boot 2.0的屬性綁定


Spring Boot2.0的屬性綁定

原文
從Spring boot第一個版本以來,我們可以使用@ConfigurationProperties注解將屬性綁定到對象。也可以指定屬性的各種不同格式。比如,person.first-name,person.firstName和PERSON_FIRSTNAME都可以使用。這個功能叫做“relaxed binding”。

不幸的是,在spring boot 1.x,“relaxed binding”顯得太隨意了。從而使得很難來定義准確的綁定規則和指定使用的格式。在1.x的實現中,也很難對其進行修正。比如,在spring boot 1.x中,不能將屬性綁定到java.util.Set對象。

所以,在spring boot 2.0中,開始重構屬性綁定的功能。我們添加了一些新的抽象類和一些全新的綁定API。在本篇文章中,我們會介紹其中一些新的類和接口,並介紹添加他們的原因,以及如何在自己的代碼中如何使用他們。

Property Sources

如果你已經使用spring有一段時間,你應該對Environment比較熟悉了。這個接口繼承了PropertyResolver,讓你從一些PropertySource的實現解析屬性。

Spring Framework提供了一些常用的PropertySource,如系統屬性,命令行屬性,屬性文件等。Spring Boot自動配置這些實現(比如加載application.properties)。

Configuration Property Sources

比起直接使用已存在的PropertySource實現類,Spring Boot2.0引入了新的ConfigurationPropertySource接口。我們引入這個新的接口來定義“relaxed binding”規則。

該接口的主要API顯得非常簡單

ConfigurationProperty getConfigurationProperty(ConfigurationPropertyName name);

另外有個IterableConfigurationPropertySource變量實現了Iterable<ConfigurationPropertyNaame>,讓你可以發現source包含的所有屬性名稱。

你可以向下面這樣將Environment傳給ConfigurationPropertySources:

Iterable<ConfigurationPropertySource> sources = ConfigurationPropertySources.get(environment);

我們同時提供了MapConfigurationPropertySource來幫你應付上面的場景。

Configuration Property Names

如果規則明確,實現"relaxed binding"會簡單很多。一直使用一致的格式,而不需要去關系在source中的各種無規則的格式。

ConfigurationPropertyNames類來強制進行這些屬性命名規則,例如“use lowercase kebab-case names”,在代碼中使用person.first-name,在source中使用person.firstName或者PERSON_FIRSTNAME.

Origin Support

如期望的那樣,ConfigurationPropertySource返回ConfigurationProperty對象,里面包含了屬性的取值,另外有個可選的Origin對象。

spring boot 2.0引入了新的接口Origin,能夠指出屬性取值的准確位置。其中TextResourceOrigin是較為常用的實現,會提供所加載的Resource,以及對應的行。

對於.properties和.yml文件,我們寫了定制的souce加載器,使得追蹤成為可能。一些spring boot的功能進行了重寫來追蹤信息。比如,屬性綁定的驗證異常現在會顯示:


免責聲明!

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



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