国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Boot 2.0 @ConfigurationProperties 使用

mating / 1718人閱讀

摘要:引言的一個(gè)便捷功能是外部化配置,可以輕松訪問屬性文件中定義的屬性。本文將詳細(xì)介紹的使用。

引言

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

配置項(xiàng)目POM

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


    org.springframework.boot
    spring-boot-starter-parent
    2.0.4.RELEASE
     
  

添加依賴

添加web,因?yàn)槲覀冃枰褂玫絁SR-303規(guī)范的Validator,如果不想使用web依賴,也可以直接依賴hibernate-validator

添加spring-boot-configuration-processor,可以在編譯時(shí)生成屬性元數(shù)據(jù)(spring-configuration-metadata.json).

添加lombok,可以方便使用注釋處理器的功能省去Pojo定義中g(shù)et set這些麻煩工作.

   
      org.springframework.boot
      spring-boot-starter-web
    
    
      
      
      
      
    
    
      org.projectlombok
      lombok
    
    
      org.springframework.boot
      spring-boot-configuration-processor
      true
    
例子編寫

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

@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并沒有把當(dāng)前類注冊成為一個(gè)Spring的Bean,下面介紹@ConfigurationProperties配置注入的三種方式.

配合@Component注解直接進(jìn)行注入

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

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

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

}

使用@Bean方式在標(biāo)有@Configuration的類進(jìn)行注入,這種方式通常可以用在對第三方類進(jìn)行配置屬性注冊

@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

在上面的兩個(gè)配置文件中,其實(shí)已經(jīng)把我們平常大部分能使用到的屬性配置場景都覆蓋了,可能還有一些特殊的未介紹到,比如Duration、InetAddress等。

增加屬性驗(yàn)證

下面我們利用JSR303規(guī)范的實(shí)現(xiàn)對DocumentServerProperties屬性配置類,添加一些常規(guī)驗(yàn)證,比如Null檢查、數(shù)字校驗(yàn)等操作,

需要注意在Spring-Boot 2.0版本以后,如果使用JSR303對屬性配置進(jìn)行驗(yàn)證必須添加@Validated注解,使用方式如下片段:

@ConfigurationProperties(prefix = "doc")
@Validated
public class DocumentServerProperties {
    @NotNull // 判斷不為空的情況
    private String remoteAddress;
    
    //限制端口只能是80-65536之間
    @Min(80)
    @Max(65536)
    private int port;
    //其他代碼
}

在有些數(shù)情況下,我們希望自定義驗(yàn)證器,有兩種方式可以進(jìn)行實(shí)現(xiàn)

實(shí)現(xiàn)org.springframework.validation.Validator接口,并且在配置一個(gè)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 );
       }
    }
}

和上面一樣也是實(shí)現(xiàn)org.springframework.validation.Validator接口,不過是需要驗(yàn)證的屬性配置類本身去實(shí)現(xiàn)這個(gè)接口

@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) {
        //判斷邏輯其實(shí)可以參照上面的代碼片段
    }
}

特別注意:

只有在需要使用JSR303規(guī)范實(shí)現(xiàn)的驗(yàn)證器時(shí),才需要對對象配置@Validated,剛剛上面兩種方式并不需要。

第一種實(shí)現(xiàn)和第二種實(shí)現(xiàn)都是實(shí)現(xiàn)org.springframework.validation.Validator接口,但是前者是針對全局的,后者只針對實(shí)現(xiàn)這個(gè)接口的配置對象

關(guān)于上述兩點(diǎn),我為啥確定? 來自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;
}
總結(jié)

通過上面的例子,我們了解了@ConfigurationProperties的使用以及如何進(jìn)行驗(yàn)證,包括屬性驗(yàn)證器的幾種實(shí)現(xiàn)方式.下個(gè)章節(jié)我會(huì)從源碼的角度分析屬性的加載,以及如何解析到Bean里面去的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72077.html

相關(guān)文章

  • 【譯】Spring Boot 2.0的屬性綁定

    摘要:比如,在中,不能將屬性綁定到對象。引入了新的接口,能夠指出屬性取值的準(zhǔn)確位置。比如,屬性綁定的驗(yàn)證異常現(xiàn)在會(huì)顯示類允許你使用多個(gè)。我們計(jì)劃在中繼續(xù)加強(qiáng)的功能,而第一個(gè)想要支持的功能是不可變屬性綁定。 Spring Boot2.0的屬性綁定 原文從Spring boot第一個(gè)版本以來,我們可以使用@ConfigurationProperties注解將屬性綁定到對象。也可以指定屬性的各種不...

    1treeS 評論0 收藏0
  • Spring Boot 2.0 外部化配置介紹

    摘要:可以使用外部化配置來方便在不同環(huán)境的運(yùn)行同樣的程序文件文件環(huán)境變量命令行參數(shù)內(nèi)置順序?qū)崿F(xiàn)了很多按以下順序進(jìn)行合理的相同屬性的覆蓋目錄下的全局設(shè)置屬性,如果激活測試用例上的注解測試用例上的注解。 簡介 在應(yīng)用中管理配置并不是一個(gè)容易的任務(wù),尤其是在應(yīng)用需要部署到多個(gè)環(huán)境中時(shí)。通常會(huì)需要為每個(gè)環(huán)境提供一個(gè)對應(yīng)的屬性文件,用來配置各自的數(shù)據(jù)庫連接信息、服務(wù)器信息和第三方服務(wù)賬號等。通常的應(yīng)用...

    lmxdawn 評論0 收藏0
  • 記錄spring-boot 1.5.9升級至2.0.1的那些坑

    摘要:前兩天組里的大佬心血來潮,讓我這周把項(xiàng)目里的版本升級到最新版本,目前項(xiàng)目用到的是版本為的版本為現(xiàn)在按照要求統(tǒng)一升級到。三數(shù)據(jù)庫連接池同樣也是版本不兼容,需要升級到,親測有效。差不多這些,后續(xù)遇到其他問題還會(huì)繼續(xù)補(bǔ)充。 前兩天組里的大佬心血來潮,讓我這周把項(xiàng)目里的spring-boot、spring-cloud版本升級到最新版本,目前項(xiàng)目用到的是spring-boot版本為1.5.9.R...

    gitmilk 評論0 收藏0
  • Spring Boot 2.0 配置屬性自定義轉(zhuǎn)換

    引言 當(dāng)我們通過@ConfigurationProperties注解實(shí)現(xiàn)配置 bean的時(shí)候,如果默認(rèn)的配置屬性轉(zhuǎn)換無法滿足我們的需求的時(shí)候,我們可以根據(jù)自己的需求通過以下擴(kuò)展方式對配置屬性進(jìn)行轉(zhuǎn)換 PropertyEditorSupport實(shí)現(xiàn) 下面的例子是把屬性中定義的字符串轉(zhuǎn)換成Movie,并且把name的值大寫 繼承PropertyEditorSupport并且實(shí)現(xiàn)PropertyEdi...

    lingdududu 評論0 收藏0
  • @ConfigurationProperties 注解使用姿勢,這一篇就夠了

    摘要:在項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在或文件中,通過注解,我們可以方便的獲取這些參數(shù)值使用配置模塊假設(shè)我們正在搭建一個(gè)發(fā)送郵件的模塊。這使得在不影響其他模塊的情況下重構(gòu)一個(gè)模塊中的屬性變得容易。 在編寫項(xiàng)目代碼時(shí),我們要求更靈活的配置,更好的模塊化整合。在 Spring Boot 項(xiàng)目中,為滿足以上要求,我們將大量的參數(shù)配置在 application.properties 或...

    SolomonXie 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<