亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring Boot2.0 @ConfigurationProperties使用詳解

2024-07-14 08:42:47
字體:
來源:轉載
供稿:網友

引言

Spring Boot的一個便捷功能是外部化配置,可以輕松訪問屬性文件中定義的屬性。本文將詳細介紹@ConfigurationProperties的使用。

配置項目POM

在pom.xml中定義Spring-Boot 為parent

<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.0.4.RELEASE</version>  <relativePath/> <!-- lookup parent from repository --> </parent>

添加依賴

  1. 添加web,因為我們需要使用到JSR-303規范的Validator,如果不想使用web依賴,也可以直接依賴hibernate-validator
  2. 添加spring-boot-configuration-processor,可以在編譯時生成屬性元數據(spring-configuration-metadata.json).
  3. 添加lombok,可以方便使用注釋處理器的功能省去Pojo定義中get set這些麻煩工作.
  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <!--<dependency>-->   <!--<groupId>org.hibernate.validator</groupId>-->   <!--<artifactId>hibernate-validator</artifactId>-->   <!--<version>6.0.11.Final</version>-->   <!--<scope>compile</scope>-->  <!--</dependency>-->  <dependency>   <groupId>org.projectlombok</groupId>   <artifactId>lombok</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-configuration-processor</artifactId>   <optional>true</optional>  </dependency>

例子編寫

首先定義一個DocumentServerProperties對象,下面這個文檔服務器配置是我假設的,主要是為了演示屬性配置的大部分情況

@Getter@Setterpublic class DocumentServerProperties {  private String remoteAddress;  private boolean preferIpAddress;  private int maxConnections=0;  private int port;  private AuthInfo authInfo;  private List<String> whitelist;  private Map<String,String> converter;  private List<Person> defaultShareUsers;  @Getter  @Setter  public static class AuthInfo {    private String username;    private String password;  }}

綁定屬性配置

注意@ConfigurationProperties并沒有把當前類注冊成為一個Spring的Bean,下面介紹@ConfigurationProperties配置注入的三種方式.

配合@Component注解直接進行注入

