需求背景
- 通过《Spring Boot 全局配置文件》与《@Value 取赋值详解与 @ConfigurationProperties 对比》已经知道使用“@Value”注解与“@ConfigurationProperties”可以从全局配置文件“application.properties”或者“application.yml”中取值然后为需要的属性赋值
- 但是如果应用比较大的时候,如果所有的内容都当在一个文件中,如“application.properties”或者“application.yml”中时,就会显得比较臃肿,同时也不太好理解和维护
- 可以将一个文件拆分为多个,此时使用@PropertySource即可解决问题
- @PropertySource 用于加载指定的配置文件;

项目结构

待赋值的POJO 属性
package com.lct.wmx.damain;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Created by Administrator on 2018/7/11 0011.
* 用户···实体
*
* @ConfigurationProperties 表示 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* @ConfigurationProperties (prefix = "user") 默认从全局配置文件中获取值然后进行注入
* prefix = "user" 表示 将配置文件中key为user的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中
* 不存在"user"的key,则不会为POJO注入值,属性值仍然为默认值
* <p/>
* @Component 将本来标识为一个Spring 组件,因为只有是容器中的组件,容器才会为@ConfigurationProperties提供此注入功能
* @PropertySource (value = {"classpath:user.properties"}) 指明加载类路径下的哪个配置文件来注入值
*/
@PropertySource(value = {"classpath:user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private Integer id;
private String lastName;
private Integer age;
private Date birthday;
private List<String> colorList;
private Map<String, String> cityMap;
private Dog dog;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Map<String, String> getCityMap() {
return cityMap;
}
public void setCityMap(Map<String, String> cityMap) {
this.cityMap = cityMap;
}
public List<String> getColorList() {
return colorList;
}
public void setColorList(List<String> colorList) {
this.colorList = colorList;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String name) {
this.lastName = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", id=" + id +
", lastName='" + lastName + '\'' +
", birthday=" + birthday +
", colorList=" + colorList +
", cityMap=" + cityMap +
", dog=" + dog +
'}';
}
}
资源配置文件

user.id=111
user.lastName=张无忌
user.age=120
user.birthday=2018/07/11
user.colorList=red,yellow,green,blacnk
user.cityMap.mapK1=mapV1
user.cityMap.mapK2=mapV2
user.dog.id=7523
user.dog.name=狗不理
user.dog.age=3
测试运行
package com.lct.wmx;
import com.lct.wmx.damain.Dog;
import com.lct.wmx.damain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* SpringBoot单元测试
* 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldQuickApplicationTests {
/**
* 因为POJO类使用了@Component注解,就是Spring一个组件,交由了Spring容器注入值
* 所以使用@Autowired或者@Resource,DI注入在取值即可
*/
@Resource
private User user;
@Test
public void contextLoads() {
System.out.println("------------------------------********************--------------------------------------------");
System.out.println("·······················" + user);
}
}
