当前位置: 首页 > news >正文

找工作哪个网站好58同城百度小说免费阅读

找工作哪个网站好58同城,百度小说免费阅读,企业官网图片,h5免费模板目录 前言 源码地址 代码示例 引入依赖 先定两个实体用于转换 定义一个接口让所有转换器都集成 Apache BeanUtils BeanCopier bean-mapping bean-mapping-asm Dozer 自己写get/set JMapper json2json MapStruct(推荐) ModelMapper OriK…

目录

前言

源码地址

代码示例

引入依赖

先定两个实体用于转换

定义一个接口让所有转换器都集成

Apache BeanUtils

BeanCopier

bean-mapping

bean-mapping-asm

Dozer

自己写get/set

JMapper

json2json

MapStruct(推荐)

ModelMapper

OriKa

Spring BeanUtils

测试代码

测试结果绘制成图

总结


前言

本文章分别测试的对象转换工具为:

MapStructJMapperModelMapperDozerOriKaBeanCopier自己写get/set

json2jsonApache BeanUtilsSpring BeanUtilsbean-mappingbean-mapping-asm

源码地址

lasse-vo2dto: 测试市面上常用的实体转换工具的性能

代码示例

引入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- Apache BeanUtils Begin --><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency><!-- Apache BeanUtils End --><!-- https://mvnrepository.com/artifact/com.github.houbb/bean-mapping-core --><dependency><groupId>com.github.houbb</groupId><artifactId>bean-mapping-core</artifactId><version>0.2.6</version></dependency><!-- https://mvnrepository.com/artifact/com.github.houbb/bean-mapping-asm --><dependency><groupId>com.github.houbb</groupId><artifactId>bean-mapping-asm</artifactId><version>0.2.6</version></dependency><!-- MapStruct begin --><!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.4.2.Final</version></dependency><!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.4.2.Final</version></dependency><!-- MapStruct end --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency><dependency><groupId>ma.glasnost.orika</groupId><artifactId>orika-core</artifactId><version>1.4.6</version></dependency><!--Dozer --><dependency><groupId>net.sf.dozer</groupId><artifactId>dozer-spring</artifactId><version>5.5.1</version></dependency><dependency><groupId>net.sf.dozer</groupId><artifactId>dozer</artifactId><version>5.5.1</version></dependency><dependency><groupId>org.modelmapper</groupId><artifactId>modelmapper</artifactId><version>1.1.0</version></dependency><dependency><groupId>com.googlecode.jmapper-framework</groupId><artifactId>jmapper-core</artifactId><version>1.6.1.CR2</version></dependency><!-- http://modelmapper.org/getting-started/--><dependency><groupId>org.modelmapper</groupId><artifactId>modelmapper</artifactId><version>2.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 IAssembler<SOURCE, TARGET> {TARGET sourceToTarget(SOURCE var);}

Apache BeanUtils

@Component
public class ApacheCopyPropertiesAssembler implements IAssembler<UserVO, 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 IAssembler<UserVO, 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 IAssembler<UserVO, UserDTO> {@Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO = new UserDTO();BeanUtil.copyProperties(var, userDTO);return userDTO;}
}

bean-mapping-asm

@Component
public class BeanMappingASMAssembler implements IAssembler<UserVO, UserDTO> {@Overridepublic UserDTO sourceToTarget(UserVO var) {UserDTO userDTO = new UserDTO();AsmBeanUtil.copyProperties(var, userDTO);return userDTO;}
}

Dozer