@ConfigurationProperties(prefix = "doc")@Componentpublic class DocumentServerProperties {  //代碼...}

使用@EnableConfigurationProperties,通常配置在標有@Configuration的類上,當然其他@Component注解的派生類也可以,不過不推薦.

@ConfigurationProperties(prefix = "doc")public class DocumentServerProperties {  //代碼...}
@EnableConfigurationProperties@Configurationpublic class SomeConfiguration {  private DocumentServerProperties documentServerProperties      public SomeConfiguration(DocumentServerProperties documentServerProperties) {    this.documentServerProperties = documentServerProperties;  }}

使用@Bean方式在標有@Configuration的類進行注入,這種方式通??梢杂迷趯Φ谌筋愡M行配置屬性注冊

@Configurationpublic 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.1doc.port=8080doc.max-connections=30doc.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.1doc.whitelist[1]=192.168.0.2doc.default-share-users[0].name=jackdoc.default-share-users[0].age=18doc.converter.a=xxConverterdoc.converter.b=xxConverterdoc.auth-info.username=userdoc.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")@Validatedpublic 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<Validator> getValidators(Bindable<?> target) {  List<Validator> 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里面去的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美丰满少妇xxxx| 这里只有精品丝袜| 国产一区二区动漫| 国产精品久久久久999| 国产精品视频白浆免费视频| 成人女保姆的销魂服务| 久久精品2019中文字幕| 91超碰caoporn97人人| 久久精品国产免费观看| 91沈先生在线观看| 国产精品久久久久久久久久东京| 中文字幕成人精品久久不卡| 最近2019年日本中文免费字幕| 一本色道久久88综合亚洲精品ⅰ| 91性高湖久久久久久久久_久久99| 日本精品性网站在线观看| 中文字幕精品www乱入免费视频| 成人在线视频网站| 中文字幕一区电影| 国产一区二区激情| 亚洲国产精品成人一区二区| 亚洲视频在线免费观看| 91精品久久久久久久久久| 亚洲精品91美女久久久久久久| 91禁国产网站| 国产精品久久久av| 亚洲少妇激情视频| 91av视频在线播放| 日韩av电影中文字幕| 欧美在线观看网址综合| 欧美午夜片欧美片在线观看| 精品女同一区二区三区在线播放| 国产精品久久久久久婷婷天堂| 日韩美女免费观看| 日韩免费观看视频| 成人伊人精品色xxxx视频| 欧美华人在线视频| 欧美性猛交xxxx免费看| 久久精品国产69国产精品亚洲| 国产va免费精品高清在线| 国产精品99蜜臀久久不卡二区| 97在线观看免费| 日韩av手机在线观看| 欧美性videos高清精品| 国产成人综合精品在线| 欧美激情喷水视频| 亚洲午夜精品久久久久久久久久久久| 欧洲成人在线视频| 亚洲性线免费观看视频成熟| 奇米一区二区三区四区久久| 亚洲欧美成人一区二区在线电影| 91精品中文在线| 成人精品网站在线观看| 久久综合网hezyo| 51精品在线观看| 国外日韩电影在线观看| 亚洲欧洲黄色网| 亚洲精品不卡在线| 国产精品久久久久久久久久99| 亚洲成人网在线| 久久久久久久久中文字幕| 久久久精品久久久久| 亚洲黄色在线观看| 亚洲三级免费看| 日韩av在线看| 欧美尤物巨大精品爽| 2020欧美日韩在线视频| 黑人巨大精品欧美一区免费视频| 日韩美女视频免费看| 77777少妇光屁股久久一区| 美日韩精品视频免费看| 一区二区亚洲欧洲国产日韩| 亚洲国产精品大全| 日韩电影免费在线观看| 亚洲大胆美女视频| 国产精品电影久久久久电影网| 插插插亚洲综合网| 国产一区二区三区久久精品| 一区二区三区视频在线| 欧美性猛交xxxx免费看| 亚洲大胆人体视频| 午夜精品99久久免费| 一区二区三区在线播放欧美| 91久久精品久久国产性色也91| 伊人久久大香线蕉av一区二区| 欧美激情一二三| 国产精品一区二区三区在线播放| 午夜精品福利在线观看| 91精品国产综合久久香蕉的用户体验| 成人久久一区二区| 欧美超级免费视 在线| 亚洲奶大毛多的老太婆| 亚洲人成电影网站色…| 国产一区二区三区视频免费| 国产精品草莓在线免费观看| 国产精品视频久| 亚洲欧美国产精品久久久久久久| 欧美黑人xxx| 国产精品旅馆在线| 欧美亚洲另类在线| 欧美美最猛性xxxxxx| 欧美野外猛男的大粗鳮| 久久精品99久久久久久久久| 日韩精品在线免费观看| 18久久久久久| 欧美成人免费全部| 青青精品视频播放| 国内外成人免费激情在线视频网站| 久久精品国产99国产精品澳门| 国产日产久久高清欧美一区| 国产日韩欧美在线看| 欧美亚洲成人免费| 日本亚洲欧美三级| 成人免费视频a| 欧美日韩国产限制| 国产精品久久久久久久久借妻| 欧美在线视频在线播放完整版免费观看| 日韩国产欧美区| 18性欧美xxxⅹ性满足| 亚洲欧美一区二区精品久久久| 色噜噜狠狠色综合网图区| 久久久亚洲国产| 色综合五月天导航| 国产区精品视频| 欧美激情在线狂野欧美精品| 欧美午夜久久久| 国产精品自产拍在线观看| 久久夜精品va视频免费观看| 国产精品自拍视频| 91精品国产综合久久香蕉最新版| 伊人久久久久久久久久久久久| 日韩欧美亚洲成人| 国产日韩欧美黄色| 欧美亚洲第一区| 亚洲另类xxxx| 国产一区二区日韩精品欧美精品| 91理论片午午论夜理片久久| 日韩在线视频国产| 亚洲国产精品高清久久久| 欧美久久精品一级黑人c片| 一本色道久久88精品综合| 91精品在线一区| 日韩av色综合| 国产精品视频成人| 精品国产31久久久久久| 神马久久桃色视频| 亚洲综合中文字幕在线观看| 91成人性视频| 色午夜这里只有精品| 91九色综合久久| 精品国产鲁一鲁一区二区张丽| 欧美乱妇40p| 国语自产精品视频在免费| 亚洲美女精品久久| 亚洲国产第一页| 亚洲精品综合精品自拍| 久久精视频免费在线久久完整在线看| 亚洲最大的免费| 久久精品国产久精国产一老狼| 日韩在线视频播放| 亚洲国模精品一区| 欧美成人精品在线视频| 久久精品国产成人精品| 久久亚洲精品网站|