欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用@Value注解為bean的屬性賦值方法總結(jié)

 更新時(shí)間:2023年05月07日 14:17:08   作者:懷夢(mèng)  
這篇文章主要介紹了利用@Value注解為bean的屬性賦值方法總結(jié),文中有詳細(xì)的代碼示例,對(duì)學(xué)習(xí)@Value注解有一定的參考價(jià)值,需要的朋友可以參考下

1.@Value注解

@Value注解的源碼,如下所示

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
  
    String value();
}

從@Value注解的源碼中可以看出,@Value注解可以標(biāo)注在字段、方法、參數(shù)以及注解上,而且在程序運(yùn)行期間生效

2.@Value注解的用法

2.1.不通過(guò)配置文件注入屬性的情況

通過(guò)@Value注解將外部的值動(dòng)態(tài)注入到bean的屬性中,一般有如下這幾種情況

  • 注入普通字符串
@Value("liqb")
private String name; // 注入普通字符串
  • 注入操作系統(tǒng)屬性
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; // 注入操作系統(tǒng)屬性
  • 注入SpEL表達(dá)式結(jié)果
@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber; //注入SpEL表達(dá)式結(jié)果
  • 注入其他bean中屬性的值
@Value("#{person.name}")
private String username; // 注入其他bean中屬性的值,即注入person對(duì)象的name屬性中的值
  • 注入文件資源
@Value("classpath:/config.properties")
private Resource resourceFile; // 注入文件資源
  • 注入U(xiǎn)RL資源
@Value("http://www.baidu.com")
private Resource url; // 注入U(xiǎn)RL資源

2.2.通過(guò)配置文件注入屬性的情況

在項(xiàng)目的src/main/resources目錄下新建一個(gè)屬性文件,例如person.properties,其內(nèi)容如下:

person.nickName=liqb

新建MainConfigOfPropertyValues配置類,在該類上使用@PropertySource注解讀取外部配置文件中的key/value并保存到運(yùn)行的環(huán)境變量中

package com.tianxia.springannotation.config;

import com.tianxia.springannotation.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * 配置類
 * @author liqb
 * @date 2023-05-04 11:28
 **/
@Configuration
@PropertySource(value={"classpath:/person.properties"})
public class MainConfigOfPropertyValues {

    @Bean
    public Person person() {
        return new Person();
    }
}

加載完外部的配置文件以后,就可以使用${key}取出配置文件中key所對(duì)應(yīng)的值,并將其注入到bean的屬性中了

package com.tianxia.springannotation.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;

import java.io.Serializable;

/**
 * Person類
 * @author liqb
 * @date 2023-04-21 16:00
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private Integer age;

    /**
     * 昵稱
     */
    @Value("${person.nickName}")
    private String nickName;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

2.3.@Value中#{···}和${···}的區(qū)別

提供一個(gè)測(cè)試屬性文件,advance_value_inject.properties,內(nèi)容如下所示

server.name=server1,server2,server3
author.name=liqb

新建AdvanceValueInject類,并在該類上使用@PropertySource注解讀取外部屬性文件中的key/value并保存到運(yùn)行的環(huán)境變量中,即加載外部的advance_value_inject.properties屬性文件。

package com.tianxia.springannotation.config;

import com.tianxia.springannotation.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * 配置類
 * @author liqb
 * @date 2023-05-04 11:28
 **/
@Configuration
@PropertySource(value={"classpath:/person.properties"})
public class MainConfigOfPropertyValues {

    @Bean
    public Person person() {
        return new Person();
    }
}

2.3.1.${···}的用法

{}里面的內(nèi)容必須符合SpEL表達(dá)式,通過(guò)@Value(“${spelDefault.value}”)我們可以獲取屬性文件中對(duì)應(yīng)的值,但是如果屬性文件中沒(méi)有這個(gè)屬性,那么就會(huì)報(bào)錯(cuò)。不過(guò),我們可以通過(guò)賦予默認(rèn)值來(lái)解決這個(gè)問(wèn)題,如下所示。

@Value("${author.name:liqb}")
private String name;

