两者比较:
class | BeanCopier | BeanUtils |
---|---|---|
原理 | 基于cglib字节码增强,是在生成的class文件上进行增强 | 基于反射 |
性能 | 性能最好 | 性能一般 |
自定义功能 | 提供自定义转换器,控制哪些类型的字段需要转换、转成成什么类型 | 提供拷贝时忽略某个字段的功能 |
样例:
BeanCopier
beanCopier = org.springframework.cglib.beans.BeanCopier.create(source.getClass(), target.getClass(), true);
beanCopier.copy(source, target, getConverter())
// 有时候前端传过来的数据是Map、LocalDateTime类型,我要转成domain再插入数据,数据库对应的字段有可能是String类型
// 那我就可以定义Instant和LocalDateTime的互转,也可以定义Map等自动序列化成String
private static Converter getConverter() {
return (source, target, o1) -> {
if ((source instanceof Instant) && (target.isAssignableFrom(LocalDateTime.class))) {
return LocalDateTime.ofInstant((Instant) source, ZoneId.systemDefault());
} else if ((source instanceof LocalDateTime) && (target.isAssignableFrom(Instant.class))) {
return ((LocalDateTime) source).toInstant(ZoneOffset.UTC);
} else if ((source instanceof Map || source instanceof List) && (target.isAssignableFrom(String.class))) {
return JacksonUtils.toJSONString(source);
} else {
return source;
}
};
}
BeanUtils
// 我在进行拷贝对象时忽略id字段的拷贝
org.springframework.beans.BeanUtils.copyProperties(source, target, "id");
需要注意的是:
对于字段名称与类型完全一样时,两者无区别。
对于字段名称相同,但是类型不一样(如int <=> Integer)时,BeanUtils拷贝,而BeanCopier不拷贝。
一般来说,我的项目都会使用BeanCopier。