91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

@ConfigurationProperties怎么在Spring Boot2.0中使用

發布時間:2021-03-25 17:48:57 來源:億速云 閱讀:137 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關@ConfigurationProperties怎么在Spring Boot2.0中使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

配置項目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
@Setter
public 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")
@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<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怎么在Spring Boot2.0中使用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

英吉沙县| 敖汉旗| 乌海市| 依兰县| 磴口县| 高雄市| 罗定市| 文成县| 阿拉尔市| 冕宁县| 高平市| 仁怀市| 镇平县| 遵化市| 东阳市| 余庆县| 新宾| 冀州市| 吉林市| 成都市| 马龙县| 报价| 丰台区| 武安市| 乌兰察布市| 新沂市| 利津县| 阿鲁科尔沁旗| 都昌县| 即墨市| 北宁市| 兴隆县| 古交市| 荥经县| 枣庄市| 五家渠市| 漯河市| 象山县| 通海县| 杭锦旗| 布拖县|