本文阅读Spring关于Convert知识的介绍
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#core-convert
Spring3引入了core.convert包,这个包里提供的就是转换功能。其使用方式是:

  1. 实现SPI,并注册,完成自定义的转换逻辑
  2. 提供一个API去执行具体的Convert类

image.png

自己实现Convert的方式

用户想要自定义Convert的话,有以下几种方式:

  1. 实现Convert:针对于从某个特定类型转换成另一个特定类型
  2. 实现ConverterFactory:
  3. 实现GenericConverter:

    1. 实现Convert

    • 被转换的对象不能为null
    • 保证实现的方法是线程安全的
    • 一些框架已经实现的Convertcore.convert.support包中

      举个例子

  4. 实现Convert<S,T>

    1. public class MyConvert implements Converter<String, Date> {
    2. @Override
    3. public Date convert(String source) {
    4. try {
    5. return new SimpleDateFormat("yyyy-MM-dd").parse(source);
    6. } catch (ParseException e) {
    7. e.printStackTrace();
    8. return null;
    9. }
    10. }
    11. }
  5. 注册并使用自定义Convert

    1. public static void main(String[] args) {
    2. DefaultConversionService defaultConversionService = new DefaultConversionService();
    3. defaultConversionService.addConverter(new MyConvert());
    4. Date convert = defaultConversionService.convert("2022-01-01", Date.class);
    5. System.out.println(convert);
    6. }

    上面的例子中,我既没有注册任何的Bean,也没有启动容器。

2.实现ConvertFactory

顾名思义,Convert的Factory,返回的就是一个Convert

举个例子

  1. 实现ConvertFactory ```java public class MyConvertFactory implements ConverterFactory {

    @Override public Converter getConverter(Class targetType) {

    1. if(targetType.equals(Long.class)){
    2. return new Str2LongConvert();
    3. }else {
    4. return new Str2IntegerConvert();
    5. }

    }

    private final class Str2IntegerConvert implements Converter{

    1. @Override
    2. public Integer convert(String source) {
    3. return Integer.parseInt(source);
    4. }

    }

    private final class Str2LongConvert implements Converter {

    1. @Override
    2. public Long convert(String source) {
    3. return Long.parseLong(source);
    4. }

    }

}

  1. 2. 注册并使用自定义的ConvertFactory
  2. ```java
  3. public static void main(String[] args) {
  4. DefaultConversionService defaultConversionService = new DefaultConversionService();
  5. defaultConversionService.addConverterFactory(new MyConvertFactory());
  6. Long convert = defaultConversionService.convert("1", Long.class);
  7. System.out.println(convert.getClass());
  8. }

3.GenericConverter

这个主要用于复杂对象的转换。
这个我也不会,暂时不演示了。

如何使用自定义Convert

官方文档中说了2种方式

  • 注入:这种例子我没用SpringBoot方式演示出来,按照官方要求,结果出现了循环依赖
  • 直接new:就是我上面演示的,直接new DefaultConversionService();