简介: 跟着体系模块分层不断细化,在Java日常开发中不可避免地涉及到各种方针的转化,如:DO、DTO、VO等等,编写映射转化代码是一个繁琐重复且还易错的作业,一个好的东西辅佐,减轻了作业量、跋涉开发作业功率的一起还能减少bugjava怎样读的发生。

Java方针转化计划剖析与mapstruct实践

作者 | 久贤
来历 | 阿里技能群众号

一 前语

跟着体系阿里众包模块分层不断细化,在Java日常开发中开源中国不可避免地涉及到各种方针的转化,如:DO、DTO、VO等等,编写映射转化代码是一个繁琐重复且还易错的作json格局怎样翻开业,一个好的东西辅佐,减轻了作业量、跋涉开发作业功率的一起还json文件是干什么的能减少bug的发生。

二 常用计划及剖析

1 fastjson

CarDTO entity = JSON.parseObject(JSON.toJSONString(carDO), CarDTO阿里二季度财报.class);

这种json解析java初学计划因为经过生成中心json格开源软件式字符串,然后再转化成方针方针,功用非常差,一起开源是什么意思因为中心会生成json格局字符串,假java怎样读定转化过多,gc会非常再三,一起针对凌乱场景支撑才阿里巴巴1688货源批发官网能缺少,根柢很少用。

2 BeanUtil类

Beanjson是什么意思Util.copyProperties()结合手写ge阿里供应链t、set,关于简略的转化直接运用BeanUtil,凌乱的转化自己手艺写get、set。该计划的痛点就在于代码编写功率低、冗余逆向思想操练500题冗繁还略显丑恶,并且BeanUtil因为运用了反射in逆向成长voke去赋值功用不JSON高。

只能合适bean数量较少、内容不多、转化不再三的场景开源矿工

apache.逆向BeanUtils

orjson阿里云邮箱个人版解析g.apache.com阿里供应链mons.beanutils.BeanUtils.copyProperties(do, entity);

这种计划因为用到反射的原因,一起本身阿里云盘规划问题,功用比较差。集团开发规约明确规定阻止运用。

Java方针转化计划剖析与mapstruct实践

spring.BeanUti阿里云盘ls

org.spjava语言ringframew开源阅览app下载安装ork.beans.Be开源代码网站githubanUtils.json是什么意思copyPrjavaapi中文在线看o阿里众包perties(do, entity);

这种计划针阿里云对a开源阅览app下载安装pache的BeanUtils做了许多优化,全体功用跋涉不少,不开源众包过仍是运用反射完毕比不上原生代码处理,其次针对凌乱场景支撑才华缺少。

Java方针转化计划剖析与mapstruct实践

3 bea阿里云邮箱个人版nCopier

Bea阿里巴巴股票nCopier copier = Bejavaapi中文在线看anCopjsonp跨域原理ier.create(CarDO.class, CarDTO.clas阿里巴巴股票s, false);
copier.copy(do, dto, null);

这种开源阅览计划动态生成一个要代理类的子类,其实就是经过字节码办法转化成功用最好的gejava怎样读t和set办法,重要的开开源矿工支在创建BeanCopier,全体功用挨近原生代码处理,比BeanUtils要好许多,尤其在数据量很大时,可json是什么意思是针对凌乱场景支撑才华逆向成长缺少。

4 各种Mapping结构

分类

Objjavascriptect Mapp开源是什么意思ing 技能从大的视点来说分为两类开源矿工,一类是运行期阿里二季度财报转化开源节流什么意思,另一类json格局则是编译期转化:

  • 运行期反射调用 set/get 或者是直接对成员变量赋值。这种办法经过invoke实施赋值,完毕时一般会选用beanutil, Javassist等开源库。运行期方针转化的代表首要是Dozer和ModelMaper。
  • 编译期动态生成 set/get 代码的class文件,在运行时直接调用该class的 set/get 办法。逆向行驶扣几分罚款多少钱该办法实际上仍会存在 set/get 代码,仅仅不需求开发人员自己写了。这类的代表是:MapStruct,Selma,Orika。

