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)

//就是简单的把对象写到输出流⾥~~

privatefinalSerializerserializer;

publicSerializingConverter(){

izer=newDefaultSerializer();

}

publicSerializingConverter(Serializerserializer){//⾃⼰亦可指定实现。

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);

publicTgetAnnotation(ClassannotationType);

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

ConvertergetConverter(ClasstargetType);

}

更多推荐

converter是什么意思verter在线翻译读音

本文发布于:2023-04-04 20:54:01,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:converter是什么意思verter在线翻译读音

发布评论

评论列表 (有 0 条评论)
草根站长

数学伊甸园-www.sxydy.com

教学资料、试卷,词典查询,美文欣赏!

网站地图1 网站地图2 网站地图3 网站地图4 网站地图<5/a> 网站地图6 网站地图7 网站地图8 网站地图9 网站地图0 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22 网站地图23 网站地图24 网站地图25 网站地图26 网站地图27 网站地图28 网站地图29 网站地图30 网站地图31 网站地图32 网站地图33 网站地图34 网站地图35 网站地图36 网站地图37 网站地图38 网站地图39 网站地图40 网站地图41 网站地图<42/a> 网站地图43 网站地图44 网站地图45 网站地图46 网站地图47 网站地图48 网站地图49 网站地图50 网站地图51 网站地图52 网站地图53 网站地图54 网站地图55 网站地图56 网站地图57 网站地图58 网站地图59 网站地图60 网站地图61 网站地图62 网站地图63 网站地图64 网站地图65 网站地图66 网站地图67 网站地图68 网站地图69 网站地图70 网站地图71 网站地图72 网站地图73 网站地图74 网站地图75 网站地图76 网站地图77 网站地图78 网站地图79 网站地图80 网站地图81 网站地图82 网站地图83 网站地图<84/a> 网站地图85 网站地图86 网站地图87 网站地图88 网站地图89 网站地图90 网站地图91 网站地图92 网站地图93 网站地图94 网站地图95 网站地图96 网站地图97 网站地图98 网站地图99 网站地图100 网站地图101 网站地图102 网站地图a1 网站地图a2 网站地图a3 网站地图a4 网站地图a5 网站地图a6 网站地图a7 网站地图a8 网站地图a9 网站地图b1 网站地图b2 网站地图b3 网站地图b4 网站地图b5 网站地图b6 网站地图b7 网站地图b8 网站地图b9 网站地图b11 网站地图b12 网站地图b13 网站地图b14 网站地图b15 网站地图b16 网站地图q1 网站地图q2 网站地图q3 网站地图q4 网站地图q5 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图 网站地图