JAVA全系列 教程
3762个小节阅读:7095k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
从Spring Framework 3.0开始提供了更加强大的内置转换器,分别是:Converter、ConverterFactory、GenericConverter 三个接口及实现类,但是这些实现类绝大多数都是default修饰,无法跨包访问。
这三个接口的功能要比PropertyEditor更加强大。可以实现某个类型向另外一个类型转换,不再局限于String向其他类型转换。
但是Spring框架到目前的Spring Framework 6一直都对两种方式进行支持。这也是Spring框架的特点,解耦和原生API方式,让我们开发者自己选(为了让开发者更倾向使用解耦方式,一般解耦方式使用起来都比原生简单)。
Spring框架类型转换经常发生的,只是这个事情由Spring框架完成,程序员不深入底层时,只是知道有这个事情。如果深入了解Spring框架,就知道Spring在进行数据绑定时会帮助我们进行类型转换。
类型转换几个常见场景。
Converter接口功能比较简单,就是把S类型值转换为T类型。Spring默认提供了很多实现类,都是一些简单数据类型到另一种简单数据类型的转换。
xxxxxxxxxx
@FunctionalInterface
public interface Converter<S, T> {
/**
* 从S类型转换为T类型
*/
@Nullable
T convert(S source);
/**
* 从Spring 5.3版本出现的默认方法,允许转换后再次使用另一个转换器(after)进行转换后返回
*/
default <U> Converter<S, U> andThen(Converter<? super T, ? extends U> after) {
Assert.notNull(after, "'after' Converter must not be null");
return (S s) -> {
T initialResult = convert(s);
return (initialResult != null ? after.convert(initialResult) : null);
};
}
}
里面提供了大量的实现了,但是这些类的访问权限修饰符都是default,意味着跨包无法访问。
用于把S类型转换为T类型,但是强制要求T的类型必须是R类型子类。具体是什么类型都行,只要是之类中一种就可以。因为接口泛型中R设置为转换后结果类型的父类,所以具体转后后的类型可能是R的子类1,也可能是R的子类2,所以有人认为这数据1:N的转换方式。
xxxxxxxxxx
public interface ConverterFactory<S, R> {
/**
* 从S类型值转换为T类型,其中T类型必须继承R类型。
*/
<T extends R> Converter<S, T> getConverter(Class<T> targetType);
}
GenericConverter转换器主要实现N:N的转换。例如
这些接口的实现类因为大部分都是default修饰,意味着是Spring框架自己使用的,如果想要使用可以实现接口进行自定义实现。
以String转Integer为例,简单使用一下转换器
自定义转换器
xxxxxxxxxx
@Component
public class MyConverter implements Converter<String,Integer> {
@Override
public Integer convert(String source) {
return Integer.parseInt(source);
}
}
测试结果
xxxxxxxxxx
// 简写方式,省略@ContextConfiguration
@SpringJUnitConfig(MyConverter.class)
public class ConverterTest {
@Autowired
MyConverter myConverter;
@Test
void test(){
Integer result = myConverter.convert("123");
System.out.println(result);
}
}