沈阳网站建设思路,威海网站开发网络公司,做产品推广有网站比较好的,手袋 东莞网站建设目录
前言
源码地址
代码示例
引入依赖
先定两个实体用于转换
定义一个接口让所有转换器都集成
Apache BeanUtils
BeanCopier
bean-mapping
bean-mapping-asm
Dozer
自己写get/set
JMapper
json2json
MapStruct#xff08;推荐#xff09;
ModelMapper
OriK…目录
前言
源码地址
代码示例
引入依赖
先定两个实体用于转换
定义一个接口让所有转换器都集成
Apache BeanUtils
BeanCopier
bean-mapping
bean-mapping-asm
Dozer
自己写get/set
JMapper
json2json
MapStruct推荐
ModelMapper
OriKa
Spring BeanUtils
测试代码
测试结果绘制成图
总结 前言
本文章分别测试的对象转换工具为
MapStruct、JMapper、ModelMapper、Dozer、OriKa、BeanCopier、自己写get/set、
json2json、Apache BeanUtils、Spring BeanUtils、bean-mapping、bean-mapping-asm 源码地址
lasse-vo2dto: 测试市面上常用的实体转换工具的性能
代码示例
引入依赖
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency!-- Apache BeanUtils Begin --dependencygroupIdcommons-beanutils/groupIdartifactIdcommons-beanutils/artifactIdversion1.9.4/version/dependencydependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version/dependencydependencygroupIdcommons-collections/groupIdartifactIdcommons-collections/artifactIdversion3.2.2/version/dependency!-- Apache BeanUtils End --!-- https://mvnrepository.com/artifact/com.github.houbb/bean-mapping-core --dependencygroupIdcom.github.houbb/groupIdartifactIdbean-mapping-core/artifactIdversion0.2.6/version/dependency!-- https://mvnrepository.com/artifact/com.github.houbb/bean-mapping-asm --dependencygroupIdcom.github.houbb/groupIdartifactIdbean-mapping-asm/artifactIdversion0.2.6/version/dependency!-- MapStruct begin --!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct --dependencygroupIdorg.mapstruct/groupIdartifactIdmapstruct/artifactIdversion1.4.2.Final/version/dependency!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor --dependencygroupIdorg.mapstruct/groupIdartifactIdmapstruct-processor/artifactIdversion1.4.2.Final/version/dependency!-- MapStruct end --dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.78/version/dependencydependencygroupIdma.glasnost.orika/groupIdartifactIdorika-core/artifactIdversion1.4.6/version/dependency!--Dozer --dependencygroupIdnet.sf.dozer/groupIdartifactIddozer-spring/artifactIdversion5.5.1/version/dependencydependencygroupIdnet.sf.dozer/groupIdartifactIddozer/artifactIdversion5.5.1/version/dependencydependencygroupIdorg.modelmapper/groupIdartifactIdmodelmapper/artifactIdversion1.1.0/version/dependencydependencygroupIdcom.googlecode.jmapper-framework/groupIdartifactIdjmapper-core/artifactIdversion1.6.1.CR2/version/dependency!-- http://modelmapper.org/getting-started/--dependencygroupIdorg.modelmapper/groupIdartifactIdmodelmapper/artifactIdversion2.3.0/version/dependency/dependencies
先定两个实体用于转换
public class UserVO {/*** 自增ID*/private Long id;/*** 用户ID*/private String userId;/*** 用户昵称*/private String userNickName;/*** 注册时间*/private Date createTime;//get/set/toString等方法省略。。。
}
/*** 用户DTO*/
public class UserDTO {/*** 用户ID*/private String userId;/*** 用户昵称*/private String userNickName;/*** 注册时间*/private Date createTime;
//get/set/toString等方法省略。。。
}
定义一个接口让所有转换器都集成
/*** 对象装配器接口*/
public interface IAssemblerSOURCE, TARGET {TARGET sourceToTarget(SOURCE var);}
Apache BeanUtils
Component
public class ApacheCopyPropertiesAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO new UserDTO();try {BeanUtils.copyProperties(userDTO, var);} catch (IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}return userDTO;}
}
BeanCopier
Component
public class BeanCopierAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO new UserDTO();BeanCopier beanCopier BeanCopier.create(var.getClass(), userDTO.getClass(), false);beanCopier.copy(var, userDTO, null);return userDTO;}
}
bean-mapping
Component
public class BeanMappingAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO new UserDTO();BeanUtil.copyProperties(var, userDTO);return userDTO;}
}
bean-mapping-asm
Component
public class BeanMappingASMAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO new UserDTO();AsmBeanUtil.copyProperties(var, userDTO);return userDTO;}
}
Dozer
Component
public class DozerAssembler implements IAssemblerUserVO, UserDTO {private static DozerBeanMapper mapper new DozerBeanMapper();Overridepublic UserDTO sourceToTarget(UserVO var) {return mapper.map(var, UserDTO.class);}
}
自己写get/set
Component(getSetAssembler)
public class GetSetAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO new UserDTO();userDTO.setUserId(var.getUserId());userDTO.setUserNickName(var.getUserNickName());userDTO.setCreateTime(var.getCreateTime());return userDTO;}
}
JMapper
Component(jMapperAssembler)
public class JMapperAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {JMapperUserDTO, UserVO jMapper new JMapper(UserDTO.class, UserVO.class, new JMapperAPI().add(JMapperAPI.mappedClass(UserDTO.class).add(JMapperAPI.attribute(userId).value(userId)).add(JMapperAPI.attribute(userNickName).value(userNickName)).add(JMapperAPI.attribute(createTime).value(createTime))));return jMapper.getDestination(var);}}
json2json
Component
public class Json2JsonAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {String strJson JSON.toJSONString(var);return JSON.parseObject(strJson, UserDTO.class);}
}
MapStruct推荐
MapperConfig
public interface IMappingSOURCE, TARGET {/*** 映射同名属性*/Mapping(target createTime, dateFormat yyyy-MM-dd HH:mm:ss)TARGET sourceToTarget(SOURCE var1);/*** 反向映射同名属性*/InheritInverseConfiguration(name sourceToTarget)SOURCE targetToSource(TARGET var1);/*** 映射同名属性集合形式*/InheritConfiguration(name sourceToTarget)ListTARGET sourceToTarget(ListSOURCE var1);/*** 反向映射同名属性集合形式*/InheritConfiguration(name targetToSource)ListSOURCE targetToSource(ListTARGET var1);/*** 映射同名属性集合流形式*/ListTARGET sourceToTarget(StreamSOURCE stream);/*** 反向映射同名属性集合流形式*/ListSOURCE targetToSource(StreamTARGET stream);}
Mapper(componentModel spring, unmappedTargetPolicy ReportingPolicy.IGNORE, unmappedSourcePolicy ReportingPolicy.IGNORE)
public interface UserDTOMapping extends IMappingUserVO, UserDTO {/** 用于测试的单例 */IMappingUserVO, UserDTO INSTANCE Mappers.getMapper(UserDTOMapping.class);Mapping(target userId, source userId)Mapping(target createTime, dateFormat yyyy-MM-dd HH:mm:ss)OverrideUserDTO sourceToTarget(UserVO var1);Mapping(target userId, source userId)Mapping(target createTime, dateFormat yyyy-MM-dd HH:mm:ss)OverrideUserVO targetToSource(UserDTO var1);
}
Component
public class MapStructAssembler implements IAssemblerUserVO, UserDTO {Resourceprivate IMappingUserVO, UserDTO userDTOMapping;Overridepublic UserDTO sourceToTarget(UserVO var) {return userDTOMapping.sourceToTarget(var);}}
ModelMapper
Component
public class ModelMapperAssembler implements IAssemblerUserVO, UserDTO {private static ModelMapper modelMapper new ModelMapper();static {modelMapper.addMappings(new PropertyMapUserVO, UserDTO() {Overrideprotected void configure() {// 属性值不一样可以自己操作map().setUserId(source.getUserId());}});}Overridepublic UserDTO sourceToTarget(UserVO var) {return modelMapper.map(var, UserDTO.class);}}
OriKa
Component
public class OrikaAssembler implements IAssemblerUserVO, UserDTO {/*** 构造一个MapperFactory*/private static MapperFactory mapperFactory new DefaultMapperFactory.Builder().build();static {mapperFactory.classMap(UserDTO.class, UserVO.class).field(userId, userId) // 字段不一致时可以指定.byDefault().register();}Overridepublic UserDTO sourceToTarget(UserVO var) {return mapperFactory.getMapperFacade().map(var, UserDTO.class);}}
Spring BeanUtils
Component
public class SpringCopyPropertiesAssembler implements IAssemblerUserVO, UserDTO {Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO new UserDTO();BeanUtils.copyProperties(var, userDTO);return userDTO;}
}
测试代码
RunWith(SpringRunner.class)
SpringBootTest
public class ApiTest {private Logger logger LoggerFactory.getLogger(ApiTest.class);Resource(name apacheCopyPropertiesAssembler)private IAssemblerUserVO, UserDTO apacheCopyPropertiesAssembler;Resource(name beanCopierAssembler)private IAssemblerUserVO, UserDTO beanCopierAssembler;Resource(name beanMappingAssembler)private IAssemblerUserVO, UserDTO beanMappingAssembler;Resource(name beanMappingASMAssembler)private IAssemblerUserVO, UserDTO beanMappingASMAssembler;Resource(name getSetAssembler)private IAssemblerUserVO, UserDTO getSetAssembler;Resource(name mapStructAssembler)private IAssemblerUserVO, UserDTO mapStructAssembler;Resource(name springCopyPropertiesAssembler)private IAssemblerUserVO, UserDTO springCopyPropertiesAssembler;Resource(name orikaAssembler)private IAssemblerUserVO, UserDTO orikaAssembler;Resource(name dozerAssembler)private IAssemblerUserVO, UserDTO dozerAssembler;Resource(name modelMapperAssembler)private IAssemblerUserVO, UserDTO modelMapperAssembler;Resource(name jMapperAssembler)private IAssemblerUserVO, UserDTO jMapperAssembler;Resource(name json2JsonAssembler)private IAssemblerUserVO, UserDTO json2JsonAssembler;private Long cycleIndex100000L;private UserVO userVO new UserVO();Testpublic void all(){System.out.println(各跑cycleIndex次);test_apacheCopyPropertiesAssembler();test_beanCopierAssembler();test_beanMappingAssembler();test_beanMappingASMAssembler();test_getSetAssembler();test_mapStructAssembler();test_springCopyPropertiesAssembler();test_orikaAssembler();test_dozerAssembler();test_modelMapperAssembler();test_jMapperAssembler();test_json2JsonAssembler();}Beforepublic void initData() {userVO.setId(1001L);userVO.setUserId(007);userVO.setUserNickName(lasse);userVO.setCreateTime(new Date());}Testpublic void test_apacheCopyPropertiesAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO apacheCopyPropertiesAssembler.sourceToTarget(userVO);}System.out.println(apacheCopyPropertiesAssembler方法耗时 (System.currentTimeMillis() - start) ms);// 方法耗时2050ms}Testpublic void test_beanCopierAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO beanCopierAssembler.sourceToTarget(userVO);}System.out.println(beanCopierAssembler方法耗时 (System.currentTimeMillis() - start) ms);// 方法耗时53ms}Testpublic void test_beanMappingAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO beanMappingAssembler.sourceToTarget(userVO);}System.out.println(beanMappingAssembler方法耗时 (System.currentTimeMillis() - start) ms);// 方法耗时162ms}Testpublic void test_beanMappingASMAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO beanMappingASMAssembler.sourceToTarget(userVO);}System.out.println(beanMappingASMAssembler方法耗时 (System.currentTimeMillis() - start) ms);// 方法耗时90ms}// 方法耗时3msTestpublic void test_getSetAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO getSetAssembler.sourceToTarget(userVO);}System.out.println(getSetAssembler方法耗时 (System.currentTimeMillis() - start) ms);}Testpublic void test_mapStructAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO mapStructAssembler.sourceToTarget(userVO);}System.out.println(mapStructAssembler方法耗时 (System.currentTimeMillis() - start) ms);// 方法耗时4ms}Testpublic void test_springCopyPropertiesAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO springCopyPropertiesAssembler.sourceToTarget(userVO);}System.out.println(springCopyPropertiesAssembler方法耗时 (System.currentTimeMillis() - start) ms);// 方法耗时64ms}Testpublic void test_orikaAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO orikaAssembler.sourceToTarget(userVO);}System.out.println(orikaAssembler方法耗时 (System.currentTimeMillis() - start) ms);}Testpublic void test_dozerAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO dozerAssembler.sourceToTarget(userVO);}System.out.println(dozerAssembler方法耗时 (System.currentTimeMillis() - start) ms);}Testpublic void test_modelMapperAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO modelMapperAssembler.sourceToTarget(userVO);}System.out.println(modelMapperAssembler方法耗时 (System.currentTimeMillis() - start) ms);}Testpublic void test_jMapperAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO jMapperAssembler.sourceToTarget(userVO);}System.out.println(jMapperAssembler方法耗时 (System.currentTimeMillis() - start) ms);}Testpublic void test_json2JsonAssembler() {long start System.currentTimeMillis();for (int i 0; i cycleIndex; i) {UserDTO userDTO json2JsonAssembler.sourceToTarget(userVO);}System.out.println(json2JsonAssembler方法耗时 (System.currentTimeMillis() - start) ms);}}
测试结果绘制成图
用于对象属性转换有12种接下来我们分别测试这12种属性转换操作分别在一百次、一千次、一万次、十万次、一百万次时候的性能时间对比。 总结
BeanUtils.copyProperties 是大家代码里最常出现的工具类但只要你不把它用错成 Apache 包下的而是使用 Spring 提供的就基本还不会对性能造成多大影响。但如果说性能更好可替代手动get、set的还是 MapStruct 更好用因为它本身就是在编译期生成get、set代码和我们写get、set一样。其他一些组件包主要基于 AOP、ASM、CGlib的技术手段实现的所以也会有相应的性能损耗
文章转载自: http://www.morning.ttkns.cn.gov.cn.ttkns.cn http://www.morning.haibuli.com.gov.cn.haibuli.com http://www.morning.qlkjh.cn.gov.cn.qlkjh.cn http://www.morning.redhoma.com.gov.cn.redhoma.com http://www.morning.yslfn.cn.gov.cn.yslfn.cn http://www.morning.spqtq.cn.gov.cn.spqtq.cn http://www.morning.npcxk.cn.gov.cn.npcxk.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.bby45.cn.gov.cn.bby45.cn http://www.morning.rkhhl.cn.gov.cn.rkhhl.cn http://www.morning.rnrwq.cn.gov.cn.rnrwq.cn http://www.morning.lmtbl.cn.gov.cn.lmtbl.cn http://www.morning.dskzr.cn.gov.cn.dskzr.cn http://www.morning.nypgb.cn.gov.cn.nypgb.cn http://www.morning.khcpx.cn.gov.cn.khcpx.cn http://www.morning.tqygx.cn.gov.cn.tqygx.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.hqxyt.cn.gov.cn.hqxyt.cn http://www.morning.yhtnr.cn.gov.cn.yhtnr.cn http://www.morning.jfymz.cn.gov.cn.jfymz.cn http://www.morning.cftkz.cn.gov.cn.cftkz.cn http://www.morning.lywys.cn.gov.cn.lywys.cn http://www.morning.pjzcp.cn.gov.cn.pjzcp.cn http://www.morning.kwqwp.cn.gov.cn.kwqwp.cn http://www.morning.qtxwb.cn.gov.cn.qtxwb.cn http://www.morning.brnwc.cn.gov.cn.brnwc.cn http://www.morning.stbfy.cn.gov.cn.stbfy.cn http://www.morning.hjjhjhj.com.gov.cn.hjjhjhj.com http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.bktly.cn.gov.cn.bktly.cn http://www.morning.tgczj.cn.gov.cn.tgczj.cn http://www.morning.dmxzd.cn.gov.cn.dmxzd.cn http://www.morning.wjlkz.cn.gov.cn.wjlkz.cn http://www.morning.tpxgm.cn.gov.cn.tpxgm.cn http://www.morning.nnhrp.cn.gov.cn.nnhrp.cn http://www.morning.dpmkn.cn.gov.cn.dpmkn.cn http://www.morning.ggcjf.cn.gov.cn.ggcjf.cn http://www.morning.rszyf.cn.gov.cn.rszyf.cn http://www.morning.kjyhh.cn.gov.cn.kjyhh.cn http://www.morning.qlwfz.cn.gov.cn.qlwfz.cn http://www.morning.gwgjl.cn.gov.cn.gwgjl.cn http://www.morning.rntyn.cn.gov.cn.rntyn.cn http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.8yitong.com.gov.cn.8yitong.com http://www.morning.jtcq.cn.gov.cn.jtcq.cn http://www.morning.mtsgx.cn.gov.cn.mtsgx.cn http://www.morning.zljqb.cn.gov.cn.zljqb.cn http://www.morning.cnqdn.cn.gov.cn.cnqdn.cn http://www.morning.xrtsx.cn.gov.cn.xrtsx.cn http://www.morning.pwrkl.cn.gov.cn.pwrkl.cn http://www.morning.clhyj.cn.gov.cn.clhyj.cn http://www.morning.mglqf.cn.gov.cn.mglqf.cn http://www.morning.znqztgc.cn.gov.cn.znqztgc.cn http://www.morning.jkzjs.cn.gov.cn.jkzjs.cn http://www.morning.mszls.cn.gov.cn.mszls.cn http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn http://www.morning.ypklb.cn.gov.cn.ypklb.cn http://www.morning.ktpzb.cn.gov.cn.ktpzb.cn http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.zdtfr.cn.gov.cn.zdtfr.cn http://www.morning.sjjq.cn.gov.cn.sjjq.cn http://www.morning.kpypy.cn.gov.cn.kpypy.cn http://www.morning.drmbh.cn.gov.cn.drmbh.cn http://www.morning.wfspn.cn.gov.cn.wfspn.cn http://www.morning.phtqr.cn.gov.cn.phtqr.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.mhcft.cn.gov.cn.mhcft.cn http://www.morning.hmdyl.cn.gov.cn.hmdyl.cn http://www.morning.llyqm.cn.gov.cn.llyqm.cn http://www.morning.ghxkm.cn.gov.cn.ghxkm.cn http://www.morning.yktwr.cn.gov.cn.yktwr.cn http://www.morning.ygrdb.cn.gov.cn.ygrdb.cn http://www.morning.nfbkp.cn.gov.cn.nfbkp.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.xkhxl.cn.gov.cn.xkhxl.cn http://www.morning.bsrcr.cn.gov.cn.bsrcr.cn http://www.morning.nkwgy.cn.gov.cn.nkwgy.cn http://www.morning.fnkcg.cn.gov.cn.fnkcg.cn