剖析

  • 不管哪种Mapping结开源jsonp代码网站github构,根柢都是选逆向行驶扣几分用xml装备文件 or 注解的办法供用户java模拟器装备,然后生逆向成长成映射联络。
  • 编译期生成class文件办法需求Djson格局TO依然有set/get办法,仅仅调用被屏蔽;而运行阿里供应链期反射办法在开源是什么意思阿里众包些直接jsonp跨域原理填充 field的计划中,set/get代码也能够省掉。
  • 编译期生成class办法会有源代码在本地,便当排查问题。
  • 编译期生成class办法因为在编译期才开源代码网站github呈现java和class文件,所以热安开源矿工顿会遭到必定影响。
  • 反射型因为许多内容是黑盒,在排查问题时,不如编译期生成阿里巴巴股票class办法便当。参看GitHub上工程java-object-mapper-benchmark能够看出首要结构功用比较。
  • 反射型调用因为是在运行期根据映射联络反射实施,其实施速度会明显下降N个量级。
  • 经过编译期生成class代码的办法,本质跟直接写代码差异不大,但因为代码都是靠模板生成,所以代码质量没有手艺写那么高,这也会构成必定的功用丢掉开源节流什javaapi中文在线看么意思

Java方针转化计划剖析与mapstruct实践

归纳功用、成熟度、易用性逆向行驶扣几分、扩展性,mapstruct是比较优异的一个结构。

三 Mapstruct运用攻略

1 Maven引入java怎样读

Java方针转化计划剖析与mapstruct实践

2 简略入门事例

DO和DTO

这儿用到了lomJSONbok简化代码,lombok的原理也是在编译时去生成get、set等被简化的代码。

@D逆向成长ata
public c逆向思想事例100个lass Car {
private String开源矿工 make;
private int numberOfSe阿里ats;
private CarType type;
}
@Data
public class CarDTO {
private Strjsoning make;
privat阿里e int seatCount;
pri阿里云vate String type;
}

界说Mjsonapper

@Mapper中描绘映射,在修正的时分mapstruct将会根据此描绘生成完毕类:

  • 当特阿里云邮箱个人版征与其方针实体副本同名时,它将被隐式映射。

  • 当方针实java言语体中的特征具有不阿里二季度财报同称谓时,能够经过@Mapping注释指javaapi中文在线看定其称谓。js开源代码网站githubon格局

    @Mapper
    public interface CarMapper {
    @Mapping(source = “numberOfjson数据Seats”, targjavascriptet = “seatCount”)
    CarDTjava初学O CarToCarDTOjava语言(Car car); }

运用Mapper

经过Map逆向pers 工厂生成静态实例运用。

@Mapper
public interface CarMappe阿里拍卖r {
CarM逆向行驶扣几分罚款多少钱apper INSTANCE = Mappers.getMapper(Cjson是什么意思arMapper.class);
@Mappin开源是什么意思g(source = "numberOfSeats", target = "seatCount")
Cjson是什么意思arDTO CarToCarDTO(Car car);
}
Car car = new Car(.json逆向行驶扣几分字符串..)逆向成长;
CarDTO carDTjsonO = CarMapper.INSTANCE.CarT阿里云盘开源节流什么意思oCarDTO(car);

getMapper会去load接口的Impl后缀的完毕类。

Java方针转化计划剖析与mapstruct实践

经过生成sprijso开源节流什么意思nng bean注入运用,Mapper注解加上spring装备,会开源中国主动生成一个bean,直接运用bean注入即可拜访。

@逆向思阿里云维的比如Mapper(co阿里巴巴mponentModel = "springjson文件是干什么的")
public interface CarMapper {
@Mapping(source = "numberOfSeats", target = "sea开源tCount")
CarDTO CarToCarDTO(Car carjavaapi中文在线看);
}

主动生成的MapperImpl内容

json文件是干什么的设装备了spring beanjava初学拜访会在注解上主动加上@Component。

Java方针转化计划剖析与mapstruct实践

3 进阶运用

逆向映射

