1. 前言

在开发过程中,经常遇到把要给一个bean的属性赋给另外一个bean。最笨的方法是每个属性都单独写一个,聪明的方法是应用反射写一个工具方法。考虑到这个需求基本每个程序员都会遇到,那么一定已经有人完成了类似的代码。搜一下,发现了Spring和apache commons都提供了这个方法,并且二者之间有点不同。在这里记录一下这个两个类的基本用法以及二者的区别。不过,除了这两个类,应该还有很多类似的类都提供了此功能。

BeanUtils默认有好多方法,这篇主要描述copyProperties这个方法。

2. bean的定义

首先定义两个bean。

public class BeanA {
private String name1;
private String name2;
private List<String> nameList; public String getName1() {
return name1;
}
public void setName1(String name1) {
this.name1 = name1;
}
public String getName2() {
return name2;
}
public void setName2(String name2) {
this.name2 = name2;
}
public List<String> getNameList() {
return nameList;
}
public void setNameList(List<String> nameList) {
this.nameList = nameList;
}
} public class BeanB {
private String name1;
private String name2;
private List<String> nameList;
public String getName1() {
return name1;
}
public void setName1(String name1) {
this.name1 = name1;
}
public String getName2() {
return name2;
}
public void setName2(String name2) {
this.name2 = name2;
}
public List<String> getNameList() {
return nameList;
}
public void setNameList(List<String> nameList) {
this.nameList = nameList;
}
}

3. 基本的赋值

两个工具类都提供了copyProperties的方法,满足对象复制的需求,其用法如下所示。

    public static void springTest1() {
BeanA ba = new BeanA();
BeanB bb = new BeanB();
ba.setName1("ba-name1");
ba.setName2("ba-name2");
org.springframework.beans.BeanUtils.copyProperties(ba, bb);
System.out.println(bb.getName1());
System.out.println(bb.getName2());
} public static void apacheTest1() {
BeanA ba = new BeanA();
BeanB bb = new BeanB();
ba.setName1("ba-name1");
ba.setName2("ba-name2");
try {
org.apache.commons.beanutils.BeanUtils.copyProperties(bb, ba);
} catch (Throwable t) {
}
System.out.println(bb.getName1());
System.out.println(bb.getName2());
}

需要注意的地方是,二者调用参数的顺序是相反的。

4. 只部分赋值

在对象间相互复制的时候,经常有只给部分字段赋值的需求。spring和apache commons用两种方式实现了这个需求。

spring的方式是可以设置ignore的property,可以有多个property;apache commons的做法是可以给某一个属性赋值。

    public static void springTest2() {
BeanA ba = new BeanA();
BeanB bb = new BeanB();
ba.setName1("ba-name1");
ba.setName2("ba-name2");
bb.setName1("bb-name1");
org.springframework.beans.BeanUtils.copyProperties(ba, bb, "name1");
System.out.println(bb.getName1());
System.out.println(bb.getName2());
} public static void apacheTest2() {
BeanA ba = new BeanA();
BeanB bb = new BeanB();
ba.setName1("ba-name1");
ba.setName2("ba-name2");
bb.setName1("bb-name1");
bb.setName2("bb-name2");
try {
org.apache.commons.beanutils.BeanUtils.copyProperty(bb, "name1", ba);
} catch (Throwable t) {
}
System.out.println(bb.getName1());
System.out.println(bb.getName2());
}

5. 关于引用类型

对于引用类型,二者都是修改引用地址。也就是说,如果修改了源对象里面的引用,则目标对象也会相应进行修改。

    public static void springTest3() {
BeanA ba = new BeanA();
BeanB bb = new BeanB();
List<String> list = new ArrayList<String>();
list.add("list-a-1");
ba.setNameList(list);
org.springframework.beans.BeanUtils.copyProperties(ba, bb);
list.add("list-a-2");
System.out.println(bb.getNameList().size());
} public static void apacheTest3() {
BeanA ba = new BeanA();
BeanB bb = new BeanB();
List<String> list = new ArrayList<String>();
list.add("list-a-1");
ba.setNameList(list);
try {
org.apache.commons.beanutils.BeanUtils.copyProperties(bb, ba);
} catch (Throwable t) {
}
list.add("list-a-2");
System.out.println(bb.getNameList().size());
}

输出

2
2

6.需要注意的地方

