一、不通過(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ò)