一、什么是类型转换器?
咱们在xml文件外面set注入的值都是以字符串的模式书写的,那么假如我有一个Integer类型的类的成员变量,我却能够对其进行注入呢?一个String类型的变量和一个Integer类型的变量,他们之间是否存在某种转换呢?
作用:Spring通过类型转换器把配置文件中字符串类型的数据,转换成对象中成员变量对应类型的数据,进而实现了注入
备注:这个Converter就是所谓的类型转换器接口,而为什么是接口呢?你能够想一下,String类型能够转其余八种根本类型,那么必定不同类型的转换的办法是不同的,所以是通过接口的模式来做的
二、自定义类型转换器
2.1 为什么须要自定义类型转换器?
首先阐明一点,Spring本人提供的原生类型转换器并不是万能的,比方你一个Date类型不同国家对于日期的写法是不同的,老美喜爱2022/02/15,中国喜爱2022-02-15,所以Spring是不可能给你提供这种这么具备共性的转换器,所以就须要本人去定义了
2.2 如何入手去开发一个自定义的类型转换器?
第一步:创立一个类,并实现Converter<S,T>接口,其中S为原始数据的类型,T为要转换成的数据的类型,如下public class MyDateConverter implements Converter<String, Date> { /** * 上面这个办法为自定义的类型转换器 * @param s 数据源 =>比方在Spring配置文件中的<value>2022-02-16</value> * @return 要被转换的数据 => 这个return返回值会主动为咱们将转换好的值注入到类的成员变量处 */ @Override public Date convert(String s) { Date date = null; try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); date = sdf.parse(s); } catch (ParseException e) { e.printStackTrace(); } return date; }}
第二步: 注入Spring的类型转换器类,并注册自定义类型转化器(告知Spring你的转换器)<!--2. 注册类型转化器--><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="myDateConverter"/> </set> </property></bean>======================备注:这个对于该id的申明必须为conversionService,否则报错在<property>标签外部申明好对应的类型转换器后,Spring就会在拿配置文件的值的时候,若发现要注入的为Date类型,那么就会走自定义类型转换器的逻辑,将配置文件的String类型转换为Date类型
第三步: 对用于特定类型(这里为Date类型)的类进行注入bean id="person" class="cn.paul.spring.demo.hellospring.entity.Person"> <property name="birthday" value="2022-02-16"/></bean>
2.3 自定义类型转换器的一些细节
2.3.1 第一:依赖它,就注入它,写配置文件,咱们会发现在自定义类型转换器中写的格局是写死的,这样显著耦合了,那么为此咱们须要将其写配置文件,达到解耦的成果
首先咱们须要对该变量抽取为该类的一个成员变量,并在配置文件中对其进行set注入
public class MyDateConverter implements Converter<String, Date> { private String pattern; public void setPattern(String pattern) { this.pattern = pattern; } /** * 上面这个办法为自定义的类型转换器 * @param s 数据源 =>比方在Spring配置文件中的<value>2022-02-16</value> * @return 要被转换的数据 => 这个return返回值会主动班助咱们将转换好的值注入到类的成员变量处 */ @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; }}======上面为对其进行配置文件的set注入=========
<bean id="myDateConverter" class="cn.paul.spring.demo.hellospring.converter.MyDateConverter"> <property name="pattern" value="yyyy-MM-dd"/></bean>
备注:当我想换其余日期格局,我间接在配置文件改就能够了
2.3.2 ConversionSeviceFactoryBean 定义 id属性 值必须conversionService,这是约定好的。
2.3.3 其实Spring有其内置的日期格局转换器,只不过在配置文件中的日期格局需为:yyyy/MM/dd
就是说假如下面如果咱们没有自定义日期的类型转换的话,只有配置所写日期格局为yyyy/MM/dd 类型,其都能够将其转为Date类型,并注入到对象中