<div>
<p>平常在使用Spring过程中,经常会用到类型转换,但一直没时间对这一块进行系统的整理。因此接下来会用几篇文章对这一块进行系统的整理。</p>
<p>大概的想法是下面俩篇:</p>
<ol><li>Spring类型转换整理</li><li>BeanWrapper使用以及原理</li><li>DataBinder使用以及原理</li></ol>
<p>这篇文章用于记录自己在学习Spring类型转换相关的内容,主要有以下三块。</p>
<ol><li>PropertyEditor:用于String到Object的类型转换</li><li>Conver :用于Object到Object之间的转换</li><li>Format :主要用于格式化,将对象转换成指定格式的字符串,比如Date和string之间的转换</li></ol>
<h2>PropertyEditor</h2>
<p>这个是Spring最早支持的不同类型对象之间的转换,兼容JavaBean规范。这里的不同类型指的是String到不同Object之间的转换。</p>
<h3>PropertyEditor SPI</h3>
<p>通过java.beans.PropertyEditor包名可以看出,其本身并非Spring中定义的接口,它其实是Java Bean规范中所定义的一个接口,其设计初衷在于是用于完成GUI中的输入与对象属性之间的转换操作;Spring只是借用了PropertyEditor这个接口的定义与功能,来完成字符串与对象属性之间的转换。在Spring 3.0之前,在Spring整个体系中,所有完成字符串与其他数据类型转换操作都是由ProperyEditor接口来完成的。</p>
<p>Spring通过PropertyEditor作为其数据类型转换的基础架构,同时自己还定义了许多默认的ProrpertyEditor的实现,这些实现类都位于spring-beans这个模块中的propertyeditors包中。</p>
<p>这些内置的PropertyEditor会有部分在默认情况下就已经被加了到IOC容器中,而有些PropertyEditor在默认情况下并没有自动加入,需要用户手动进行配置,后面我们通过源码可以看到Spring默认所注册了哪些PropertyEditor。</p>
<h3>PropertyEditorSupport</h3>
<p>由于PropertyEditor是一个类型转换的接口,其里面定义了很多与我们实际使用上无关的方法。如果我们想要使用PropertyEditor的话,我们通常只需要继承java.beans.PropertyEditorSupport这个类,并且重写其setAsText(String source)方法即可,通过它将输入的字符串转换成我们期望的数据类型。</p>
<p>Spring所提供的内置的PropertyEditor也都是继承PropertyEditorSupport来完成类型转换的。</p>
<p>下面展示下基本使用,这个例子展示了如何将String转换成Point类型</p>
<p>定义的辅助类如下</p>
<div class="blockcode">
<pre class="blockcode"><code>import </code></pre>
</div>
<p>上面给出两个非常简单的类,我们希望完成的是将输入字符串”1;2“,自动进行分割,然后转换成point的x和y属性。</p>
<p>下面我们自己定义PropertyEditor来完成数据的转换:</p>
<div class="blockcode">
<pre class="blockcode"><code>/**
</code></pre>
</div>
<p>在完成ProperyEditor编写完成后,我们只需将其注册到IOC容器中就可以自动完成String到Point之间的转换,这里使用编程的方式来注册</p>
<div class="blockcode">
<pre class="blockcode"><code>@Configuration
</code></pre>
</div>
<p>当上面的注册完成后,就可以使用这个PropertyEditor,使用demo</p>
<div class="blockcode">
<pre class="blockcode"><code>@Test
</code></pre>
</div>
<p>上面的是用来自定义String到Object的类型转换,但是这么多的PropertyEditor是由谁来管理呢,下面将介绍Spring是如何来管理这么多自定义的PropertyEditor</p>
<h3>PropertyEditorRegistry</h3>
<p>org.springframework.beans.PropertyEditorRegistry接口提供了对PropertyEditor注册以及查找功能,因此其主要提供是提供了对PropertyEditor的管理功能,首先来看看这个接口的描述:</p>
<div class="blockcode">
<pre class="blockcode"><code>package </code></pre>
</div>
<p>从上面可以接口的定义,PropertyEditorRegistry这个接口的作用,下面我们来看看其具体的几个实现类。</p>
<h3>PropertyEditorRegistrySupport</h3>
<p>由于PropertyEditorRegistry只是定义对PropertyEditor注册和查找的方法,其具体的核心实现类是org.springframework.beans.PropertyEditorRegistrySupport,真正对PropertyEditor管理的操作全部在该类中实现,下面来看看PropertyEditorRegistrySupport的源码,由于PropertyEditorRegistrySupport源码篇幅比较多,这里就采用截图来说明其实现:</p>
<p></p>
<p></p>
<div style="text-align:center;">
<img alt="328d8b009c721fa362ec70341cbde175.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-242a724f794141a7e61fe1d1607d7484.png">
</div>
<figcaption>
20200903104250
</figcaption>
<p>通过上面的标注我们看到PropertyEditorSupport底层对于不同种类的PropertyEditor使用不同的Map来进行存储,下面我们看下它是如何进行注册的。</p>
<p></p>
<p></p>
<div style="text-align:center;">
<img alt="c2a3ea928da4d478a1a83e2365d3f182.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs |
|