demara是什么意思ara在线翻译读音例句-明尼苏达大学在哪
2023年4月4日发(作者:bereavement)
【⾛近Spring】聊聊Spring中的数据转换:Converter、Conversion。。。
前⾯月饼图片大全可爱 聊了HttpMessageConverter,它的名称叫消息转换器,所以它⾯向的是消息体,和Http强相关,所以该接⼝所在的包为:ter。
数据转换,顾名思义就是数据类型之间的转换,但是对于数据转换,有的是可以进⾏转化的,例如字符串转整型,但是有些数据类型之间是不能进⾏转换的,例如从“aaa”字符串到
整型的转换。
不同的框架,肯定都有⾃⼰的数据转换的实现,⽐如MyBatis、Hibernate等这些转换器都是必备的。然后作为这么强⼤的Spring,它肯定也缺席不了。
ter它位于核⼼包中,所以它不仅仅运⽤于SpringMVC等web环境,⽐如spring-jdbc等都是有使⽤到的~
数据转换在框架设计中是⾮常重要的⼀环,它能让你的框架更普适,更通⽤,更⾃动化,解决的问题更多。
关于Spring中的数据转换,⾸先需要了解两⼤主要分⽀:
Converter:是Spring中最为简单的⼀个接⼝。位于包:ter。相关的顶层接⼝(类)有:ConditionalConverter、
GenericConverter、ConverterFactory、ConvertingComparator、ConverterRegistry
ConversionService:⽤于类型转换的服务接⼝。这是进⼊转换系统的⼊⼝点。位于包:t。相关的顶层接⼝(类)有:ConversionService、
FormattingConversionService、DefaultConversionService、ConversionServiceFactoryBean、FormattingConversionServiceFactoryBean…
注意各⼦接⼝,实现类不⼀定都是core包⾥,可能在context包、web包等等~。
Converter
Spring的Converter是可以将⼀种类型转换成另⼀种类型的⼀个法字开头的成语 对象,它的接⼝定义⾮常的的简单。
//实现此接⼝的⼤都会实现ConditionalConverter
//请保持线程安全~~
@FunctionalInterface
publicinterfaceConverter{
//把S转成T
@Nullable
Tconvert(Ssource);
}
Spring提供了3种converter接⼝,分别是Converter、ConverterFactory和GenericConverter.⼀般⽤于1:1,1:N,N:N的source->target类型转化。
Converter接⼝:使⽤最简单,最不灵活;
ConverterFactory接⼝:使⽤较复杂,⽐较灵活;
GenericConverter接⼝:使⽤最复杂,也最灵活;
Converter
该接⼝Spring内部的实现也⾮常多,⼤多数都是以内部类的形式实现(因为它是⼀个@FunctionalInterface)
//ObjectToStringConverter
finalclassObjectToStringConverterimplementsConverter
@Override
publicStringconvert(Objectsource){
ng();
}
}
//StringToCharsetConverter@since4.2
@Override
publicCharsetconvert(Stringsource){
e(source);
}
//StringToPropertiesConverter
@Override
publicPropertiesconvert(Stringsource){
try{
Propertiesprops=newProperties();
//(stream)expectsit.
(newByteArrayInputStream(es(_8859_1)));
returnprops;
}catch(Exceptionex){
//Shouldneverhappen.
thrownewIllegalArgumentException(\"Failedtoparse[\"+source+\"]intoProperties\",ex);
}
}
//StringToTimeZoneConverter@since4.2
@Override
publicTimeZoneconvert(Stringsource){
imeZoneString(source);
}
//ZoneIdToTimeZoneConverter@since4.0
@Override
publicTimeZoneconvert(ZoneIdsource){
eZone(source);
}
//StringToBooleanConverter这个转换器很有意思哪些代表true,哪些代表fasle算是业界的⼀个规范了
//这就是为什么,我们给传值1也会被当作true来封装进Boolean类型的根本原因所在~
static{
(\"true\");
(\"on\");
(\"yes\");
(\"1\");
(\"false\");
(\"off\");
(\"no\");
(\"0\");
}
//StringToUUIDConverter@since3.2
@Override
publicUUIDconvert(Stringsource){
retu缘愁似个长意思 rn(gth(source)?ring(()):null);
}
//StringToLocaleConverter
@Override
@Nullable
publicLocaleconvert(Stringsource){
ocale(source);
}
//SerializingConverter:把任意⼀个对象,转换成byte[]数组,唯独这⼀个是public的,其它的都是Spring关于杜甫的古诗 内置的
publicclassSerializingConverterimplementsConverter
//序列化器:DefaultSerializer就是newObjectOutputStream(outputStream).writeObject(object)
//就是简单的把对象写到输出流⾥~~
privatefinalSerializer
publicSerializingConverter(){
izer=newDefaultSerializer();
}
publicSerializingConverter(Serializer
l(serializer,\"Serializermustnotbenull\");
izer=serializer;
}
@Override
publicbyte[]convert(Objectsource){
ByteArrayOutputStreambyteStream=newByteArrayOutputStream(1024);
try{
ize(source,byteStream);
//把此输出流转为byte[]数组~~~~~~
Array();
}catch(Throwableex){
thrownewSerializationFailedException(\"Fa凡科建站怎么样 iledtoserializeobjectusing\"+
ss().getSimpleName(),ex);
}
}
}
Converter接⼝⾮常的简单,所以除了SerializingConverter⼀个是外部类,我们可以拿来使⽤外,其余的都是Spring内部⾃⼰使⽤的。从此可以看出:此接⼝⼀般也⽤于我们⾃⼰
去实现,即:⾃定义数据转换器。
⾃定义转换器的⼀个Demo:
//把形如这样的字符串:\"fsx:18\"转换为Person对象
publicclassPersonConverterimplementsConverter
@Override
publicPersonconvert(Stringsource){
if(y(source))千字文全文完整版 {
returnnull;
}
String[]strings=tedListToStringArray(source,\":\");
Personperson=newPerson();
e(strings[0]);
(f(strings[1]));
returnperson;
}
publicstaticvoidmain(String[]args){
Pe刘方平 rsonConverterpersonConverter=newPersonConverter();
n(t(\"fsx:18\"));//Pe数的拼音 rson{nam贾生原文及翻译注释赏析 e=\'fsx\',age=18}
}
}
备注:在Spring内部消息转换器的注册、使⽤⼀般都结合ConversionService这个接⼝
ConditionalConverter
根据source和target来做条件判断,从⽽可以判断哪个转换器⽣效,哪个不⽣效之类的。
//@since3.2出现稍微较晚
publicinterfaceConditionalConverter{
booleanmatches(TypeDescriptorsourceType,TypeDescriptortargetType);
}
scriptor也是⼀个Spring的基础类(类似ResolvableType这种),若有需要我们平时也可以使⽤它。它能够把基础类型、
MethodParameter、Field、ty、Class等都描述进来。并且提供如下⾮常⽅便⽅法:
//@since3.0
publicclassTypeDescriptorimplementsSerializable{
publicClass<?>getType(){
;
}
publicResolvableTypegetResolvableType(){
ableType;
}
publicObjectgetSource(){
rce();
}
publicStringgetName();
publicbooleanisPrimitive();
publicAnnotation[]getAnnotations();
publicbooleanhasAnnotation(Class<?extendsAnnotation>annotationType);
public
publicbooleanisAssignableTo(TypeDescriptortypeDescriptor);
publicbooleanisCollection();
publicbooleanisArray();
publicbooleanisMap();
publicTypeDescriptorgetMapKeyTypeDescriptor();
publicTypeDescriptorgetMapValueTypeDescriptor()
//静态⽅法:可吧基础类型、任意⼀个class类型转为这个描述类型依赖于下⾯的valueOf⽅法source为null返回null
publicstaticTypeDescriptorforObject(@NullableObjectsource);
publicstaticTypeDescriptorvalueOf(@NullableClass<?>type);
//把集合转为描述类型~
publicstaticTypeDescriptorcollection(Class<?>collectionType,@NullableTypeDescriptorelementTypeDescriptor)
publicstaticTypeDescriptormap(Class<?>mapType,@NullableTypeDescriptorkeyTypeDescriptor,@NullableTypeDescriptorvalueTypeDescrip
tor);
publicstaticTypeDescriptorarray(@NullableTypeDescriptorelementTypeDescriptor);
publicstaticTypeDescriptornested(MethodParametermethodParameter,intnestingLevel);
publicstaticTypeDescriptornested(Fieldfield,intnestingLevel);
publicstaticTypeDescriptornested(Propertyproperty,intnestingLevel);
}
ConditionalConverter的继承树:
ConditionalGenericConverter这个⼦接⼝,就是把GenericConverter和ConditionalConverter联合起来了。⽽GenericConverter我们上⾯提到了,它⼀般⽤于处理N:N的转
换,因此它的⼦类们放在下⾯讲会更合适~
NumberToNumberConverterFactory:它是个ConverterFactory
AbstractConditionalEnumConverter:枚举类型的转换
//@since4.3也是只能Spring内部⾃⼰⽤的
abstractclassAbstractConditionalEnumConverterimplementsConditionalConverter{
//它借助了ConversionService这个接⼝需要外部⾃定义转换逻辑~~
privatefinalConversionServiceconversionService;
protectedAbstract望天门山古诗的意思翻译 ConditionalEnumConverter(ConversionServiceconversionService){
sionService=conversionService;
}
@Override
publicbooleanmatches(TypeDescriptorsourceType,TypeDescriptortargetType){
//拿到source所有实现的接⼝若没有实现任何接⼝,永远返回true
for(Class<?>interfaceType:InterfacesForClassAsSet(e())){
//最终是委托给conversionService去做这件事了~~~~
if(vert(f(interfaceType),targetType)){
returnfalse;
}
}
returntrue;
}
}
它的两个⼦类实现:EnumToIntegerConverter和EnumToStringConverter就是调⽤了l()和()。若你想要实现⾃⼰的枚举⾃定义属性的转换,其实是
可以继承AbstractConditionalEnumConverter它的,但是Spring并没有公开它。
ConverterFactory
ConverterFactory:range范围转换器的⼯⼚:可以将对象从S转换为R的⼦类型(1:N)
publicinterfaceConverterFactory{
//GettheconvertertoconvertfromStotargettypeT,whereTisalsoaninstanceofR
getConverter(Class
}
更多推荐
converter是什么意思verter在线翻译读音
发布评论