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

資訊專欄INFORMATION COLUMN

SpringBoot | @Value 和 @ConfigurationProperties 的區(qū)別

lovXin / 708人閱讀

微信公眾號(hào):一個(gè)優(yōu)秀的廢人。如有問題,請(qǐng)后臺(tái)留言,反正我也不會(huì)聽。
前言

最近有跳槽的想法,所以故意復(fù)習(xí)了下 SpringBoot 的相關(guān)知識(shí),復(fù)習(xí)得比較細(xì)。其中有些,我感覺是以前忽略掉的東西,比如 @Value 和 @ConfigurationProperties 的區(qū)別 。

如何使用

定義兩個(gè)對(duì)象,一個(gè)學(xué)生對(duì)象,對(duì)應(yīng)著一個(gè)老師對(duì)象,代碼如下:

@ConfigurationProperties

學(xué)生類

@Component
@ConfigurationProperties(prefix = "student") // 指定配置文件中的 student 屬性與這個(gè) bean綁定
public class Student {

    private String firstName;

    private String lastName;

    private Integer age;

    private String gender;

    private String city;

    private Teacher teacher;

    private List hobbys;

    private Map scores;

    //注意,為了測試必須重寫 toString 和 get,set 方法
}

老師類

public class Teacher {

    private String name;

    private Integer age;

    private String gender;

    //注意,為了測試必須重寫 toString 和 get,set 方法
}

測試類

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootValConproDemoApplicationTests {

    @Autowired
    private Student student;

    @Test
    public void contextLoads() {
        // 這里為了方便,但工作中千萬不能用 System.out
        System.out.println(student.toString());
    }
}

輸出結(jié)果

Student{firstName="陳", lastName="一個(gè)優(yōu)秀的廢人", age=24, gender="男", city="廣州", teacher=Teacher{name="eses", age=24, gender="女"}, hobbys=[籃球, 羽毛球, 兵兵球], scores={java=100, Python=99, C=99}}

@Value

@Value 支持三種取值方式,分別是 字面量、${key}從環(huán)境變量、配置文件中獲取值以及 #{SpEL}

學(xué)生類

@Component
//@ConfigurationProperties(prefix = "student") // 指定配置文件中的 student 屬性與這個(gè) bean綁定
public class Student {

    /**
     * 
     *      
     * 
     */

    @Value("陳") // 字面量
    private String firstName;

    @Value("${student.lastName}") // 從環(huán)境變量、配置文件中獲取值
    private String lastName;

    @Value("#{12*2}") // #{SpEL}
    private Integer age;

    private String gender;

    private String city;

    private Teacher teacher;

    private List hobbys;

    private Map scores;

    //注意,為了測試必須重寫 toString 和 get,set 方法
}

測試結(jié)果

Student{firstName="陳", lastName="一個(gè)優(yōu)秀的廢人", age=24, gender="null", city="null", teacher=null, hobbys=null, scores=null}
區(qū)別
二者區(qū)別 @ConfigurationProperties @Value
功能 批量注入配置文件中的屬性 一個(gè)個(gè)指定
松散綁定(松散語法) 支持 不支持
SpEL 不支持 支持
JSR303數(shù)據(jù)校驗(yàn) 支持 不支持
復(fù)雜類型封裝 支持 不支持

從上表可以看見,@ConfigurationProperties 和 @Value 主要有 5 個(gè)不同,其中第一個(gè)功能上的不同,上面已經(jīng)演示過。下面我來介紹下剩下的 4 個(gè)不同。

松散語法

松散語法的意思就是一個(gè)屬性在配置文件中可以有多個(gè)屬性名,舉個(gè)栗子:學(xué)生類當(dāng)中的 firstName 屬性,在配置文件中可以叫 firstName、first-name、first_name 以及 FIRST_NAME。 而 @ConfigurationProperties 是支持這種命名的,@Value 不支持。下面以 firstName 為例,測試一下。如下代碼:

@ConfigurationProperties

學(xué)生類的 firstName 屬性在 yml 文件中被定義為 first_name:

