Bean-Mapping

日常开发中经常需要将一个对象的属性,赋值到另一个对象中。

常见的工具有很多,但都多少不够简洁,要么不够强大。

我们经常使用的 Spring BeanUtils 性能较好,但是特性不足。

Bean-Mapping 提供了很多丰富的特性,便于日常开发。

如果你追求更加极致的性能,可以考虑使用 asm 实现的模块,该实现性能优于 spring BeanUtils 35% 左右。

特性

  • 支持对象属性的浅拷贝

  • 支持不同名称字段的指定赋值

  • 支持自定义字段属性赋值的条件,比如目标字段不为 null 才进行赋值

  • 支持自定义字段值转换,可以转换为其他类型,或者相同类型

  • 支持属性字段为【对象】【集合】【数组】的赋值,对象赋值更加方便。

  • 支持基于 asm 实现的高性能复制

快速开始

准备

JDK1.7 及其以上版本

Maven 3.X 及其以上版本

maven 项目依赖

<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>bean-mapping-core</artifactId>
<version>0.2.5</version>
</dependency>

核心类说明

BeanUtil

提供一个简单的静态方法 copyProperties。

/**
* 复制属性
* 将 source 中的赋值给 target 中名称相同,且可以赋值的类型中去。类似于 spring 的 BeanUtils。
* @param source 原始对象
* @param target 目标对象
*/
public static void copyProperties(final Object source, Object target)

测试代码参考

详情参见 bean-mapping-test 模块下的测试代码。

示例代码

对象的定义

  • BaseSource.java & BaseTarget.java

其中 BaseSource 对象和 BaseTarget 对象的属性是相同的。

public class BaseSource {

    /**
* 名称
*/
private String name; /**
* 年龄
*/
private int age; /**
* 生日
*/
private Date birthday; /**
* 字符串列表
*/
private List<String> stringList; //getter & setter
}

属性赋值测试案例

我们构建 BaseSource 的属性,然后调用

BeanUtil.copyProperties(baseSource, baseTarget);

类似于 spring BeanUtils 和 Apache BeanUtils,并验证结果符合我们的预期。

    /**
* 基础测试
*/
@Test
public void baseTest() {
BaseSource baseSource = buildBaseSource();
BaseTarget baseTarget = new BaseTarget();
BeanUtil.copyProperties(baseSource, baseTarget); // 断言赋值后的属性和原来相同
Assertions.assertEquals(baseSource.getAge(), baseTarget.getAge());
Assertions.assertEquals(baseSource.getName(), baseTarget.getName());
Assertions.assertEquals(baseSource.getBirthday(), baseTarget.getBirthday());
Assertions.assertEquals(baseSource.getStringList(), baseTarget.getStringList());
} /**
* 构建用户信息
* @return 用户
*/
private BaseSource buildBaseSource() {
BaseSource baseSource = new BaseSource();
baseSource.setAge(10);
baseSource.setName("映射测试");
baseSource.setBirthday(new Date());
baseSource.setStringList(Arrays.asList("1", "2"));
return baseSource;
}

asm 复制

简介

有时候我们对于性能要求较高,而对便利性要求没有这么高。

本框架也提供了基于 asm 的复制方式,性能比 spring 好 35% 左右。

见文末的 benchmark。

maven 引入

<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>bean-mapping-asm</artifactId>
<version>0.2.5</version>
</dependency>

测试代码

和 BeanUtil#copyProperties(Object, Object) 使用类似,但是暂时不支持注解等更加丰富的功能。

BaseSource baseSource = buildBaseSource();
BaseTarget baseTarget = new BaseTarget();
AsmBeanUtil.copyProperties(baseSource, baseTarget);

拓展阅读

实际工作中,我们遇到的情况会比这个复杂一些。

比如两个字段名称不同,我们也想进行赋值,值得处理转换等等。

深入学习

Bean-Mapping 相关文档:

01-项目模块简介和预期功能

02-BeanMapping 注解的引入

03-不同名称字段的指定赋值

04-自定义赋值生效的条件

05-自定义字段转换实现

06-支持属性字段为【对象】【集合】【数组】的赋值

07-BeanUtil#copyProperties(Object, Class) 方法

性能

对比图

可见框架默认 bean-mapping 实现性能一般,涉及到了太多的特性,导致复制性能略低于 spring。

基于 reflectasm 实现的 asm-bean-mapping 的性能高于 spring。

代码示例参见 BeanUtilBeanchmarkTest.java

展望

相对 BeanCopier 这种实现方式,我们的实现方式性能还是有很大提升空间。

后期可以考虑实现类似 BeanCopier 的方式。