@Component
public class DozerAssembler implements IAssembler<UserVO, 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 IAssembler<UserVO, 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 IAssembler<UserVO, UserDTO> {@Overridepublic UserDTO sourceToTarget(UserVO var) {JMapper<UserDTO, 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 IAssembler<UserVO, UserDTO> {@Overridepublic UserDTO sourceToTarget(UserVO var) {String strJson = JSON.toJSONString(var);return JSON.parseObject(strJson, UserDTO.class);}
}

MapStruct(推荐)

@MapperConfig
public interface IMapping<SOURCE, 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")List<TARGET> sourceToTarget(List<SOURCE> var1);/*** 反向,映射同名属性,集合形式*/@InheritConfiguration(name = "targetToSource")List<SOURCE> targetToSource(List<TARGET> var1);/*** 映射同名属性,集合流形式*/List<TARGET> sourceToTarget(Stream<SOURCE> stream);/*** 反向,映射同名属性,集合流形式*/List<SOURCE> targetToSource(Stream<TARGET> stream);}
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE)
public interface UserDTOMapping extends IMapping<UserVO, UserDTO> {/** 用于测试的单例 */IMapping<UserVO, 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 IAssembler<UserVO, UserDTO> {@Resourceprivate IMapping<UserVO, UserDTO> userDTOMapping;@Overridepublic UserDTO sourceToTarget(UserVO var) {return userDTOMapping.sourceToTarget(var);}}

ModelMapper

@Component
public class ModelMapperAssembler implements IAssembler<UserVO, UserDTO> {private static ModelMapper modelMapper = new ModelMapper();static {modelMapper.addMappings(new PropertyMap<UserVO, 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 IAssembler<UserVO, 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 IAssembler<UserVO, 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 IAssembler<UserVO, UserDTO> apacheCopyPropertiesAssembler;@Resource(name = "beanCopierAssembler")private IAssembler<UserVO, UserDTO> beanCopierAssembler;@Resource(name = "beanMappingAssembler")private IAssembler<UserVO, UserDTO> beanMappingAssembler;@Resource(name = "beanMappingASMAssembler")private IAssembler<UserVO, UserDTO> beanMappingASMAssembler;@Resource(name = "getSetAssembler")private IAssembler<UserVO, UserDTO> getSetAssembler;@Resource(name = "mapStructAssembler")private IAssembler<UserVO, UserDTO> mapStructAssembler;@Resource(name = "springCopyPropertiesAssembler")private IAssembler<UserVO, UserDTO> springCopyPropertiesAssembler;@Resource(name = "orikaAssembler")private IAssembler<UserVO, UserDTO> orikaAssembler;@Resource(name = "dozerAssembler")private IAssembler<UserVO, UserDTO> dozerAssembler;@Resource(name = "modelMapperAssembler")private IAssembler<UserVO, UserDTO> modelMapperAssembler;@Resource(name = "jMapperAssembler")private IAssembler<UserVO, UserDTO> jMapperAssembler;@Resource(name = "json2JsonAssembler")private IAssembler<UserVO, UserDTO> json2JsonAssembler;private Long cycleIndex=100000L;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}// 方法耗时:3ms@Testpublic 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一样。
  • 其他一些组件包主要基于 AOPASMCGlib,的技术手段实现的,所以也会有相应的性能损耗

http://www.hkea.cn/news/588846/

相关文章:

  • p2vr做的网站上传网络广告策划书范文
  • 2022年大连黄页优化搜索引擎营销
  • 宁波有几个区昭通网站seo
  • 建设企业网站方案网站优化软件哪个好
  • 郑州做网站要搜索引擎最新排名
  • wordpress建好站了打不开首页成都关键词优化排名
  • 京东网站开发需求如何做谷歌优化
  • 微信app开发诊断网站seo现状的方法
  • 做旅行网站网站seo优化多少钱
  • 上海专业网站建设咨询网络销售怎么样
  • 奶茶网页设计图片湖南seo网站多少钱
  • 家里电脑做网站服务器如何建立网址
  • 临西做网站哪里便宜seo专业培训课程
  • 高端网站设计报价表个人网上卖货的平台
  • 广州网站优化推广公司网站优化排名资源
  • 济南网站建设大标网络企业seo服务
  • net域名大网站东莞关键词自动排名
  • 做企业平台的网站怎样进行网络营销吸引顾客
  • 天河网站 建设seo信科分公司谷歌搜索引擎网址
  • 西安网站建设招骋外贸如何推广
  • 网站改版降权武汉seo排名公司
  • 南京哪家公司做企业网站 做得比较好百度seo怎么优化
  • 白云做网站SEO市场营销策略有哪些
  • 做网站用lunx怎么建立一个网站
  • 电商网站开发定制百度推广优化排名
  • 网站备案 法人身份证cba最新消息
  • 做公司网站需要什么手续厦门seo网站优化
  • 合肥本地网站网站关键词公司
  • 武汉电商网站建设seopc流量排行榜企业
  • 如何给给公司建立网站seo商学院