@Value注入
//application.yml中配置
user.name=admin
// 屬性類代碼
@Component
public class MyBean {
@Value("${user.name}")
private String name;
// ...應(yīng)有屬性的getter、setter方法
}
注意:
- 屬性類上的
@Component一定要加上,只有加上該注解,這個(gè)屬性類才會被加載到Spring的容器中,才可被注入使用。 - 注入和之前將的一樣有JavaBean 屬性綁定和構(gòu)造器綁定,通常設(shè)置該屬性類的getter、setter方法即可,否則屬性值不能進(jìn)行綁定
- 需要注入的屬性是寫在配置文件中的,但是不排除通過命令行執(zhí)行的時(shí)候注入情況
java -jar app.jar --user.name="Spring" - 配置不一定寫在application.yml中也可能單獨(dú)新建一個(gè)配置文件,這時(shí)候步驟為:1)在resource目錄下新建user.yml文件,寫入配置屬性。2)使用
@PropertySource("classpath:user.yml")定義配置文件位置
// 屬性類代碼
@Component
@PropertySource("classpath:user.yml")
public class MyBean {
@Value("${user.name}")
private String name;
// ...應(yīng)有屬性的getter、setter方法
}
類型安全的屬性注入
使用@Value(“ $ {property}”)批注來注入配置屬性有時(shí)會很麻煩,尤其是使用多個(gè)屬性或數(shù)據(jù)本質(zhì)上是分層時(shí)。 Spring Boot提供了一種使用屬性的替代方法,該方法使強(qiáng)類型的Bean可以管理和驗(yàn)證應(yīng)用程序的配置。
在MyBean上加上注解:@ConfigurationProperties(prefix = "user")
// 屬性類代碼
@Component
@PropertySource("classpath:user.yml")
@ConfigurationProperties(prefix = "user")
public class MyBean {
//@Value("${user.name}")
private String name;
// ...應(yīng)有屬性的getter、setter方法
}
注入復(fù)雜數(shù)據(jù)類型
上面描述的都是簡單的數(shù)據(jù)類型注入方法,那么復(fù)雜的數(shù)據(jù)類型應(yīng)該怎么在配置文件中定義呢?假如有一個(gè)MyPojo 有name和description兩個(gè)屬性,在AcmeProperties定義MyPojo的List和Map值。
List
單純的List
- application.yml
//list: [111,222]也是可以的
zp:
list:
- 111
- 222
name: 666
- Zp.java
@ConfigurationProperties(prefix = "zp")
@Data
@Component
public class Zp {
private List<String> list;
}
- controller
@RequiredArgsConstructor
@RestController
public class HelloController {
// @Autowired
private final Zp zp;
@Value("${zp.name}")
private String name;
@RequestMapping("/test")
public List<String> hello(){
return zp.getList();
}
@RequestMapping("/test1")
public String hello1(){
return name;
}
}
包含類的List
- application.yml
zp:
list:
- name: "my name"
description: "my description"
- name: "another name"
description: "another description"
- application.properties
zp.list[0].name=my name
zp.list[0].description=my description
zp.list[1].name=another name
zp.list[1].description=another description
- Zp.java
@ConfigurationProperties(prefix = "zp")
@Data
@Component
public class Zp {
private List<MyPojo> list;
@Data
public static class MyPojo{
private String name;
private String description;
}
}
Map
- application.yml
zp:
map:
key1:
name: "dev name 1"
key2:
name: "dev name 2"
description: "dev description 2"
- application.properties
zp.map.key1.name=dev name 1
zp.map.key2.name=dev name 2
zp.map.key2.description=dev description 2
- Zp.java
@ConfigurationProperties(prefix = "zp")
@Data
@Component
public class Zp {
private Map<String, MyPojo> map;
@Data
public static class MyPojo{
private String name;
private String description;
}
}
補(bǔ)充知識
SpEL(Spring Expression Language)即Spring表達(dá)式語言,可以在運(yùn)行時(shí)查詢和操作數(shù)據(jù)。使用#{...}作為定界符, 所有在大括號中的字符都將被認(rèn)為是 SpEL。
#{…}和${…}
${…}用于獲取屬性文件中對應(yīng)的值,但是如果屬性文件中沒有這個(gè)屬性,則會報(bào)錯(cuò)??梢酝ㄟ^賦予默認(rèn)值解決這個(gè)問題
@Value("${zp.host:127.0.0.1}")
#{…}{}里面的內(nèi)容必須符合SpEL表達(dá)式,常見的如
@Value("#{'Hello World'.concat('!')}")
@Value("#{'Hello World'.bytes.length}")
@Value("#{'${words}'.split('\\|')}")
/**
* 注入其他Bean屬性:注入config對象的屬性tool
*/
@Value("#{config.tool}")