开源地址

这个框架的源代码全部开源,也便于我们学习。

Bean-Mapping

基于 asm 实现比 spring BeanUtils 性能更好的属性拷贝框架的更多相关文章

  1. Apache BeanUtils与Spring BeanUtils性能比较

    在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性 ...

  2. Bean映射工具之Apache BeanUtils VS Spring BeanUtils

    背景 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...

  3. 基于 Annotation 拦截的 Spring AOP 权限验证方法

    基于 Annotation 拦截的 Spring AOP 权限验证方法 转自:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilte ...

  4. Spring Boot 性能优化

    spring 框架给企业软件开发者提供了常见问题的通用解决方案,包括那些在未来开发中没有意识到的问题.但是,它构建的 J2EE 项目变得越来越臃肿,逐渐被 Spring Boot 所替代.Spring ...

  5. Tair LDB基于Prefixkey中期范围内查找性能优化项目总结

    "Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...

  6. 基于VS Code创建Spring Boot项目开发REST API(一)

    公司从.NET转向Java不仅仅是简单的代码变成Java,趁此机会对原有的架构和代码重构,融入新的概念和技术.目前通过前后端分离,将后端更多的微服务化.从.NET转向Java我们更多的是用Java开发 ...

  7. 基于SSD固态硬盘的数据库性能优化

    基于SSD固态硬盘的数据库性能优化 2010-11-08 00:0051cto佚名   关键字:固态硬盘 数据库管理 SSD 企业软件热点文章 Java内存结构与模型结构分析 Oracle触发器的语法 ...

  8. SqlHelper发布——比你期望的还要多的多(例如比MyBatis-Pagehelper性能更高)

    SqlHelper发布——比Mybatis-PageHelper性能更高 起源 前段时间开启了一个新的项目,在选择分页插件时,发现github上很流行的一个是pagehelper,在百度上搜索了一下, ...

  9. 异步IO比同步阻塞IO性能更好吗?为什么?

    最近在看node.js, 介绍中提到node是异步io的方式实现, 性能比同步阻塞io的更好. 对于一个request而言, 如果我们依赖io的结果, 异步io和同步阻塞io都是要等到io完成才能继续 ...

随机推荐

  1. Nebula 架构剖析系列(二)图数据库的查询引擎设计

    摘要 上文(存储篇)说到数据库重要的两部分为存储和计算,本篇内容为你解读图数据库 Nebula 在查询引擎 Query Engine 方面的设计实践. 在 Nebula 中,Query Engine ...

  2. poj 3281 Dining (Dinic)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22572   Accepted: 10015 Descript ...

  3. php5.6开启curl

    1.   打开php安装目录,打开ext目录,是否有php_curl.dll扩展文件,如果没有该扩展文件,请在网上下载此文件. 2.   打开php.ini,找到  ;extension=php_cu ...

  4. ZeroC ICE中的对象模型和概念

    Ice对象的模型和概念. Ice Object并非是我们的接口实现类的实例对象.我们的接口实现类的实例对象只是充当Ice Object的Servant的角色.一个Ice Object可以有众多Serv ...

  5. ASP.NET Core MVC+EF Core项目实战

    项目背景 本项目参考于<Pro Entity Framework Core 2 for ASP.NET Core MVC>一书,项目内容为party邀请答复. 新建项目 本项目开发工具为V ...

  6. Dart Learn Notes 04

    流程控制语句 流程控制语句的作用就是控制代码的执行流程. if and else var a = 10; if(a > 10){ print('ok'); }else if( 5 < a ...

  7. 【Luogu P2471】[SCOI2007]降雨量

    Luogu P2471 啊啊啊啊这真是一道史上最毒瘤的题目!!!!! 题意就是给出n个年份的降雨量 询问:"自从\(y\)年以来\(x\)年的降雨量最大"的正确性. 显然有多种情况 ...

  8. 题解——面积(area.cpp)

    题目来源&题面简述: 思路与算法选择: 只有*里面的部分对我们有用,所以可以将 *号外的部分标记一下. 可以用著名的BFS大法实现此过程.(连通块) 连通块模板: #include<bi ...

  9. [折腾笔记] 洛谷P1149-火柴棒等式 AC记

    原题链接: https://www.luogu.org/problem/P1149 题面简述: 给你n根火柴棍,你可以拼出多少个形如"A+B=C""A+B=C" ...

  10. Spring Data Jpa的四种查询方式

    一.调用接口的方式 1.基本介绍 通过调用接口里的方法查询,需要我们自定义的接口继承Spring Data Jpa规定的接口 public interface UserDao extends JpaR ...