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. Windows 7 32位上硬盘安装linux[ubuntu13.04] 双系统

    本内容介绍如何在window7上安装ubuntu双系统 一.准备工具 1. EasyBCD : 用来制作引导菜单选项 2.Wingrub : 用来确定磁盘文件Linux表示法位置 3.分区助手 :用来 ...

  2. mysql JDBC URL格式各个参数详解

    mysql JDBC URL格式如下: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值 ...

  3. Android Studio插件

    awesome-android-ui(UI范例库) https://github.com/wasabeef/awesome-android-ui/tree/master/pages LMBanners ...

  4. shockwave flash has crashed(Flash 插件崩溃导致页面中的flash不显示)怎么办

    1.原理: 应该电脑里最近装了chorme或者基于chorme内核的浏览器.越来越多的人开始使用chrome的浏览器,很多用户都遇到过flash崩溃的问题,有时候重启chrome可以解决,有时候会导致 ...

  5. Singleton模式写法

    public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ ...

  6. 【英语】Bingo口语笔记(57) - 常见的口语弱读

  7. LeetCode——Add Two Numbers

    Question:You are given two linked lists representing two non-negative numbers. The digits are stored ...

  8. Linux/Unix shell 自动发送AWR report

    观察Oracle数据库性能,Oracle自带的awr 功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告.不过awrrpt.sql脚本执行时需要我们提供一些交互信 ...

  9. 查看MySQL的警告信息

    在王MySQL数据库导入数据的时候经常会出现警告,这些警告很容易被忽视,今天到数据的时候突然想看看警告的内容是什么,百度了一下mysql查看警告的命令 show warnings; 命令很简明,一查看 ...

  10. web开发利器 fiddler

    http://mccxj.github.io/blog/20130531_introduce-to-fiddler.html