关于spring:八类型转换器

2次阅读

共计 2399 个字符,预计需要花费 6 分钟才能阅读完成。

一、什么是类型转换器?

咱们在 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 类型,并注入到对象中

正文完
 0