Spring中的BeanUtils与apache commons中的BeanUtils用法[1]
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]的更多相关文章
- java中反向转义org.apache.commons.lang3.StringEscapeUtils.unescapeJava
工具类中包含类反向转义的方法: eorderHistory.setSubPrintTemplates(StringEscapeUtils.unescapeJava(eorderHistory.getS ...
- windows系统下的maven项目放到linux系统中运行时报org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnection这种异常的解决办法
这个错误的解决办法其实很简单你把连接mysql数据库的那个jar包换成linux版本的就行了: linux版本的连接mysql数据库的jar包链接:http://files.cnblogs.com/f ...
- Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)
前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUt ...
- 编写更少量的代码:使用apache commons工具类库
Commons-configuration Commons-FileUpload Commons DbUtils Commons BeanUtils Commons CLI Commo ...
- class"org.apache.commons.dbcp.BasicDataSource"not found出错的解决办法
法1:在项目上右击build path->configure build path..->add library..->MyEclipse Libraries选中Spring 2.0 ...
- IO与文件读写---使用Apache commons IO包提高读写效率
觉得很不错,就转载了, 作者: Paul Lin 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解:Commons IO is a library of ...
- org.apache.commons.lang.StringUtils中常用的方法
org.apache.commons.lang.StringUtils中常用的方法,这里主要列举String中没有,且比较有用的方法: 1. 检查字符串是否为空: static boolean isB ...
- org.apache.commons.lang.StringUtils 中 Join 函数
转自 http://my.oschina.net/zenglingfan/blog/134872 写代码的时候,经常会碰到需要把一个List中的每个元素,按逗号分隔转成字符串的需求,以前是自己写一段比 ...
- org.apache.commons.lang3.tuple.Pair 作为更新参数,XML 中的 Sql 取不到值、报错
项目用的 Mybatis,今天改一个需求,落地实现是批量更新,且只需要根据主键(id)来更新一个字段(name). 于是,没有犹豫,像下面这样设计了数据结构: 既然是批量更新,那外层肯定是 List ...
随机推荐
- string.Format 格式化时间,货币
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- Linux删除文件后空间没有释放
.COMMAND默认以9个字符长度显示的命令名称.可使用+c参数指定显示的宽度,若+c后跟的参数为零,则显示命令的全名.PID:进程的ID号.PPID父进程的IP号,默认不显示,当使用-R参数可打开. ...
- Vim+Ctags+Taglist组合:
Ctags 1,sudo apt-get install Ctags //会提示最新版本的名字:Exuberant Ctags 2,在源码的最上层目录执行:ctags -R //会在当前目录先生成一个 ...
- linux中备份mysql数据库的一个shell脚本
#!/bin/bash #FileName:select_into_bak.sh #Desc:Use select into outfile to backup db or tables #Creat ...
- Filling a Path 模式
Filling a Path When you fill the current path, Quartz acts as if each subpath contained in the path ...
- ora-0000 normal跟/etc/hosts有关
当hosts文件配置错误时,用sqlplus登录后startup nomount,就会报错ORA-00000 [oracle11g@testdb2 dbs]$ sqlplus "/ as s ...
- 剑指offer-第二章排序之年龄排序
题目:对某个公司的人的年龄(0-99)进行排序,该公司的总人数为几万人.要求时间复杂度为O(n),可以辅助O(n)的空间. 思路:实现函数为void SortAge(int ages[],int le ...
- Aspose.Cells 读取Excel数据到DataTable
C#代码: Workbook workbook = new Workbook(); workbook.Open(excelfile); Cells cells = workbook.Worksheet ...
- socket 基础知识
PHP使用Berkley的socket库来创建它的连接.socket只不过是一个数据结构.你使用这个socket数据结构去开始一个客户端和服务器之间的会话.这个服务器是一直在监听准备产生一个新的会话. ...
- js四舍五入
7-13 向上取整ceil() 7-14 向下取整floor() 7-15 四舍五入round() 7-16 随机数 random()