## 一、为什么要学加载外部配置文件
本节为大家介绍另外一种场景:有一些老的项目里面的jar包并未主动的去与spring boot 融合,很多jar包都有自己的配置文件。如果我们在spring boot项目中使用这些jar包就必须得使用它们的配置文件,那就面临一个问题:**我们的spring boot项目默认只有一个全局配置文件:application.yml或application.properties。该如何加载额外的配置文件?**
如何解决这个问题,就是本节将为大家介绍的内容。
## 二、使用@PropertySource加载自定义yml或properties文件
#### 2.1.properties配置文件加载
`family.properties`这种格式的配置文件,使用如下的注解就可以将文件中的配置属性进行加载,非常简单!
~~~
@PropertySource(value = {"classpath:family.properties"})
public class Family {
~~~
#### 2.2.yaml配置文件加载
[spring 官方文档明确说明不支持使用@PropertySource加载YAML配置文件](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-yaml-shortcomings),但是我们仍然有办法,跟着我继续。
![](https://img.kancloud.cn/64/a6/64a63bd31fad31bb15c78b8231abe484_1204x77.png)
* 我们新建一个配置文件family.yml,把上一节用到的YAML数据结构放里面。用来模拟第三方jar包的额外配置文件(非application配置文件)。
~~~
# 1. 一个家庭有爸爸、妈妈、孩子。
# 2. 这个家庭有一个名字(family-name)叫做“happy family”
# 3. 爸爸有名字(name)和年龄(age)两个属性
# 4. 妈妈有两个别名
# 5. 孩子除了名字(name)和年龄(age)两个属性,还有一个friends的集合
# 6. 每个friend有两个属性:hobby(爱好)和性别(sex)
family:
family-name: "happy family"
father:
name: zimug
age: 18
mother:
alias:
- lovely
- ailice
child:
name: zimug2
age: 5
friends:
- hobby: football
sex: male
- hobby: basketball
sex: female
~~~
* 笔者通过阅读代码了解到,DefaultPropertySourceFactory是进行配置文件加载的工厂类。
* 尽管其默认不支持读取YAML格式外部配置文件,但是我们可以通过继承DefaultPropertySourceFactory ,然后对它的createPropertySource进行一下改造。就可以实现YAML的“额外”配置文件加载。
~~~
public class MixPropertySourceFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(@Nullable String name,
EncodedResource resource)
throws IOException {
String sourceName = name != null ? name : resource.getResource().getFilename();
if (sourceName != null
&&(sourceName.endsWith(".yml") || sourceName.endsWith(".yaml"))) {
Properties propertiesFromYaml = loadYml(resource);
//将YML配置转成Properties之后,再用PropertiesPropertySource绑定
return new PropertiesPropertySource(sourceName, propertiesFromYaml);
} else {
return super.createPropertySource(name, resource);
}
}
//将YML格式的配置转成Properties配置
private Properties loadYml(EncodedResource resource) throws IOException{
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
}
}
~~~
* 然后基于上一节的代码,在Family类的上面加上如下注解即可。通过factory属性明确的指定使用我们自定义的MixPropertySourceFactory加载yml配置文件。
~~~
@PropertySource(value = {"classpath:family.yml"}, factory = MixPropertySourceFactory.class)
public class Family {
~~~
## 三、使用@ImportResource加载Spring的xml配置文件
在没有Spring注解的时代,spring的相关配置都是通过xml来完成的,如:beans.xml。下面的XML配置的含义是:将com.zimug.bootlaunch.service.TestBeanService实例化并注入到Spring上下文环境中。
~~~
<?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="testBeanService" class="com.zimug.bootlaunch.service.TestBeanService"></bean>
</beans>
~~~
* 新建一个空类,com.zimug.bootlaunch.service.TestBeanService。
* 测试用例,测试Spring上下文环境中是否有testBeanService这样一个bean,有的话表示xml配置文件已经生效,成功将testBeanService实例化并注入到Spring上下文环境中:
~~~
@RunWith(SpringRunner.class)
@SpringBootTest
public class ImportResourceTests {
@Autowired
private ConfigurableApplicationContext ioc;
@Test
public void testHelloService() {
//测试Spring上下文环境中是否有testBeanService这样一个bean,有的话表示xml配置文件生效
boolean testBeanService= ioc.containsBean("testBeanService");
System.out.println(testBeanService);
}
}
~~~
* 因为还没使用@ImportResource加载beans.xml,此时执行测试用例,输出false表示beans.xml配置文件并未加载,所以没有testBeanService的存在
* 在spring boot应用入口启动类BootLauchApplication上加`@ImportResource(locations = {"classpath:beans.xml"})`,该注解用来加载Spring XML配置文件。
此时再试一下测试用例,输出:true。表示beans.xml配置文件被正确加载。
- 内容简介
- 第一章 Spring boot 简介
- 1.1 helloworld
- 1.2 提高开发效率工具lombok
- 1.3 IDEA热部署
- 1.4 IDEA常用插件
- 1.5 常用注解
- 第二章 RESTful接口
- 2.1 RESTful风格API
- 2.1.1 spring常用注解开发RESTful接口
- 2.1.2 HTTP协议与Spring参数接收注解
- 2.1.3 Spring请求处理流程注解
- 2.2 JSON数据格式处理
- 2.2.1 Jackson的转换示例代码
- 2.3 针对接口编写测试代码
- 2.3.1 编码接口测试示例代码
- 2.3.2 带severlet容器的接口测试示例代码
- 2.3.3 Mockito测试示例代码
- 2.3.4 Mockito轻量测试
- 2.4 使用swagger2构建API文档
- 2.4.1 swagger2示例代码
- 2.4.2 pom.xml
- 2.5 使用swagger2导出各种格式的接口文档
- 第三章 sping boot配置管理
- 3.1 YAML语法
- 3.2 YAML绑定配置变量的方式
- 3.3 YAML配置属性值校验
- 3.4 YAML加载外部配置文件
- 3.5 SpEL表达式绑定配置项
- 3.6 不同环境下的多配置
- 3.7 配置文件的优先级
- 3.8 配置文件敏感字段加密
- 第四章 连接数据库使用到的框架
- 4.1 spring JDBC
- 4.2 mybatis配置mybatisgenerator自动生成代码
- 4.3 mybatis操作数据库+dozer整合Bean自动加载
- 4.4 spring boot mybatis 规范
- 4.5 spirng 事务与分布式事务
- 4.6 spring mybaits 多数据源(未在git版本中实现)
- 4.7 mybatis+atomikos实现分布式事务(未在git版本中实现)
- 4.8 mybatis踩坑之逆向工程导致的服务无法启动
- 4.9 Mybatis Plus
- 4.9.1.CURD快速入门
- 4.9.2.条件构造器使用与总结
- 4.9.3.自定义SQL
- 4.9.4.表格分页与下拉分页查询
- 4.9.5.ActiveRecord模式
- 4.9.6.主键生成策略
- 4.9.7.MybatisPlus代码生成器
- 4.9.8.逻辑删除
- 4.9.9.字段自动填充
- 4.9.10.多租户解决方案
- 4.9.11.雪花算法与精度丢失
- 第五章 页面展现整合
- 5.1 webjars与静态资源
- 5.2 模板引擎与未来趋势
- 5.3 整合JSP
- 5.4 整合Freemarker
- 5.5 整合Thymeleaf
- 5.6 Thymeleaf基础语法
- 5.7 Thymeleaf内置对象与工具类
- 5.8 Thymeleaf公共片段(标签)和内联JS
- 第六章 生命周期内的拦截、监听
- 6.1 servlet与filter与listener的实现
- 6.1.1 FilterRegistration
- 6.1.2 CustomFilter
- 6.1.3 Customlister
- 6.1.4 FirstServlet
- 6.2 spring拦截器及请求链路说明
- 6.2.1 MyWebMvcConfigurer
- 6.2.2 CustomHandlerInterceptor
- 6.3 自定义事件的发布与监听
- 6.4 应用启动的监听
- 第七章 嵌入式容器的配置与应用
- 7.1 嵌入式的容器配置与调整
- 7.2 切换到jetty&undertow容器
- 7.3 打war包部署到外置tomcat容器
- 第八章 统一全局异常处理
- 8.1 设计一个优秀的异常处理机制
- 8.2 自定义异常和相关数据结构
- 8.3 全局异常处理ExceptionHandler
- 8.3.1 HelloController
- 8.4 服务端数据校验与全局异常处理
- 8.5 AOP实现完美异常处理方案
- 第九章 日志框架与全局日志管理
- 9.1 日志框架的简介与选型
- 9.2 logback日志框架整合使用
- 9.3 log4j2日志框架整合与使用
- 9.4 拦截器实现用户统一访问日志
- 第十章 异步任务与定时任务
- 10.1 实现Async异步任务
- 10.2 为异步任务规划线程池
- 10.3 通过@Scheduled实现定时任务
- 10.4 quartz简单定时任务(内存持久化)
- 10.5 quartz动态定时任务(数据库持久化)
- 番外章节
- 1.windows下安装git
- 1 git的使用
- 2 idea通过git上传代码到github
- 2.maven配置
- 3.idea几个辅助插件
- 4.idea配置数据库
- 5.搭建外网穿透实现外网访问内网项目
- 6.idea设置修改页面自动刷新
- 7.本地tomcat启动乱码
- 8.win10桌面整理,得到一个整洁的桌面
- 9.//TODO的用法
- 10.navicat for mysql 工具激活
- 11.安装redis
- 12.idea修改内存
- 13.IDEA svn配置
- 14.IntelliJ IDEA像Eclipse一样打开多个项目