假定是双向映射逆向行驶扣几分,例如 从DO到DTO以及从DTO到DO,正向办法和反向办法的映射规矩通常是类似的,并且能够经过切换源和方针阿里巴巴股票来简略地回转。

json文件是干什么的用注解@Ijsonp跨域原理nheritInverseConfiguration 指示办法应承继相应反向办法的反向装备。

@Mapper
public interface CarMajson是什么意思pper {
CarMapper INSTANCE = Mappers.getMapper(Cajson字符串rMapper.class);java难学吗
@Mappinjson格局怎样翻开g(source = "njava怎样读umberOfSeats",阿里 target = "seatCount")
CarDTO CarToCarDTO(Car car);
@InheritInverseConfiguration
Car CarDTOToCar(CarDTO carDTO);
}

更新be开源是什么意思an映射

有些情况下不需求映射转化发生新的bean,而是更新已有的bean逆向思想的比如

@Mapper
public intjson解析erfjavaapi中文在线看ace CarMapper {
Car逆向思想操练500题Majson格局怎样翻开pper INSTANCE = Mappers.getMapper(CarMapper.clajson格局怎样翻开ss);
@Mapping(source = "numberOfSeats"逆向思想, target = "seatCou逆向思想事例100个nt"json是什么意思)
void updateDTOFromCar(Car ca开源r, @MappingTarget CarDTO carDTO);

集结映逆向行驶扣几分

集结类型(List,Set,Map等)的映射以与映射bean类型相同的办法完毕,即经过在映射器接口中界说具有所需源类型和方针类型的映射办法。MapStruct支撑Java Collection Framework中的多种可迭代类型。

生成json字符串的代码将逆向行驶扣几分罚款多少钱包含一个循环,该循环遍历源集结,转化每个元素并将其放入方针集结。假定在给定的映射器或其运用的映射器中找到用于集结元素类型的映射办法,则将调用此办法以实施元素转化阿里二季度财报,假定存在针对源元素类jsonp跨域原理型和方针元素类型的隐式转化,则将调用此转化。

@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "sea逆向思想是什么意思tCou开源矿工nt")
CarDTO CarToCarDTOJava(Car car);
List&lt开源阅览;CarDTO> carsToCarDtjson格局osJava(List<Car> cars)Java;
Set<String> intejava难学吗gJSONerSetToSjava难学吗tringSet(Se逆向思想阿里二季度财报的比如t<Integer>阿里拍卖 i开源阅览ntegers);
@MapMappi阿里二季度财报n逆向g(valueDateFormat = "dd.MM开源软件.yyyy")
Map<String, String> longDate阿里巴巴1688货源批发官网MapToStrjava怎样读ingStringMap(Map<Long, Date> source);
}

编译时生成的完毕类:

Java方针转化计划剖析与mapstruct实践

多个源参java作业培训班数映射

Majso阿里巴巴n解析pStrucjavaapjava作业培训班i中文在线看t 还支撑具有多个源参数的映射办法。例如,将多个实体组合成一个数据传输方针。

在原事例java语言新增一个Person方针,CarDTO中新增drive开源阅览rName特征javas逆向行驶扣几分cript,根据阿里供应链Pe开源阅览rson方针取得。

@Mapper逆向思想的比java作业培训班
public interface CarMapjava难学吗per {
CarMapper INSTANjava面试题Cjava难学吗E = Mappers.g逆向行驶扣几分罚款多少钱etMapper(CarMapper.classjavaapi中文在线看);java初学
@Mappjava初学ing(source = "car.numberOfSeats", target = "seatCount")
@Mapping(source = "person.name", target = "drivjava作业培逆向思想操练500题开源阅览erName")
CarDTO CarToCarDTO(C开源我国ar car,json接口回来过错 Persojava面试题n p逆向旅行erso开源阅览app下载安装n); }

编译生成的代码:

Java方针转化计划剖析与mapstruct实践

默许值和常量映射

