spring-beans包扩展的Java的PropertyEditor,使得开发者能够轻易的调用扩展类进行对象与string类型的转换,不仅如此,spring还增加了PropertyEditorRegistry接口及其实现类,这样便能轻易地获取到对应类型的PropertyEditor
在《spring-beans概述》中,展示了spring-beans的项目结构,其中有一个包propertyeditors以及root interface PropertyEditorRegistry,这部分就是spring-beans对Java的PropertyEditor所做的扩展。
PropertyEditor
这是 java.beans
中一个接口,其设计的意图是图形化编程上,方便对象与String之间的转换工作,而spring将其扩展,方便各种对象与String之间的转换工作。其部分类图如下图所示:
扩展实现类PropertyEditorSupport
将重心放在对象转换上,因此只要继承PropertyEditorSupport
,通过重写setAsText()
、getAsText()
以及构造方法即可实现扩展。
CustomDateEditor的实现
说再多都不如举一个例子来的有效。Date和String的转换应该是非常常见的,一般情况下,项目中应用的话是将其封装为一个Util工具类,然后实现互相转换的方法。我们来看下spring里是如何做对象和String相互转换的。
- 构造函数
通过构造函数传参,实例化出个性定制化的util对象
public CustomDateEditor(DateFormat dateFormat, boolean allowEmpty) {
this.dateFormat = dateFormat; //时间格式转换器
this.allowEmpty = allowEmpty; //设置是否允许时间为空
this.exactDateLength = -1; //设置精确对象长度,-1为不限制
}
public CustomDateEditor(DateFormat dateFormat, boolean allowEmpty, int exactDateLength) {
this.dateFormat = dateFormat;
this.allowEmpty = allowEmpty;
this.exactDateLength = exactDateLength;
}
- 重写
setAsText()
实现通过将string转换为Date对象;
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (this.allowEmpty && !StringUtils.hasText(text)) {
// Treat empty String as null value.
setValue(null);
}
else if (text != null && this.exactDateLength >= 0 && text.length() != this.exactDateLength) {
throw new IllegalArgumentException(
"Could not parse date: it is not exactly" + this.exactDateLength + "characters long");
}
else {
try {
setValue(this.dateFormat.parse(text));
}
catch (ParseException ex) {
throw new IllegalArgumentException("Could not parse date: " + ex.getMessage(), ex);
}
}
}
- 重写
getAsText()
获取string对象,将内置的value(即Date对象转换为String);
@Override
public String getAsText() {
Date value = (Date) getValue();
return (value != null ? this.dateFormat.format(value) : "");
}
- 应用
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
editor.setAsText("2017-06-24 00-00-00");
Date date = (Date)editor.getValue(); //获取到字符串对应的date对象
editor.setValue(new Date());
String dateStr = editor.getAsText(); //获取到对应的字符串对象
设计意图
获取会让人觉得spring对于一个对象转换工具都如此大费周章地进行抽象封装,有点没有必要;但是想想spring的理念就不难理解了,将对象实例化,并且使用Ioc容器管理起来,对于后续扩展是有很大的好处的(拭目以待)。
小结
本文对PropertyEditor进行分析以及Beans组件对PropertyEditor进行扩展,总的说来,spring实现了一系列的对象与String相互转换的工具类。