IV.加载指定的配置文件


  上一章介绍了使用@ConfigurationProperties和@value,他们从全局配置文件中获取值并映射到实体类中所对应的属性里。但是全部默认值都放在全局配置变量中将非常臃肿功能,所以本章将介绍三种不同的方法来加载外部指定的配置文件来放在环境中。
  再次强调,上一章讲的是从全局配置文件中获取值并映射到实体类中所对应的属性,这一章讲的是加载指定的配置文件来放在环境,两者不是冲突的关系,即你可以不加载外部指定的配置文件来放在文件中,直接使用@ConfigurationProperties或者@value映射,也可以加载外部指定的配置文件再来使用映射功能。


1.PropertySource来加载指定的配置文件

  在上一章的文件基础上,删除Person所对应的全局配置值后,在resources文件下右键新建【new file】person.properties文件,如下所示。

1
2
3
4
5
6
7
8
9
person.last-name=路飞
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

  将原来的Person.java文件添加为使用PropertySource的方式来加载外部的配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package com.myblog.springboot.bean;

import org.springframework.stereotype.Component;
import org.springframework.context.annotation.PropertySource;

import java.util.Date;
import java.util.List;
import java.util.Map;


@PropertySource(value = {"classpath:person.properties"})// 告诉springboot加载内路径下的person.properties的内容,并把他们绑定都到Person对象中
//加载指定的属性文件的配置到环境中
@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;

@Override
public String toString() {
return "Person{" +
"lastName='" + lastName + '\'' +
", age=" + age +
", boss=" + boss +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
'}';
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public Boolean getBoss() {
return boss;
}

public void setBoss(Boolean boss) {
this.boss = boss;
}

public Date getBirth() {
return birth;
}

public void setBirth(Date birth) {
this.birth = birth;
}

public Map<String, Object> getMaps() {
return maps;
}

public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}

public List<Object> getLists() {
return lists;
}

public void setLists(List<Object> lists) {
this.lists = lists;
}

public Dog getDog() {
return dog;
}

public void setDog(Dog dog) {
this.dog = dog;
}
}

  最后的效果如下。


2.ImportResource来加载spring的配置文件

  Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别。如果需要导入spring的配置文件,则需要ImportResource来加载spring的配置文件。想让Spring的配置文件生效且加载进来,需要@ImportResource标注在一个配置类【这里我的主配置类是】上。
  右键com.myblog.springboot02新建java class,取名为service.HelloService文件
  右键resources如图输入beans来新建beans.xml文件注意不能输入beans.xml,不然就变成beans.xmll.xml

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="helloService" class="com.myblog.springboot02.service.HelloService"></bean>
</beans>
  在测试类中添加下列代码。
1
2
3
4
5
6
7
8
@Autowired
ApplicationContext ioc; //注入ioc容器

@Test
public void testHelloService(){ // 测试容器中有无helloService
boolean b = ioc.containsBean("helloService");
System.out.println(b);
}

  运行testHelloService,但是显示结果告诉我们不能直接导入spring的配置文件,所以需要使用我们上面说的ImportResource。

  想让Spring的配置文件生效且加载进来,需要@ImportResource标注在一个配置类【这里我的主配置类是】上。

  可以看到spring的配置文件beans.xml被成功导入。

  由于考虑到导入spring配置文件时需要新建再导入,很麻烦,所以springboot提供了一种快捷的导入方式:推荐使用全注解的方式。具体的实现方式是:
  @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件【可以新建一个配置类或者使用主配置类】。
  @Bean:将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名。
  记得在测试这段的时候,需要把上次使用的@ImportResource(locations = {"classpath:beans.xml"})注释掉,在com.myblog.springboot文件夹下新建配置类,类名为config.MyAppConfig。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.myblog.springboot02.config;

import com.myblog.springboot02.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //指明当前类是一个配置类;就是来替代之前的Spring配置文件
public class MyAppConfig {

@Bean //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
public HelloService helloService(){ //容器中这个组件默认的id为helloService
System.out.println("配置类@Bean给容器中添加组件了,运行成功!");
return new HelloService();
}
}

  从运行结果可以知道这种方法是可行且方便的。


3.总结

  ● @PropertySource来加载指定的配置文件
  ● @ImportResource来加载spring的配置文件
  ● @Configuration和@Bean组合来加载spring的配置文件【官方推荐】