student:
  first_name: 陳  # 學(xué)生類的 firstName 屬性在 yml 文件中被定義為 first_name
  lastName: 一個(gè)優(yōu)秀的廢人
  age: 24
  gender: 男
  city: 廣州
  teacher: {name: eses,age: 24,gender: 女}
  hobbys: [籃球,羽毛球,兵兵球]
  scores: {java: 100,Python: 99,C++: 99}

學(xué)生類:

@Component
@ConfigurationProperties(prefix = "student") // 指定配置文件中的 student 屬性與這個(gè) bean綁定
public class Student {

    /**
     * 
     *      
     * 
     */

    //@Value("陳") // 字面量
    private String firstName;

    //@Value("${student.lastName}") // 從環(huán)境變量、配置文件中獲取值
    private String lastName;

    //@Value("#{12*2}") // #{SpEL}
    private Integer age;

    private String gender;

    private String city;

    private Teacher teacher;

    private List hobbys;

    private Map scores;

    //注意,為了測試必須重寫 toString 和 get,set 方法
}

測試結(jié)果:

Student{firstName="陳", lastName="一個(gè)優(yōu)秀的廢人", age=24, gender="男", city="廣州", teacher=Teacher{name="eses", age=24, gender="女"}, hobbys=[籃球, 羽毛球, 兵兵球], scores={java=100, Python=99, C=99}}

@Value

學(xué)生類:

@Component
//@ConfigurationProperties(prefix = "student") // 指定配置文件中的 student 屬性與這個(gè) bean綁定
public class Student {

    /**
     * 
     *      
     * 
     */

    //@Value("陳") // 字面量
    @Value("${student.firstName}")
    private String firstName;

    //@Value("${student.lastName}") // 從環(huán)境變量、配置文件中獲取值
    private String lastName;

    //@Value("#{12*2}") // #{SpEL}
    private Integer age;

    private String gender;

    private String city;

    private Teacher teacher;

    private List hobbys;

    private Map scores;
    
   //注意,為了測試必須重寫 toString 和 get,set 方法
}

測試結(jié)果:啟動(dòng)報(bào)錯(cuò),找不到 bean。

從上面兩個(gè)測試結(jié)果可以看出,使用 @ConfigurationProperties 注解時(shí),yml 中的屬性名為 last_name 而學(xué)生類中的屬性為 lastName 但依然能取到值,而使用 @value 時(shí),使用 lastName 確報(bào)錯(cuò)了。證明 @ConfigurationProperties 支持松散語法,@value 不支持。

SpEL

SpEL 使用 #{...} 作為定界符 , 所有在大括號(hào)中的字符都將被認(rèn)為是 SpEL , SpEL 為 bean 的屬性進(jìn)行動(dòng)態(tài)賦值提供了便利。

@Value

如上述介紹 @Value 注解使用方法時(shí),有這樣一段代碼:

@Value("#{12*2}") // #{SpEL}
private Integer age;

證明 @Value 是支持 SpEL 表達(dá)式的。

@ConfigurationProperties

由于 yml 中的 # 被當(dāng)成注釋看不到效果。所以我們新建一個(gè) application.properties 文件。把 yml 文件內(nèi)容注釋,我們?cè)?properties 文件中把 age 屬性寫成如下所示:

student.age=#{12*2}

把學(xué)生類中的 @ConfigurationProperties 注釋打開,注釋 @value 注解。運(yùn)行報(bào)錯(cuò), age 屬性匹配異常。

說明 @ConfigurationProperties 不支持 SpEL

JSR303 數(shù)據(jù)校驗(yàn)

@Value

加入 @Length 校驗(yàn):

@Component
@Validated
//@ConfigurationProperties(prefix = "student") // 指定配置文件中的 student 屬性與這個(gè) bean綁定
public class Student {

    /**
     * 
     *      
     * 
     */

    //@Value("陳") // 字面量
    @Value("${student.first-name}")
    @Length(min=5, max=20, message="用戶名長度必須在5-20之間")
    private String firstName;

    //@Value("${student.lastName}") // 從環(huán)境變量、配置文件中獲取值
    private String lastName;

    //@Value("#{12*2}") // #{SpEL}
    private Integer age;

    private String gender;

    private String city;

    private Teacher teacher;

    private List hobbys;

    private Map scores;
}

yaml:

