SpringBoot給屬性注入值的兩種方式:
一、使用 @ConfigurationProperties 註解
該註解將全局配置文件(application.properties 或 application.yml 文件)中配置的每一個屬性的值,映射到當前類的屬性上。告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;
【注意】:@ConfigurationProperties 註解只能映射全局配置文件中所配置的屬性值,如果是自定義的配置文件,則映射不到。
1.javaBean:
/**
* prefix = "person":配置文件中person 下面的所有屬性進行一一映射
* 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能,因此需要使用 @Component 註解將當前類掃描到容器中;
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
2.配置文件
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
3.測試
在 SpringBoot的測試類中進行測試:
springboot 單元測試,可以在測試期間很方便的將類自動注入到容器。
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootConfigApplicationTests{
@Autowired
Person person;
@Test
public void contestLoads(){
System.out.println(person);
}
}
二、使用 @Value 註解爲 bean 的屬性注入值。
類似於spring 配置文件中用標籤配置bean,@value 註解可以直接給bean的屬性賦值。
<bean> <property name="name" value="zs"></property></bean>
@Value註解的使用方式和標籤的方式一樣,可以使用以下方式配置值:
(1).字面量;
(2).${key},從環境變量、配置文件中獲取值;
(3).#{SpEL};
1.javaBean
@Component
public class Person {
@Value("${person.lase-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
2.配置文件
person.last-name=張三
person.age=18
person.boss=false
3.測試(同@configurationProperties測試方法)
三、@Value獲取值和@ConfigurationProperties獲取值比較
無論全局配置文件是 yml 還是 properties 他們都能獲取到值,但有如下不同:
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 一個個指定 |
鬆散綁定(鬆散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數據校驗 | 支持 | 不支持 |
複雜類型封裝 | 支持 | 不支持 |
【tips】:
(1).鬆散綁定是指:無論是 yml 配置文件中叫last-name、lastName、或者 properties 文件中叫 person.last-name,都能成功的將配置文件的值注入給bean的屬性。
(2).複雜類型封裝:@Value 註解的方式無法給類似於 Map 等類型的屬性注入值,只能給簡單數據類型注入值。
如何選擇:
(1)如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;
(2)如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;
舉例:
@RestController
public Class HelloController{
@Value("${person.last-name}")
private String name;
@RequestMapping("sayhello")
public String sayHello(){
return "hello"+name;
}
}
啓動 springboot 應用後,在頁面訪問 localhost:8081/sayhello,頁面正常返回數據。
四、配置文件注入值數據校驗
只有@ConfigurationProperties 的方式支持注入數據值校驗。
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>
* <bean/>
*/
//emailAddress必須是郵箱格式
@Email
private String emailAddress;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;