SpringBoot 配置文件值注入
文章目錄
1.1 從全局配置文件中讀取配置到實體類 (@ConfigurationProperties)
配置文件 (application.yml)(寫在application.properties也可以,格式變一下即可)
person:
lastName: Mary
age: 16
birthDate: 2004/01/01
maps: {one:1,two:2,three:3}
lists:
- 1
- 2
- 3
pet:
name: wangcai
age: 3
實體類(javaBean):
/**
* 將配置文件中配置的每一個屬性的值,映射到這個組件中
*
* @Component:
* 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;
*
* @ConfigurationProperties:
* 告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定(默認配置文件爲application.properties與
* application.yml);
*
* prefix = "person":
* 配置文件中哪個下面的所有屬性進行一一映射
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Date birthDate;
private Map<String,Object> maps;
private List<Object> lists;
private Pet pet;
//省略get,set方法
@Override
public String toString() {
String mapValue = "";
if(this.maps!=null){
for(String key:this.maps.keySet()){
Object value = this.maps.get(key);
mapValue += key+"\t"+value+"\t";
}
}
return "lastName:"+this.lastName+
"\nage:"+this.age+
"\nbirthDate:"+this.birthDate+
"\nmaps:"+mapValue+
"\nlists:"+this.lists+
this.pet;
}
}
public class Pet {
private String name;
private Integer age;
//省略get,set方法
@Override
public String toString() {
return "\nPet:\n\tPet name:"+this.name+
"\n\tPet age:"+this.age+"\n";
}
}
我們可以導入配置文件處理器,以後編寫配置就有提示了(pom.xml)
<!--導入配置文件處理器,配置文件進行綁定就會有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
測試
@SpringBootTest
class DemoApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person.toString());
}
}
1.2 全局配置文件注入值(@Value)
@Value 其實是Spring中的註解,其功能使用xml文件描述是這樣的:
<bean class="Person">
<property name="lastName" value="字面量/${key}從環境變量、配置文件中獲取值/#{SpEL}"></property>
<bean/>
其中property表示的是Person類中的各項屬性,name用於指定具體屬性,value用於指定值。
value的值主要有3種:
- 字面量,也就是數字(1,2…)、字符串(abc)、布爾變量(true、false)等常量
- ${key},從環境變量、配置文件中獲取值
- #{SpEL}, Spring的表達式語言,可以執行一些計算,調用一些函數
@Component
public class Person {
@Value("${person.last-name}") //@Value("#{'Lily'.toUpperCase()}")
private String lastName;
@Value("#{11*2}")
private Integer age;
private Date birthDate;
private Map<String,Object> maps;
private List<Object> lists;
private Pet pet;
//省略get,set和toString
}
1.3 從指定文件讀取並配置實體類(@PropertySource+@ConfigurationProperties)
在 resources 目錄下創建 person.properties
person.lastName = Lily
person.age = 20
person.birthDate = 2000/01/01
person.maps.one = 1
person.maps.two = 2
person.lists = a,b,ch
person.pet.name = wangcai
person.pet.age = 3
更改 Person 類中的註解
@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
//...省略屬性,get,set,toString
}
要注意的是,PropertySource 只支持properties文件,不支持yml文件讀取。
1.4 從指定文件讀取並注入值 (@PropertySource+@Value)
創建配置文件
更改註釋
@Component
@PropertySource(value = {"classpath:person.properties"})
public class Person {
@Value("${person.last-name}")
private String lastName;
//...省略屬性,get,set,toString
}