Spring中自定义数据类型转换详解

网站建设3年前发布
75 0 0

环境:Spring5.3.12.RELEASE。,Spring 3引入了一个core.onvert包,提供一个通用类型转换系统。系统定义了一个SPI来实现类型转换逻辑,以及一个API来在运行时执行类型转换。在Spring容器中,可以使用这个系统作为PropertyEditor实现的替代,将外部化的bean属性值字符串转换为所需的属性类型。还可以在应用程序中需要类型转换的任何地方使用公共API。,ConversionService类型转换服务的接口。,在大多数情况下我们应该实现。,ConfigurableConversionService可配置的类型转换服务接口。该接口整合ConversionService的所有操作和ConverterRegistry接口的相关操作,可对具体的转换进行增删。在应用程序上下文引导代码中处理ConfigurableEnvironment实例时,后者特别有用。,ConfigurableConversionService接口。,Spring提供了GenericConversionService 实现类;该类适合在大多数环境中使用的基本 ConversionService实现。通过
ConfigurableConversionService接口间接实现ConverterRegistry作为注册API。该类没有提供默认的类型转换功能,需要我们自己添加转换接口。,示例:,以上代码运行将报错:,没有转换接口发现错误。,FormattingConversionService 类是GenericConversionService 子类对象,主要作用就是增加了格式化功能(还是类型转换的一种表现),该类提供了 Printer和Parser的支持,可对对象进行打印展示及将源数据解析成目标对象,示例:,这里的addParser方法最后还是将Parser转换为GenericConverter。,将对象转换为可读的信息,示例:,以上介绍的类型转换服务默认没有任何的类型转换能力,都需要我们自定义添加,在Spring中还提供了DefaultConversionService 和 WebConversionService。,通过名称知道WebConversionService 针对Web项目,但是你也是可以在非Web项目中使用。这里我就介绍DefaultConversionService 。先看示例:,上面两个类型的转换都能成功,为什么呢?因为DefaultConversionService 内部已经帮我们注册了很多的类型转换,源码:,通常我们一般都是使用DefaultConversionService。,在Web环境下默认使用的WebConversionService ,这里以SpringBoot为例,源码如下:,Spring还提供了一个ConversionServiceFactoryBean来注册我们自定义的类型转换。,我们可以定个该Bean,然后注入converters属性值。,Spring的类型转换服务是不是挺简单?接下来介绍Spring提供的各种自定义类型转换方式。,接下来我们都是以示例为主。,Converter接口。,自定义Converter接口,我们使用匿名内部类实现。,当你需要集中整个类层次结构的转换逻辑时(例如,当从String转换到Enum对象时),你可以实现ConverterFactory。也就是有继承关系的类型转换。,ConverterFactory接口。,自定义工厂类。,当你需要复杂的Converter实现时,请考虑使用GenericConverter接口。与Converter相比,GenericConverter具有更灵活但强类型较少的签名,因此它支持在多个源类型和目标类型之间进行转换。此外,GenericConverter提供了可用的源和目标字段上下文,你可以在实现转换逻辑时使用它们。这样的上下文允许通过字段注释或在字段签名上声明的泛型信息驱动类型转换。下面的清单显示了GenericConverter的接口定义:,GenericConverter接口。,自定义GenericConverter。

© 版权声明

相关文章