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

配置文件参数化

如果 Spring 的配置文件中存在经常需要修改的字符串,例如与数据库连接相关的配置参数,直接在 Spring 的主配置文件中修改十分不方便,不利于项目的维护,所以,可以将这些配置转移到一个额外的小配置文件中,例如 .properties 文件,有利于参数修改,且降低错误修改 Spring 主配置文件的可能性

准备小配置文件

resources 目录下准备一个 JDBC 的参数配置文件 jdbc.properties

1
2
3
4
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 主配置文件中整合其他配置文件

<beans> 标签内,加入子标签,引入其他配置文件

1
<context:property-placeholder location="jdbc.properties"/>

通过 ${key} 的方式获取其他配置文件中的值

1
2
3
4
5
6
<bean id="connectionFactoryBean" class="cool.yzt.factorybean.ConnectionFactoryBean">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

测试使用

1
2
3
4
5
6
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());

打印结果如下,说明属性注入成功

1
2
3
4
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

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
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<String, Date> {
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

1
2
3
4
5
6
7
8
9
10
11
 <bean id="myDateConvert" class="cool.yzt.converter.MyDateConverter">
<property name="pattern" value="yyyy-MM-dd"/>
</bean>

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myDateConvert"/>
</set>
</property>
</bean>

注意

  1. 注册自定义的类型转换器,就是告知自定义的某个类是类型转换器,实际上就是将自定义的类作为属性注入 org.springframework.context.support.ConversionServiceFactoryBean 类中的 converters (一个 Set 集合)属性
  2. ConversionServiceFactoryBeanid 属性必须是 conversionService
  3. Spring 内置的日期类型转换器支持的解析格式为 yyyy/MM/dd

参考

孙哥说Spring5