八、类型转换器

2年前 (2022) 程序员胖胖胖虎阿
196 0 0

一、什么是类型转换器?

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

版权声明:程序员胖胖胖虎阿 发表于 2022年9月9日 上午11:40。
转载请注明:八、类型转换器 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...