目录
@PropertySource 加载 properties 配置文件
@PropertySource 加载 yml 配置文件
@ImportResource 导入Spring 配置文件
1、通过《Spring Boot @ConfigurationProperties 、@Value 注值》知道使用“@Value”与“@ConfigurationProperties”可以从全局配置文件“application.properties”或者“application.yml”中取值,然后为需要的属性赋值。
2、当应用比较大的时候,如果所有的内容都当在一个配置文件中,就会显得比较臃肿,同时也不太好理解和维护,此时可以将一个文件拆分为多个,使用 @PropertySource 注解加载指定的配置文件。
3、下面演示使用 @PropertySource 注解 加载类路径下的 user.properties 配置文件,为 User.java POJO 对象的属性赋值。
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author wangmaoxiong
* Created by Administrator on 2018/7/11 0011.
* 用户···实体
* @ConfigurationProperties 表示 告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "user" 表示 将配置文件中 key 为 user 的下面所有的属性与本类属性进行一一映射注入值,如果配置文件中
* 不存在 "user" 的 key,则不会为 POJO 注入值,属性值仍然为默认值
*
* @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 colorList;
private Map cityMap;
private Dog dog;
//省略 getter、setter 、toString 方法没粘贴
}
/**
* @author wangmaoxiong
* Created by Administrator on 2018/7/11 0011.
* 狗 实体类-----------普通 Java Bean。
* 被依赖项可以不加 @ConfigurationProperties 注解,但是必须提供 getter、setter 方法
*/
public class Dog {
private Integer id;
private String name;
private Integer age;
//省略 getter、setter 、toString 方法
}
4、在类路径下提供 user.properties 配置文件如下(.yml 文件也是同理):
user.id=111
user.lastName=张无忌
user.age=120
user.birthday=2018/07/11
user.colorList=red,yellow,green,blacnk
user.cityMap.mapK1=长沙市
user.cityMap.mapK2=深圳市
user.dog.id=7523
user.dog.name=狗不理
user.dog.age=3
5、测试运行:
import com.wmx.yuanyuan.pojo.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;
@RunWith(SpringRunner.class)
@SpringBootTest
public class YuanyuanApplicationTests {
/**
* 因为 POJO类 使用了 Component 注解,就是 Spring 一个组件,交由了 Spring 容器注入值
* 所以使用 @Autowired 或者 @Resource,DI 注入在取值即可
*/
@Resource
private User user;
@Test
public void contextLoads() {
System.out.println("------------------------------********************--------------------------------------------");
System.out.println("·······················" + user);
}
}
1、在上面 properties 的基础上修改如下:
@PropertySource(value = {"classpath:user.yml"}, factory = PropertySourceFactory.class)
2、然后提供用于处理 yml 配置文件的属性资源工程如下:
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import java.io.IOException;
import java.util.List;
/**
* 用于 @PropertySource 加载 yml 配置文件.
*
* @author wangmaoxiong
* @version 1.0
* @date 2020/5/25 20:45
*/
public class PropertySourceFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource> createPropertySource(String name, EncodedResource resource) throws IOException {
if (resource == null) {
return super.createPropertySource(name, resource);
}
List> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
return sources.get(0);
}
}
1、@ImportResource 注解用来导入 Spring 的配置文件,如核心配置文件 "beans.xml",从而让配置文件里面的内容生效;
2、如果应用中仍然想采用以前 xml 文件的配置方式,如 "beans.xml" ,则使用 “@ImportResource” 注解轻松搞定。
3、将 @ImportResource 标注在一个配置类上,通常直接放置在应用启动类上,和 @SpringBootApplication 一起即可。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
/**
* 应用启动类
*
* @ImportResource 必须放置在配置类上,通常放在启动类即可,用 value 指明导入类路径下的那个 Spring 配置文件
*/
@ImportResource(value = {"classpath:beans.xml"})
@SpringBootApplication
public class CocoApplication {
public static void main(String[] args) {
SpringApplication.run(CocoApplication.class, args);
}
}
4、然后就可以在类路径下提供原始的 beans.xml 配置文件:
5、启动应用控制台会打印:loading XML bean definitions from class path resource [beans. xml] 表示加载成功。