## 配置文件参数化
如果 Spring 的配置文件中存在经常需要修改的字符串,例如与数据库连接相关的配置参数,直接在 Spring 的主配置文件中修改十分不方便,不利于项目的维护,所以,可以将这些配置转移到一个额外的小配置文件中,例如 `.properties` 文件,有利于参数修改,且降低错误修改 Spring 主配置文件的可能性
### 准备小配置文件
在 `resources` 目录下准备一个 `JDBC` 的参数配置文件 `jdbc.properties`
```properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=root
```
### Spring 主配置文件中整合其他配置文件
在 `` 标签内,加入子标签,引入其他配置文件
```xml
```
### 通过 `${key}` 的方式获取其他配置文件中的值
```xml
```
### 测试使用
```java
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ConnectionFactoryBean connectionFactoryBean = ctx.getBean("&connectionFactoryBean",ConnectionFactoryBean.class);
System.out.println(connectionFactoryBean.getDriver());
System.out.println(connectionFactoryBean.getUrl());
System.out.println(connectionFactoryBean.getUser());
System.out.println(connectionFactoryBean.getPassword());
```
打印结果如下,说明属性注入成功
```
com.mysql.cj.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
root
root
```
## 自定义类型转换器
在配置文件 `applicationContext.xml` 中给定的注入数据实际上都是字符串类型的,所以 Spring 需要通过类型转换器把配置文件中字符串类型的数据转换为对象成员变量所对应的类型的数据,进而完成注入
一般的数据类型,例如 `int`,Spring 都有内置的类型转换器,但是对于一些特定的类型,Spring 内部没有提供转换器,而在编码中又必须使用,那么就需要自定义类型转换器
### 定义类实现 Spring 的 Converter 接口
为了方便修改需要解析的日期格式,可以使用 Spring 将格式字符串注入 `Converter`
```java
package cool.yzt.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyDateConverter implements Converter {
private String pattern;
@Override
public Date convert(String s) {
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
date = sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
}
```
### 创建 MyDateConverter 对象,并将其注册为类型转换器
设置自定义日期转换器的日期解析格式为 `yyyy-MM-dd`
```xml
```
### 注意
1. 注册自定义的类型转换器,就是告知自定义的某个类是类型转换器,实际上就是将自定义的类作为属性注入 `org.springframework.context.support.ConversionServiceFactoryBean` 类中的 `converters` (一个 `Set` 集合)属性
2. `ConversionServiceFactoryBean` 的 `id` 属性必须是 `conversionService`
3. Spring 内置的日期类型转换器支持的解析格式为 `yyyy/MM/dd`
## 参考
[孙哥说Spring5](https://www.bilibili.com/video/BV185411477k)

Spring | 配置文件参数化和类型转换器