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 ...
随机推荐
- CSS 滤镜(IE浏览器专属其他浏览器不支持)
Filter 属性介绍: 设置或检索对象所应用的滤镜或滤镜集合.此属性仅作用于有布局的对象,如块对象.内联要素要使用该属性,必须先设定对象的 height 或 width 属性,或者设定 positi ...
- UVa 122 (二叉树的层次遍历) Trees on the level
题意: 输入一颗二叉树,按照(左右左右, 节点的值)的格式.然后从上到下从左到右依次输出各个节点的值,如果一个节点没有赋值或者多次赋值,则输出“not complete” 一.指针方式实现二叉树 首先 ...
- HDU 2159 FATE【二维完全背包】
题意:xhd玩游戏,还需要n个经验值升级,还留有m的忍耐度,但是他最多打s只怪,给出k个怪的经验值a[i],以及消耗的忍耐度b[i],问xhd能不能升级-- 因为有两个限定,忍耐度,和最多打s只怪(即 ...
- UISlide
UISlide属性 1. minimumValue : 当值可以改变时,滑块可以滑动到最小位置的值,默认为0.0 _slider.minimumValue = 10.0; 2. maxi ...
- JVM——垃圾收集器
概念补充 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用 ...
- 【转】Linux设备驱动之I/O端口与I/O内存
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/08/2281367.html 一.统一编址与独立编址 该部分来自于:http://blog.ch ...
- Android Studio 小技巧合集
本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本文将这62 ...
- 树莓派 不稳定 ssh经常断 解决
确保供电没问题,供电至少要0.7A,如果USB口有接东西就要更多 几个提高树莓派网络稳定性的方法 TroubleShooting(推荐!好多问题的解决方案) 设置树莓派SSH连接因超时闲置断开 树莓派 ...
- iostat的深入理解
问题背景 iostat -xdm 1 通常用来查看机器磁盘IO的性能. 我们一般会有个经验值,比如,ioutil要小于80%, svctm要小于2ms. 前几天碰到一个奇怪的现象:有一台SSD机器,磁 ...
- [Papers]NSE, $u$, Lorentz space [Bjorland-Vasseur, JMFM, 2011]
$$\bex \int_0^T\frac{\sen{\bbu}_{L^{q,\infty}}^p}{\ve+\ln \sex{e+\sen{\bbu}_{L^\infty}}}\rd s<\in ...