选择Cglib的BeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况下。
1、简单例子,pom.xml
<!-- cglib的BeanCopier需要的依赖 -->
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-commons</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-util</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2.2</version>
</dependency>
2、工具类例子
import java.util.HashMap;
import java.util.Map;
import net.sf.cglib.beans.BeanCopier;
/**
* BeanCopier工具类
* @author
*
*/
public class BeanCopierUtils {
/**
* BeanCopier缓存
*/
public static Map<String, BeanCopier> beanCopierCacheMap = new HashMap<String, BeanCopier>();
/**
* 将source对象的属性拷贝到target对象中去
* @param source source对象
* @param target target对象
*/
public static void copyProperties(Object source, Object target){
String cacheKey = source.getClass().toString() +
target.getClass().toString();
BeanCopier beanCopier = null;
if (!beanCopierCacheMap.containsKey(cacheKey)) {
synchronized(BeanCopierUtils.class) {
if (!beanCopierCacheMap.containsKey(cacheKey)) {
beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
beanCopierCacheMap.put(cacheKey, beanCopier);
}
}
} else {
beanCopier = beanCopierCacheMap.get(cacheKey);
}
beanCopier.copy(source, target, null);
}
}
3、bean对象中clone方法
/**
* 克隆方法
* @param clazz 目标Class对象
* @return 克隆后的对象
*/
public <T> T clone(Class<T> clazz) {
T target = null;
try {
target = clazz.newInstance();
} catch (Exception e) {
logger.error("error", e);
}
BeanCopierUtils.copyProperties(this, target);
return target;
}