student:
  first_name: 陳

測試結(jié)果:

Student{firstName="陳", lastName="null", age=null, gender="null", city="null", teacher=null, hobbys=null, scores=null}

yaml 中的 firstname 長度為 1 。而檢驗(yàn)規(guī)則規(guī)定 5-20 依然能取到屬性,說明檢驗(yàn)不生效,@Value 不支持 JSR303 數(shù)據(jù)校驗(yàn)

@ConfigurationProperties

學(xué)生類:

@Component
@Validated
@ConfigurationProperties(prefix = "student") // 指定配置文件中的 student 屬性與這個(gè) bean綁定
public class Student {

    /**
     * 
     *      
     * 
     */

    //@Value("陳") // 字面量
    //@Value("${student.first-name}")
    @Length(min=5, max=20, message="用戶名長度必須在5-20之間")
    private String firstName;

    //@Value("${student.lastName}") // 從環(huán)境變量、配置文件中獲取值
    private String lastName;

    //@Value("#{12*2}") // #{SpEL}
    private Integer age;

    private String gender;

    private String city;

    private Teacher teacher;

    private List hobbys;

    private Map scores;
}

測試結(jié)果:報(bào)錯(cuò)

[firstName],20,5]; default message [用戶名長度必須在5-20之間]

校驗(yàn)生效,支持 JSR303 數(shù)據(jù)校驗(yàn)。

復(fù)雜類型封裝

復(fù)雜類型封裝指的是,在對(duì)象以及 map (如學(xué)生類中的老師類以及 scores map)等屬性中,用 @Value 取是取不到值,比如:

@Component
//@Validated
//@ConfigurationProperties(prefix = "student") // 指定配置文件中的 student 屬性與這個(gè) bean綁定
public class Student {

    /**
     * 
     *      
     * 
     */

    //@Value("陳") // 字面量
    //@Value("${student.first-name}")
    //@Length(min=5, max=20, message="用戶名長度必須在5-20之間")
    private String firstName;

    //@Value("${student.lastName}") // 從環(huán)境變量、配置文件中獲取值
    private String lastName;

    //@Value("#{12*2}") // #{SpEL}
    private Integer age;

    private String gender;

    private String city;

    @Value("${student.teacher}")
    private Teacher teacher;

    private List hobbys;

    @Value("${student.scores}")
    private Map scores;
}

這樣取是報(bào)錯(cuò)的。而上文介紹 @ConfigurationProperties 和 @Value 的使用方法時(shí)已經(jīng)證實(shí) @ConfigurationProperties 是支持復(fù)雜類型封裝的。也就是說 yaml 中直接定義 teacher 以及 scores 。 @ConfigurationProperties 依然能取到值。

怎么選用?

如果說,只是在某個(gè)業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項(xiàng)值,使用 @Value;比如,假設(shè)現(xiàn)在學(xué)生類加多一個(gè)屬性叫 school 那這個(gè)屬性對(duì)于該校所有學(xué)生來說都是一樣的,但防止我這套系統(tǒng)到了別的學(xué)校就用不了了。那我們可以直接在 yml 中給定 school 屬性,用 @Value 獲取。當(dāng)然上述只是舉個(gè)粗暴的例子,實(shí)際開發(fā)時(shí),school 屬性應(yīng)該是保存在數(shù)據(jù)庫中的。

如果說,專門編寫了一個(gè) javaBean 來和配置文件進(jìn)行映射,我們就直接使用 @ConfigurationProperties。

完整代碼

https://github.com/turoDog/Demo/tree/master/springboot_val_conpro_demo

如果覺得對(duì)你有幫助,請(qǐng)給個(gè) Star 再走唄,非常感謝。

后語

如果本文對(duì)你哪怕有一丁點(diǎn)幫助,請(qǐng)幫忙點(diǎn)好看。你的好看是我堅(jiān)持寫作的動(dòng)力。

另外,關(guān)注之后在發(fā)送 1024 可領(lǐng)取免費(fèi)學(xué)習(xí)資料。

資料詳情請(qǐng)看這篇舊文:Python、C++、Java、Linux、Go、前端、算法資料分享

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

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

