摘要:引言的一個便捷功能是外部化配置,可以輕松訪問屬性文件中定義的屬性。本文將詳細介紹的使用。
引言
Spring Boot的一個便捷功能是外部化配置,可以輕松訪問屬性文件中定義的屬性。本文將詳細介紹@ConfigurationProperties的使用。
配置項目POM在pom.xml中定義Spring-Boot 為parent
org.springframework.boot spring-boot-starter-parent 2.0.4.RELEASE
添加依賴
添加web,因為我們需要使用到JSR-303規范的Validator,如果不想使用web依賴,也可以直接依賴hibernate-validator
添加spring-boot-configuration-processor,可以在編譯時生成屬性元數據(spring-configuration-metadata.json).
添加lombok,可以方便使用注釋處理器的功能省去Pojo定義中get set這些麻煩工作.
例子編寫org.springframework.boot spring-boot-starter-web org.projectlombok lombok org.springframework.boot spring-boot-configuration-processor true
首先定義一個DocumentServerProperties對象,下面這個文檔服務器配置是我假設的,主要是為了演示屬性配置的大部分情況
@Getter @Setter public class DocumentServerProperties { private String remoteAddress; private boolean preferIpAddress; private int maxConnections=0; private int port; private AuthInfo authInfo; private List綁定屬性配置whitelist; private Map converter; private List defaultShareUsers; @Getter @Setter public static class AuthInfo { private String username; private String password; } }
注意@ConfigurationProperties并沒有把當前類注冊成為一個Spring的Bean,下面介紹@ConfigurationProperties配置注入的三種方式.
配合@Component注解直接進行注入
@ConfigurationProperties(prefix = "doc") @Component public class DocumentServerProperties { //代碼... }
使用@EnableConfigurationProperties,通常配置在標有@Configuration的類上,當然其他@Component注解的派生類也可以,不過不推薦.
@ConfigurationProperties(prefix = "doc") public class DocumentServerProperties { //代碼... }
@EnableConfigurationProperties @Configuration public class SomeConfiguration { private DocumentServerProperties documentServerProperties public SomeConfiguration(DocumentServerProperties documentServerProperties) { this.documentServerProperties = documentServerProperties; } }
使用@Bean方式在標有@Configuration的類進行注入,這種方式通常可以用在對第三方類進行配置屬性注冊
@Configuration public class SomeConfiguration { @Bean public DocumentServerProperties documentServerProperties(){ return new DocumentServerProperties(); } @ConfigurationProperties("demo.third") @Bean public ThirdComponent thirdComponent(){ return new ThirdComponent(); } }編寫配置文件
Spring-Boot中配置文件的格式有properties和yaml兩種格式,針對上面的配置對象分別寫了兩種格式的配置文件例子.
Properties
doc.remote-address=127.0.0.1 doc.port=8080 doc.max-connections=30 doc.prefer-ip-address=true #doc.whitelist=192.168.0.1,192.168.0.2 # 這種等同于下面的doc.whitelist[0] doc.whitelist[1] doc.whitelist[0]=192.168.0.1 doc.whitelist[1]=192.168.0.2 doc.default-share-users[0].name=jack doc.default-share-users[0].age=18 doc.converter.a=xxConverter doc.converter.b=xxConverter doc.auth-info.username=user doc.auth-info.password=password
Yaml
doc: remote-address: 127.0.0.1 port: 8080 max-connections: 30 prefer-ip-address: true whitelist: - 192.168.0.1 - 192.168.0.2 default-share-users: - name: jack age: 18 converter: a: aConverter b: bConverter auth-info: username: user password: password
在上面的兩個配置文件中,其實已經把我們平常大部分能使用到的屬性配置場景都覆蓋了,可能還有一些特殊的未介紹到,比如Duration、InetAddress等。
增加屬性驗證下面我們利用JSR303規范的實現對DocumentServerProperties屬性配置類,添加一些常規驗證,比如Null檢查、數字校驗等操作,
需要注意在Spring-Boot 2.0版本以后,如果使用JSR303對屬性配置進行驗證必須添加@Validated注解,使用方式如下片段:
@ConfigurationProperties(prefix = "doc") @Validated public class DocumentServerProperties { @NotNull // 判斷不為空的情況 private String remoteAddress; //限制端口只能是80-65536之間 @Min(80) @Max(65536) private int port; //其他代碼 }
在有些數情況下,我們希望自定義驗證器,有兩種方式可以進行實現
實現org.springframework.validation.Validator接口,并且在配置一個Bean名稱必須叫configurationPropertiesValidator,代碼如下:
public class UserLoginValidator implements Validator { private static final int MINIMUM_PASSWORD_LENGTH = 6; public boolean supports(Class clazz) { return UserLogin.class.isAssignableFrom(clazz); } public void validate(Object target, Errors errors) { ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required"); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required"); UserLogin login = (UserLogin) target; if (login.getPassword() != null && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) { errors.rejectValue("password", "field.min.length", new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)}, "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in ); } } }
和上面一樣也是實現org.springframework.validation.Validator接口,不過是需要驗證的屬性配置類本身去實現這個接口
@ConfigurationProperties(prefix = "doc") public class DocumentServerProperties implements Validator{ @NotNull private String remoteAddress; private boolean preferIpAddress; //其他屬性 @Override public boolean supports(Class> clazz) { return true; } @Override public void validate(Object target, Errors errors) { //判斷邏輯其實可以參照上面的代碼片段 } }
特別注意:
只有在需要使用JSR303規范實現的驗證器時,才需要對對象配置@Validated,剛剛上面兩種方式并不需要。
第一種實現和第二種實現都是實現org.springframework.validation.Validator接口,但是前者是針對全局的,后者只針對實現這個接口的配置對象
關于上述兩點,我為啥確定? 來自ConfigurationPropertiesBinder的源碼片段
private List總結getValidators(Bindable> target) { List validators = new ArrayList<>(3); if (this.configurationPropertiesValidator != null) { validators.add(this.configurationPropertiesValidator); } if (this.jsr303Present && target.getAnnotation(Validated.class) != null) { validators.add(getJsr303Validator()); } if (target.getValue() != null && target.getValue().get() instanceof Validator) { validators.add((Validator) target.getValue().get()); } return validators; }
通過上面的例子,我們了解了@ConfigurationProperties的使用以及如何進行驗證,包括屬性驗證器的幾種實現方式.下個章節我會從源碼的角度分析屬性的加載,以及如何解析到Bean里面去的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72077.html
摘要:比如,在中,不能將屬性綁定到對象。引入了新的接口,能夠指出屬性取值的準確位置。比如,屬性綁定的驗證異?,F在會顯示類允許你使用多個。我們計劃在中繼續加強的功能,而第一個想要支持的功能是不可變屬性綁定。 Spring Boot2.0的屬性綁定 原文從Spring boot第一個版本以來,我們可以使用@ConfigurationProperties注解將屬性綁定到對象。也可以指定屬性的各種不...
摘要:可以使用外部化配置來方便在不同環境的運行同樣的程序文件文件環境變量命令行參數內置順序實現了很多按以下順序進行合理的相同屬性的覆蓋目錄下的全局設置屬性,如果激活測試用例上的注解測試用例上的注解。 簡介 在應用中管理配置并不是一個容易的任務,尤其是在應用需要部署到多個環境中時。通常會需要為每個環境提供一個對應的屬性文件,用來配置各自的數據庫連接信息、服務器信息和第三方服務賬號等。通常的應用...
摘要:前兩天組里的大佬心血來潮,讓我這周把項目里的版本升級到最新版本,目前項目用到的是版本為的版本為現在按照要求統一升級到。三數據庫連接池同樣也是版本不兼容,需要升級到,親測有效。差不多這些,后續遇到其他問題還會繼續補充。 前兩天組里的大佬心血來潮,讓我這周把項目里的spring-boot、spring-cloud版本升級到最新版本,目前項目用到的是spring-boot版本為1.5.9.R...
引言 當我們通過@ConfigurationProperties注解實現配置 bean的時候,如果默認的配置屬性轉換無法滿足我們的需求的時候,我們可以根據自己的需求通過以下擴展方式對配置屬性進行轉換 PropertyEditorSupport實現 下面的例子是把屬性中定義的字符串轉換成Movie,并且把name的值大寫 繼承PropertyEditorSupport并且實現PropertyEdi...
摘要:在項目中,為滿足以上要求,我們將大量的參數配置在或文件中,通過注解,我們可以方便的獲取這些參數值使用配置模塊假設我們正在搭建一個發送郵件的模塊。這使得在不影響其他模塊的情況下重構一個模塊中的屬性變得容易。 在編寫項目代碼時,我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項目中,為滿足以上要求,我們將大量的參數配置在 application.properties 或...
閱讀 695·2021-11-15 11:37
閱讀 3316·2021-10-27 14:14
閱讀 6038·2021-09-13 10:30
閱讀 2961·2021-09-04 16:48
閱讀 1926·2021-08-18 10:22
閱讀 2125·2019-08-30 14:19
閱讀 728·2019-08-30 10:54
閱讀 1745·2019-08-29 18:40