关于spring:八类型转换器

一、什么是类型转换器?

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理