表示向bean的屬性中注入屬性文件中的author.name屬性所對(duì)應(yīng)的值,如果屬性文件中沒(méi)有author.name這個(gè)屬性,那么便向bean的屬性中注入默認(rèn)值liqb。

2.3.2.#{···}的用法

{}里面的內(nèi)容同樣也是必須符合SpEL表達(dá)式。例如,

// SpEL:調(diào)用字符串Hello World的concat方法
@Value("#{'Hello World'.concat('!')}")
private String helloWorld;

// SpEL:調(diào)用字符串的getBytes方法,然后再調(diào)用其length屬性
@Value("#{'Hello World'.bytes.length}")
private String helloWorldBytes;

2.3.3.${···}和#{···}的混合使用

${···}和#{···}可以混合使用,例如:

// SpEL:傳入一個(gè)字符串,根據(jù)","切分后插入列表中, #{}和${}配合使用時(shí),注意不能反過(guò)來(lái)${}在外面,而#{}在里面
@Value("#{'${server.name}'.split(',')}")
private List<String> severs;

上面片段的代碼的執(zhí)行順序:通過(guò)**${server.name}從屬性文件中獲取值并進(jìn)行替換,然后就變成了執(zhí)行SpEL表達(dá)式{‘server1,server2,server3’.split(‘,’)}**。

2.3.4.小結(jié)

#{···}:用于執(zhí)行SpEl表達(dá)式,并將內(nèi)容賦值給屬性
${···}:主要用于加載外部屬性文件中的值
${···}和#{···}可以混合使用,但是必須#{}在外面

以上就是利用@Value注解為bean的屬性賦值方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于@Value為bean屬性賦值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java使用JDBC連接數(shù)據(jù)庫(kù)的五種方式(IDEA版)

    java使用JDBC連接數(shù)據(jù)庫(kù)的五種方式(IDEA版)

    這篇文章主要介紹了java使用JDBC連接數(shù)據(jù)庫(kù)的五種方式(IDEA版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java如何獲取接口所有的實(shí)現(xiàn)類

    Java如何獲取接口所有的實(shí)現(xiàn)類

    這篇文章主要介紹了Java如何獲取接口所有的實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • MyBatis中基于別名typeAliases的設(shè)置

    MyBatis中基于別名typeAliases的設(shè)置

    這篇文章主要介紹了MyBatis中基于別名typeAliases的設(shè)置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java CRM系統(tǒng)用戶登錄功能實(shí)現(xiàn)代碼實(shí)例

    Java CRM系統(tǒng)用戶登錄功能實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了Java CRM系統(tǒng)用戶登錄功能實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java?JVM虛擬機(jī)調(diào)優(yōu)詳解

    Java?JVM虛擬機(jī)調(diào)優(yōu)詳解

    JVM是JavaVirtualMachine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的,本文主要介紹了jvm調(diào)優(yōu),感興趣的小伙伴們可以參考一下<BR>
    2022-07-07
  • MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)

    MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)

    MyBatis Plus 集成了多種主鍵策略,幫助用戶快速生成主鍵,本文主要介紹了MyBatisPlus主鍵策略的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Nacos docker單機(jī)模式部署實(shí)現(xiàn)過(guò)程詳解

    Nacos docker單機(jī)模式部署實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了Nacos docker單機(jī)模式部署實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring中@Conditional注解用法詳解

    Spring中@Conditional注解用法詳解

    這篇文章主要介紹了Spring中@Conditional注解用法詳解,@Conditional是Spring4版本新提供的一種注解,它的作用是按照設(shè)定的條件進(jìn)行判斷,把滿足判斷條件的bean注冊(cè)到Spring容器,需要的朋友可以參考下
    2023-11-11
  • Java設(shè)計(jì)模式之抽象工廠模式

    Java設(shè)計(jì)模式之抽象工廠模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之抽象工廠模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 通過(guò)openOffice將office文件轉(zhuǎn)成pdf

    通過(guò)openOffice將office文件轉(zhuǎn)成pdf

    這篇文章主要介紹了通過(guò)openOffice將office文件轉(zhuǎn)成pdf,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論