【Spring boot】 @Value注解

一、不通過(guò)配置文件的注入屬性

1.1 注入普通字符串

直接附在屬性名上,在 Bean 初始化時(shí),會(huì)賦初始值

@Value("normal")
private String normal; 

1.2 注入java系統(tǒng)變量

@Value("#{systemProperties['os.name']}")
private String systemPropertiesName; // 注入操作系統(tǒng)屬性

1.3 注入表達(dá)式結(jié)果

#{ }里面寫表 SpEL 達(dá)式

@Value("#{ T(java.lang.Math).random() * 100.0 }")
private double randomNumber; //注入表達(dá)式結(jié)果

1.4 將配置文件 *.properties 或 *. yml 里 配置的 屬性 注入

yml配置如下

book:
  name: live
@Value("${book.name}")
private String bookName;

1.5 注入文件資源

@Value("classpath:com/hry/spring/configinject/config.txt")
private Resource resourceFile; // 注入文件資源

1.6 注入url資源

@Value("http://www.baidu.com")
private Resource testUrl; // 注入U(xiǎn)RL資源

二、通過(guò)配置文件的注入屬性

Springboot通過(guò)@Value注解將配置文件中的屬性注入到容器內(nèi)組件中
(可用在@Controller、@Service、@Configuration、@Component等Spring托管的類中)

2.1 普通字符串注入

例:yml中存在key:

name: zs

@Value注入

@Value("${name}")
public String name;

注:當(dāng)yml中的name沒(méi)有對(duì)應(yīng)值時(shí),此時(shí),字符串name的值為""
設(shè)置注入屬性的默認(rèn)值(當(dāng)配置文件中沒(méi)有此key時(shí),此默認(rèn)值生效),語(yǔ)法:

// 此時(shí),若配置文件中沒(méi)有name這個(gè)key,變量name的值為zch
@Value("${name:zch}")
public String name;

2.2 常用的int、boolean類型

yml 配置文件

port: 8888
flag: true

Java代碼

@Value("${port}")
public int port;

@Value("${flag}")
public boolean flag;

2.3 數(shù)組類型

yml 配置文件

id: 1,2,3

Java代碼

@Value("${id}")
public int[] idArray;

2.4 list類型

示例1

yml 配置文件

id: 1,2,3

Java代碼

@Value("#{'${id}'.split(',')}")
public List<String> idList;

注意:當(dāng)yml中id沒(méi)有對(duì)應(yīng)值時(shí),集合idList長(zhǎng)度為1,存在值"" (原本以為是空集合,造成bug,特記錄)

解決辦法

在 split() 之前判斷下是否為空即可

@Value("#{'${id:}'.empty ? null : '${id:}'.split(',')}")  
private List<String> idList;  

示例2

test:
  ids:
    - 1
    - 2
    - 3

對(duì)于 .properties文件配置如下所以:

test.ids[0]=1
test.ids[1]=2
test.ids[2]=3

如果通過(guò)@Value注解獲取如下所示:

@Value("${test.ids}")  
private List<String> ids;  

你會(huì)發(fā)現(xiàn)程序直接報(bào)錯(cuò)了,報(bào)錯(cuò)信息如下:

java.lang.IllegalArgumentException: Could not resolve placeholder 'test.ids' in value "${test.ids}"  

解決辦法

新建一個(gè)配置類:

@Data
@Configuration
@ConfigurationProperties("test")
public class GetListConfig {
    private List<String> ids;
}

通過(guò)注入的方式使用,即可;

2.5 map類型

user: "{name: 'zs',age: '23'}" #注意此值用雙引號(hào)包裹

Java代碼

@Value("#{${user}}")
public Map<String,String> userInfo;

注意: 當(dāng)yml中user沒(méi)有對(duì)應(yīng)值時(shí),啟動(dòng)報(bào)錯(cuò)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容