摘要:比如,在中,不能將屬性綁定到對象。引入了新的接口,能夠指出屬性取值的準確位置。比如,屬性綁定的驗證異常現(xiàn)在會顯示類允許你使用多個。我們計劃在中繼續(xù)加強的功能,而第一個想要支持的功能是不可變屬性綁定。
Spring Boot2.0的屬性綁定
原文
從Spring boot第一個版本以來,我們可以使用@ConfigurationProperties注解將屬性綁定到對象。也可以指定屬性的各種不同格式。比如,person.first-name,person.firstName和PERSON_FIRSTNAME都可以使用。這個功能叫做“relaxed binding”。
不幸的是,在spring boot 1.x,“relaxed binding”顯得太隨意了。從而使得很難來定義準確的綁定規(guī)則和指定使用的格式。在1.x的實現(xiàn)中,也很難對其進行修正。比如,在spring boot 1.x中,不能將屬性綁定到java.util.Set對象。
所以,在spring boot 2.0中,開始重構屬性綁定的功能。我們添加了一些新的抽象類和一些全新的綁定API。在本篇文章中,我們會介紹其中一些新的類和接口,并介紹添加他們的原因,以及如何在自己的代碼中如何使用他們。
Property Sources如果你已經(jīng)使用spring有一段時間,你應該對Environment比較熟悉了。這個接口繼承了PropertyResolver,讓你從一些PropertySource的實現(xiàn)解析屬性。
Spring Framework提供了一些常用的PropertySource,如系統(tǒng)屬性,命令行屬性,屬性文件等。Spring Boot自動配置這些實現(xiàn)(比如加載application.properties)。
Configuration Property Sources比起直接使用已存在的PropertySource實現(xiàn)類,Spring Boot2.0引入了新的ConfigurationPropertySource接口。我們引入這個新的接口來定義“relaxed binding”規(guī)則。
該接口的主要API顯得非常簡單
ConfigurationProperty getConfigurationProperty(ConfigurationPropertyName name);
另外有個IterableConfigurationPropertySource變量實現(xiàn)了Iterable
你可以向下面這樣將Environment傳給ConfigurationPropertySources:
Iterablesources = ConfigurationPropertySources.get(environment);
我們同時提供了MapConfigurationPropertySource來幫你應付上面的場景。
Configuration Property Names如果規(guī)則明確,實現(xiàn)"relaxed binding"會簡單很多。一直使用一致的格式,而不需要去關系在source中的各種無規(guī)則的格式。
ConfigurationPropertyNames類來強制進行這些屬性命名規(guī)則,例如“use lowercase kebab-case names”,在代碼中使用person.first-name,在source中使用person.firstName或者PERSON_FIRSTNAME.
Origin Support如期望的那樣,ConfigurationPropertySource返回ConfigurationProperty對象,里面包含了屬性的取值,另外有個可選的Origin對象。
spring boot 2.0引入了新的接口Origin,能夠指出屬性取值的準確位置。其中TextResourceOrigin是較為常用的實現(xiàn),會提供所加載的Resource,以及對應的行。
對于.properties和.yml文件,我們寫了定制的souce加載器,使得追蹤成為可能。一些spring boot的功能進行了重寫來追蹤信息。比如,屬性綁定的驗證異常現(xiàn)在會顯示:
*************************** APPLICATION FAILED TO START *************************** Description: Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under "person" to scratch.PersonProperties failed: Property: person.name Value: Joe Origin: class path resource [application.properties]:1:13 Reason: length must be between 4 and 2147483647 Action: Update your application"s configurationBinder API
org.springframework.boot.context.properties.bind.Binder類允許你使用多個ConfigurationPropertySource。準確的說,Binder使用Bindable并返回一個BindResult.
Bindable一個Bindable可以是Java bean,或是一個復雜對象(如List
Bindable.ofInstance(existingBean); Bindable.of(Integer.class); Bindable.listOf(Person.class); Bindable.of(resovableType);
Binable用來攜帶注解的信息,但不需要太過關注這個。
BindResultbinder會返回BindResult,和java8 stream操作返回的Optional很相似,一個BinderResult表示bind的結果。
如果你嘗試獲取一個沒有綁定的對象,會拋出異常,另外有其他的方法來設置沒有綁定時的缺省對象。
var bound = binder.bind("person.date-of-birth",Bindable.of(LocalDate.class)); //返回LocalDate,如果沒有則拋出異常 bound.get() //返回一個格式化時間,或是“No DOB" bound.map(dateFormatter::format).orElse("NO DOB"); //返回LocalDate或者拋出自定義異常 bound.orElseThrow(NoDateOfBirthException::new);Formatting and Conversion
大部分ConfigurationPropertySource實現(xiàn)將值當字符串處理。當Binder需要將值轉(zhuǎn)化為其他類型時,會使用到Spring的ConversionService API。比較常用的是@NumberFormat和@DateFormat這兩個注解。
spring boot 2.0也引入了一些新的注解和轉(zhuǎn)換器。例如,你現(xiàn)在可以將4s轉(zhuǎn)換成Duration。具體請參考org.springframework.boot.conver包。
BindHandler在binding的過程中,你可能會需要實現(xiàn)一些額外的邏輯。BindHandler接口提供了這樣的機會。每一個BindHandler有onStart, onSuccess, onFailure和 onFinish方法供重載。
spring boot提供了一些handlers,用來支持已存在的@ConfigurationProperties binding。 比如 ValidationBindHandler可以用于綁定對象的合法性校驗上。
@ConfigurationProperties如文章開頭所提到的,@ConfigurationProperties是在spring boot最初就加入的功能。所以大部分人會繼續(xù)使用該注解是不可避免的。
Future Work我們計劃在spring boot2.1中繼續(xù)加強Binder的功能,而第一個想要支持的功能是不可變屬性綁定。另外相較getters和setters的綁定,使用基于構造器的綁定來代替:
public class Person{ private final String firstName; private final String lastName; private final LocalDateTime dateOfBirth; public Person(String firstName, String lastName, LocalDateTime dateOfBirth){ this.firstName = firstName; this.lastName = lastName; this.dateOfBirth = dateOfBirth; } //getters }Summary
我們希望在spring boot2.0 中你可以找到更好用的屬性綁定功能,并考慮升級你目前的方式。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77471.html
摘要:可以使用外部化配置來方便在不同環(huán)境的運行同樣的程序文件文件環(huán)境變量命令行參數(shù)內(nèi)置順序?qū)崿F(xiàn)了很多按以下順序進行合理的相同屬性的覆蓋目錄下的全局設置屬性,如果激活測試用例上的注解測試用例上的注解。 簡介 在應用中管理配置并不是一個容易的任務,尤其是在應用需要部署到多個環(huán)境中時。通常會需要為每個環(huán)境提供一個對應的屬性文件,用來配置各自的數(shù)據(jù)庫連接信息、服務器信息和第三方服務賬號等。通常的應用...
摘要:的默認配置文件位置為。比如,我們需要自定義模塊的服務端口號,可以在中添加來指定服務端口為,也可以通過來指定應用名該名字在應用中會被注冊為服務名。同時,配置內(nèi)容都對開發(fā)人員可見,本身這也是一種安全隱患。 在快速入門一節(jié)中,我們輕松的實現(xiàn)了一個簡單的RESTful API應用,體驗了一下Spring Boot給我們帶來的諸多優(yōu)點,我們用非常少的代碼量就成功的實現(xiàn)了一個Web應用,這是傳統(tǒng)的...
摘要:框架具有輕便,開源的優(yōu)點,所以本譯見構建用戶管理微服務五使用令牌和來實現(xiàn)身份驗證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:引言的一個便捷功能是外部化配置,可以輕松訪問屬性文件中定義的屬性。本文將詳細介紹的使用。 引言 Spring Boot的一個便捷功能是外部化配置,可以輕松訪問屬性文件中定義的屬性。本文將詳細介紹@ConfigurationProperties的使用。 配置項目POM 在pom.xml中定義Spring-Boot 為parent org.springframework.boot...
摘要:使用會涉及到各種各樣的配置,如開發(fā)測試線上就至少套配置信息了。本章內(nèi)容基于進行詳解。添加測試類運行單元測試,程序輸出根據(jù)以上參數(shù)動態(tài)調(diào)整,發(fā)現(xiàn)參數(shù)會被正確被覆蓋。了解了各種配置的加載順序,如果配置被覆蓋了我們就知道是什么問題了。 使用 Spring Boot 會涉及到各種各樣的配置,如開發(fā)、測試、線上就至少 3 套配置信息了。Spring Boot 可以輕松的幫助我們使用相同的代碼就能...
閱讀 3669·2021-11-24 09:39
閱讀 1276·2021-09-30 09:48
閱讀 3258·2021-09-09 11:51
閱讀 2883·2021-09-08 10:41
閱讀 1329·2019-08-30 14:06
閱讀 2798·2019-08-30 14:01
閱讀 874·2019-08-29 17:11
閱讀 3169·2019-08-29 15:37