使用BeanUtils的成本惊人地昂贵。人做了一个简单的测试,BeanUtils所花费的时间要超过取数 据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。

[这条我没有测试过]

7.参考

Spring 中的BeanUtils与apache中的BeanUtils用法与比较

spring的BeanUtils.copyProperties用法

Spring中的BeanUtils与apache commons中的BeanUtils用法[1]的更多相关文章

  1. java中反向转义org.apache.commons.lang3.StringEscapeUtils.unescapeJava

    工具类中包含类反向转义的方法: eorderHistory.setSubPrintTemplates(StringEscapeUtils.unescapeJava(eorderHistory.getS ...

  2. windows系统下的maven项目放到linux系统中运行时报org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnection这种异常的解决办法

    这个错误的解决办法其实很简单你把连接mysql数据库的那个jar包换成linux版本的就行了: linux版本的连接mysql数据库的jar包链接:http://files.cnblogs.com/f ...

  3. Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

    前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUt ...

  4. 编写更少量的代码:使用apache commons工具类库

    Commons-configuration   Commons-FileUpload   Commons DbUtils   Commons BeanUtils  Commons CLI  Commo ...

  5. class"org.apache.commons.dbcp.BasicDataSource"not found出错的解决办法

    法1:在项目上右击build path->configure build path..->add library..->MyEclipse Libraries选中Spring 2.0 ...

  6. IO与文件读写---使用Apache commons IO包提高读写效率

    觉得很不错,就转载了, 作者: Paul Lin 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解:Commons IO is a library of ...

  7. org.apache.commons.lang.StringUtils中常用的方法

    org.apache.commons.lang.StringUtils中常用的方法,这里主要列举String中没有,且比较有用的方法: 1. 检查字符串是否为空: static boolean isB ...

  8. org.apache.commons.lang.StringUtils 中 Join 函数

    转自 http://my.oschina.net/zenglingfan/blog/134872 写代码的时候,经常会碰到需要把一个List中的每个元素,按逗号分隔转成字符串的需求,以前是自己写一段比 ...

  9. org.apache.commons.lang3.tuple.Pair 作为更新参数,XML 中的 Sql 取不到值、报错

    项目用的 Mybatis,今天改一个需求,落地实现是批量更新,且只需要根据主键(id)来更新一个字段(name). 于是,没有犹豫,像下面这样设计了数据结构: 既然是批量更新,那外层肯定是 List ...

随机推荐

  1. js之dom_2

    动态脚本1 载入脚本文件 var s = document.createElement("script"); s.src = "test2.js"; s.typ ...

  2. Qt之国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)

    简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...

  3. poj 1195 mobile phone

    题目连接: 题意:要求设计这样一个数据结构,支持下列操作 1.add(x,y,a).对二维数组的第x行,第y列加上a. 2.sum(l,b,r,t).求所有满足l<=x<=r,b<= ...

  4. mongodb数据备份与还原

    1)简单数据的导出与导入导出:./mongoexport -d test -c users -o /tmp/users.out 导入:./mongoimport -d test -c users /t ...

  5. 20160126.CCPP体系详解(0005天)

    程序片段(01):eatmem.c 内容概要:语句和逻辑结构 #include <stdio.h> #include <stdlib.h> #include <Windo ...

  6. RAC 环境下参数文件(spfile)管理

    RAC环境下,初始化参数文件与但实例下参数文件有些异同,主要表现在初始化参数可以为多个实例公用,也可以单独设置各个实例的初始化参数.对于那些非共用的初始化参数则必须要单独设置,而共用的则可以单独设置, ...

  7. JS模块化编程之AMD规范(转)

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...

  8. 虚拟机VMware tools作用以及其安装

    虚拟机VMware tools的作用(1). 更新虚拟机中的显卡驱动, 使虚拟机中的XWindows可以运行在SVGA模式下.在客户操作系统中安装Mware Tools非常重要.如果不安装VMware ...

  9. js四舍五入

    7-13 向上取整ceil() 7-14 向下取整floor() 7-15 四舍五入round() 7-16 随机数 random()

  10. Excel的最大行数

    使用Excel2007或Excel2010,在“另存为” 菜单中可以选择为“Excel 07-2003 工作薄”,从中我们可以看出,到了2007版以后,存储格式变了,简单一点从扩展名便可以看出,一个是 ...