相關(guān)文章

  • SpringBoot | @Value @ConfigurationProperties 區(qū)別

    微信公眾號(hào):一個(gè)優(yōu)秀的廢人。如有問題,請(qǐng)后臺(tái)留言,反正我也不會(huì)聽。 前言 最近有跳槽的想法,所以故意復(fù)習(xí)了下 SpringBoot 的相關(guān)知識(shí),復(fù)習(xí)得比較細(xì)。其中有些,我感覺是以前忽略掉的東西,比如 @Value 和 @ConfigurationProperties 的區(qū)別 。 如何使用 定義兩個(gè)對(duì)象,一個(gè)學(xué)生對(duì)象,對(duì)應(yīng)著一個(gè)老師對(duì)象,代碼如下: @ConfigurationProperties ...

    Scliang 評(píng)論0 收藏0
  • SpringBoot學(xué)習(xí)筆記:Spring Boot配置文件詳解

    摘要:全局配置文件默認(rèn)為下的,另外它還可以重命名為格式即對(duì)著兩種格式均支持。其中每個(gè)環(huán)境的數(shù)據(jù)庫地址服務(wù)器端口等等配置都會(huì)不同,如果在為不同環(huán)境打包時(shí)都要頻繁修改配置文件的話,那必將是個(gè)非常繁瑣且容易發(fā)生錯(cuò)誤的事。 SpringBoot全局配置文件默認(rèn)為src/main/resources下的application.properties,另外它還可以重命名為.yml格式(即SpringBoo...

    sunny5541 評(píng)論0 收藏0
  • SpringBoot非官方教程 | 第二篇:SpringBoot配置文件詳解

    摘要:采納了建立生產(chǎn)就緒應(yīng)用程序的觀點(diǎn)。優(yōu)先于配置的慣例,旨在讓您盡快啟動(dòng)和運(yùn)行。啟動(dòng)工程,訪問我們會(huì)發(fā)現(xiàn)配置文件信息讀到了。三自定義配置文件上面介紹的是我們都把配置文件寫到中。源碼下載五參考文獻(xiàn)干貨系列二配置文件解析屬性配置文件詳解 springboot采納了建立生產(chǎn)就緒Spring應(yīng)用程序的觀點(diǎn)。 Spring Boot優(yōu)先于配置的慣例,旨在讓您盡快啟動(dòng)和運(yùn)行。在一般情況下,我們不需要做...

    荊兆峰 評(píng)論0 收藏0
  • 這樣講 SpringBoot 自動(dòng)配置原理,你應(yīng)該能明白了吧

    摘要:這里有一個(gè)參數(shù),主要是用來指定該配置項(xiàng)在配置文件中的前綴。創(chuàng)建一個(gè)配置類,里面沒有顯式聲明任何的,然后將剛才創(chuàng)建的導(dǎo)入。創(chuàng)建實(shí)現(xiàn)類,返回的全類名。創(chuàng)建實(shí)現(xiàn)類,實(shí)現(xiàn)方法直接手動(dòng)注冊(cè)一個(gè)名叫的到容器中。前言 小伙伴們是否想起曾經(jīng)被 SSM 整合支配的恐懼?相信很多小伙伴都是有過這樣的經(jīng)歷的,一大堆配置問題,各種排除掃描,導(dǎo)入一個(gè)新的依賴又得添加新的配置。自從有了 SpringBoot 之后,咋...

    cc17 評(píng)論0 收藏0
  • Spring Boot(二)Spring Boot 配置

    摘要:不同的環(huán)境之間的配置存在覆蓋關(guān)系。提供了一種統(tǒng)一的方式來管理應(yīng)用的配置,允許開發(fā)人員使用屬性文件文件環(huán)境變量和命令行參數(shù)來定義優(yōu)先級(jí)不同的配置值。比如命令行參數(shù)的優(yōu)先級(jí)被設(shè)置為最高。 一.關(guān)于Spring Boot的配置 Spring Boot 對(duì)于開發(fā)人員最大的好處在于可以對(duì) Spring 應(yīng)用進(jìn)行自動(dòng)配置。Spring Boot 會(huì)根據(jù)應(yīng)用中聲明的第三方依賴來自動(dòng)配置 Spring...

    nicercode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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