插手容器启动之CustomEditorConfigurer

其他两个BeanFactoryPostProcessor都是通过对BeanDefinition中的数据进行变更以达到某种目的。与它们有所不同,CustomEditorConfigurer是另一种类型的BeanFactoryPostProcessor实现,它只是辅助性地将后期会用到的信息注册到容器,对BeanDefinition没有做任何改动

我们知道,不管对象是什么类型,也不管这些对象所声明的依赖是什么类型,通常都是通过XML(或者properties甚至其他媒介)文件格式来配置这些对象类型。但XML所记载的,都是String类型,即容器从XML格式的文件读取的都是字符串形式,最终应用程序却是由各种类型的对象所构成。要想完成这种由字符串到具体对象的转换(不管这个转换工作最终由谁来做),都需要这种转换规则相关的信息,而CustomEditorConfigurer就是帮助我们传达类似信息的。

Spring内部通过JavaBean的PropertyEditor来帮助进行string类型到其他类型的转换工作。只要为每种对象类型提供一个PropertyEditor,就可以根据该对象类型取得与其相对应的PropertyEditor来做具体的类型转换了。Spring容器内部在做具体的类型转换的时候,会采用JavaBean框架内默认的PropertyEditor搜寻逻辑,从而继承了对原生类型以及java.lang.string.java.awt.Color和java.awt.Font等类型的转换支持。同时,Spring框架还提供了自身实现的一些Property-Editor,这些PropertyEditor大部分都位于org.springframework.beans.propertyeditor包下

当我们需要指定的类型没有包含以上所提到的PrioertyEditor之列的时候,就需要给出针对这种类型的PropertyEditor实现,并通过CustomEditorConfigurer告知容器。


通常情况下,对于Date类型,不同的Locale、不同的系统在表现形式上存在不同的需求。如系统这个部分需要以yyyy-MM-dd的形式表现日期,系统那个部分可能又需要以yyyyMMdd的形式对日期进行转换。虽然可以使用Spring提供的CustomDateEditor,不过为了演示自定义PropertyEditor的详细流程,我们就自己写代码演示一次:

假设需要对yyyy/MM/dd形式的日期格式转换提供支持。虽然可以直接让PropertyEditor实现类去实现java.beans.PropertyEditor接口,不过,通常情况下,我们可以直接继承java.beans.PropertyEditorSupport以避免实现PropertyEditor接口的所有方法。就像我们这次,我们仅仅让DatePropertyEditor完成从String到java.util.Date的转换,只需要实现setAsText(String)方法,而其他方法不需要管。
当然啦,如果仅仅是支持单向地从String到相应对象类型的转换,只要覆写方法setAsText()方法即可,如果想要支持双向转换,再实现一个getAsText()的方法覆写。代码如下:
这里写图片描述这里写图片描述

同时,假设我们的DateFoo类需要对java.util.Date类型的依赖,代码如下:

这里写图片描述

因为我们现在基本都使用的是ApplicationContext。而ApplicationContext会自动识别BeanFactoryPostProcessor(CustomEditorConfigurer是另一种类型的BeanFactoryPostProcessor实现)并应用,所以我们首先需要通过CustomEditorConfigurer的属性propertyEditorRegistrars来指定我们自定义的PropertyEditor。不过我们首先需要需要给出一个org.beans.springframework.beans.PropertyEditorRegistrars的实现,好啦,下面就是代码实现:
这里写图片描述

最后我们在XML把他们组装起来!

  1. 首先把我们最基本的PropertyEditor注入到容器中,供后面的PropertyEditRegistrar使用。
  2. 然后把customerEditorConfiger的propertyEditRegistrar属性实现的一个类也注入到容器中,供CustomEditorConfigurer使用。
  3. 最后注入CustomEditorConfigurer(CustomEditorConfigurer是另一种类型的BeanFactoryPostProcessor实现)(不管对象是什么类型,也不管这些对象所声明的依赖是什么类型,通常都是通过XML(或者properties甚至其他媒介)文件格式来配置这些对象类型。但XML所记载的,都是String类型,即容器从XML格式的文件读取的都是字符串形式,最终应用程序却是由各种类型的对象所构成。要想完成这种由字符串到具体对象的转换(不管这个转换工作最终由谁来做),都需要这种转换规则相关的信息,而CustomEditorConfigurer就是帮助我们传达类似信息的)

这里写图片描述

最后容器就能识别我们的yy/MM/dd了。

猜你喜欢

转载自blog.csdn.net/m0_37884977/article/details/79795282