假定相逆向思想操练500题应的阿里二季度财报源特征是null ,则能够指定默许值以将预界说值设置为方针特征阿里众包。在任何情况下,都能够指定常量来设置这样的预界说值。默许值和常量被指定为字符串值。当方针类型是原始类型或装箱类逆向思想操练500题型时,String 值将选用字面量,在这种情况下JSON容许位/八进制/十进制/十六进制办法,只需它们是有用的文字即可。在所有其他情况下,常量或默许Java值会经过Java内置转化或调用其他映射办法进行类型转化,以匹配方针特征所需的类型。

@Mapper
public逆向行驶怎样处罚2021 interfajava初学ce SourceTargetMappjson阿里云盘解析er {
SourceTargetM逆向思想是什么意思app阿里二季度json接口回来过错财报er INSTANCE = Mappers开源.gjavaapi中文在线看etMapper( SourceTargetMapper.class );
@Mapping(开源众包target = "stringProperty", source = "strjson字符串ingProp", def阿里aultValue = "undejava难学吗fined")
@阿里Mapping(target = "longProperty"逆向思想事例100个, so阿里云邮箱个人逆向行驶扣几分urjsonce =开源 "longProp", defaultValue = "-1")
@Mapping(target = "stringConstant", constant = "Co逆向挑选nstant Value")
@Mappi开源矿工ng(target = "integerConstant", cons开源众包tant = "1阿里巴巴股票4")
@Mapping(target = "longWrapperConstant", constant = "3001")
@Ma逆向思想pping(ta阿里云rge开源阅览t = "dateConstant",阿里java难学吗 dateFormat = "d开源节流d-MM-yyyy", constant =开源众包 "09-01-2014")
@Mapping开源中国(target = "stringListConstants", constant = "jack-jill-tom")
Target sourc阿里二季度财报eToTarget(Source sjson解析);
}

自界说映射办法或映射器

在某些情况下,或许需求手动完毕 MapStruc逆向思想的比如t 无法生逆向思想事例100个成的从一种类型到另一种类型的特定映射。

能够在Mapper中定json解析阿里众包向旅行默许完毕办法,生成转化代码将调用相关办法:

@Mapper
public interface CarMapper {
CarMappeJavar INSTANCE = Mappers.json文件是干什么的getMapper(CarMapper.class);
@Mapping开源阅览(source = "numberOfSeats", tarjson字符串get = "seatCount")
@Mapping(source = "length", target = "le阿里巴巴1688货源批发官网ngthType")
CarDTO CarToCarDTO(Car car);
defjava开发ault String getLengthType(injava怎样读javascriptt length) {
if (length阿里巴巴1688货源批发官网 > 5) {
rejava难学吗tur逆向行驶扣几分罚款多少钱n "large";
} else {
retu开源矿工开源阅览rn "small";
}
}
}

也能够界说其他阿里云盘映射器,如下事例Car中Date需求转化成DTO逆向思想的比如中的Stringjsonp逆向旅行

public class DateMapper {
public Str阿里巴巴股票ing ajsonpsString(Date date) {
return date != null ? new Simpljava作业培训班eDateFormat( "yyyy-MM-dd" ).forma阿里t( date ) : null;
}
public Date asDate(String da阿里巴巴te) {
try {
return date != null ? new SimpleDate开源阅览Format( "yyyy-MM-dd" ).parse( date ) : null;
} catch ( ParseExcjson字符串jsonp跨域原理eption e ) {
throw new RuntimeEjava初学xception( e );
}
}
}json数据
@Mapper(uses = DateMapper.class)
public interface CarMapper {
CarMapper INSTA开源节流什么意思NCE = Mappers.getMJavaappjson数据er(CarMap阿里巴巴per.cl阿里巴巴16java开发88货源批发官网ass);
@Mapping(source = "阿里云盘numberOfSeats", t逆向思想事例100个arget = "seatC阿里云盘ount")
CarDTO CarToCarDTO(Car car);
}

编译生成的代码:逆向

Java方针转化计划剖析与mapstruct实践

若遇到多个类似的办法调用时会呈现模Java棱两可,需运用@qu阿里拍卖aj开源节流什么意思son文件是干什么的lifiedBy指定开源

@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mapper阿里巴巴s.getMapper(CarMapjson格局怎样翻开per.class);
@Mapping(so逆向思想urce = "numberOfSeats", target = "s开源阿里供应链节流什么意思eatCount阿里供阿里巴巴1688货源批发官网应链")
@Mappin阿里众包g(source = "length阿里阿里阿里拍卖", tjava语言arget =逆向思想 "lengthType", q逆向行驶扣几分ualifiedByNa开源我国me = "newStandard")
CarDTO CarToCarDTO(Car car);
@Named("oldStandard")
defaul阿里巴巴t String getLengthType(int length) {
if (length > 5) {
return "lajson文件是干什么的rge";
} else {
return "small";
}
}
@Named("newStandard")
default String getLengthType2(int length) {
if (length > 7) {
retujson是什么意思rn "large";
} else {
return "small";
}
}
}

表达式自界说映射

经过表达式,能够包含来自多种言语的结构。

现在仅支撑 Java 作为言语。例如,java作业培训班此功用可用于调用结构函数开源是什么意思,整个源方针都能够在表达式中J阿里云邮箱个人版SON运用。应留心仅刺进有用的 Java 代码:MapStruct 不会在生成时验证表达式,但在阿里云盘编译期间生成的类中会闪现差错。

@Data
@A阿里拍卖llArgsConstructor
p阿里云ublic class Driver {
private StJavaring name;
private int age;
}
@Mapper
public intejava难学吗rface CarMappe阿里云邮箱个人版r {开源矿工
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "ca阿里巴巴r.jsonpnumberOfSe逆向思想ats", target =java言语 "seatCojson数据unt")
@Mapping(target = "driver",阿里巴巴 expression = "开源阅览java( new com.java开发alibabajsonp.my.mapstruct.json是什么意思example4.beans.Driver(person.getNam逆向思想e(), perjson解析son.getAge()))")
CarDTO CarToCar阿里众包DTjson解析O(Car ca阿里云邮箱个人版r, Person person);
}

默许json表达式是默许值和表达式的组合:

@Mapper( imports = UUI阿里D.class )
p开源中国ublic interface SourceTarget阿里云Mapper {
SourceTargetMapper INSTANCE = Mappers.getMapper( SourceTargetjava面试题Mapper.class );
@Mapping(target="id", source="sourceId",开源节流什么意思 defaultE逆向行驶扣几分罚款多少钱xpression = "java( UJavaUID.randomUUID().toS开源众包tring() )")
Target sourceToTarget(Source s);
}json文件是干什么的

装修器自界说映射

在某些情况下,或许需求自界说生成的映射办法,例json接口回来过错如在方针方针中设置无法由生成的办法完毕java怎样读设置的附加特征。

完毕起来也很简略,用装修器办法完毕映射器的一个抽象类,在映开源软件射器Mapper中开源软件添加注解@Deco逆向思想ratedWith指向装修器类,运用时仍是正常调用。

@Mapper
@De逆向思想corajav阿里二季度财报a作业阿里云培训班tedWith阿里巴巴股票(CarMapperDecorator.cl开源节流什么意思ass)
p开源软件ubjava怎样读lic interface CarMapper {
CarMapper INSTANCE =java开发 Mappers.getMapper(CarMapper.class);jsonp
@Mapping(so阿里巴巴1688货源批发官网urce = "numberOjson格局fSeats", target = "seatCount")
C开源矿工arjava模拟器DTO CarToCarDTO(Car car);
}
publicjavascript ab逆向挑选stract clasjava面试题s CarMapperDecorator implements CarMapper {
private final CarM逆向挑选apper delegate;
protected CarMapjson字符串perDecor阿里云ajava难学吗tor(CarMapjava面试题per delegate) {
this.delegate = delegate;
}
@Override
public CarDTO CarToCarDTO(Car car) {
CarDTO dto = delegate.CarToCarDTO(car);
dto.setMakeInfo(car.getMake() + " " + new Simple逆向思想DateFo开源阅览rmat( "阿里巴巴yyyy-MM-dd" ).forjava模拟器mat(car.getCreateDate(开源阅览app下载安装)));
return dto;
}
}

原文链接

本文为阿里云原创内容,未经容许不得转载。java初学