Orika背景介绍
Orika是java Bean映射框架,可以实现从一个对象递归拷贝数据至另一个对象。在开发多层应用程序中非常有用。在这些层之间交换数据时,通常为了适应不同API需要转换一个实例至另一个实例。
有很多方法可以实现:硬代码拷贝或Dozer实现bean映射等。总之,需要简化不同层对象之间映射过程。
Orika使用字节码生成器创建开销最小的快速映射,比其他基于反射方式实现(如,Dozer)更快。之前使用Bean Copy 性能非常慢,发现在这个领域业界还是有很多新秀的。 Orika 应该就算一个比较好的吧。
优势
1. 性能
大概是Dozer的8-10 倍, 这个上面的已经做了描述
2. 内存消耗
大概是Dozer内存消耗的一半多点。 为什么做到这点的还没想清楚, 估计是因为运行期不需要维护复杂的Mapping 关系。 不需要大量的Mapping 关系查找以及需要的对这些查找优化所消耗的空间。
3. 简单
Orika的代码短小精悍, 而且可读性非常强, Dozer如果要加减一个功能, 不才完全没有信心, Orika 我还是可以偶尔在Orika里面打几个酱油的。
基础使用
Maven项目依赖包:POM文件直接依赖进去即可。
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.5.4</version>
</dependency>
工具类
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class BeanMapper {
private static MapperFacade mapper;
static {
DefaultMapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
mapper = mapperFactory.getMapperFacade();
}
/**
* 简单的复制出新类型对象
*
* @param source
* @param destinationClass
* @param <S>
* @param <D>
* @return
*/
public static <S, D> D map(S source, Class<D> destinationClass) {
return mapper.map(source, destinationClass);
}
/**
* 简单的复制出新对象 ArrayList
*
* @param sourceList
* @param destinationClass
* @param <S>
* @param <D>
* @return
*/
public static <S, D> List<D> mapList(Iterable<S> sourceList, Class<D> destinationClass) {
ArrayList<D> destinationList = new ArrayList<>();
for (S source : sourceList) {
if (source != null) {
destinationList.add(map(source, destinationClass));
}
}
return destinationList;
}
private static <D> D[] newArray(Class<D> destinationClass, int length) {
return (D[]) Array.newInstance(destinationClass, length);
}
/**
* 简单复制出新对象数组
*
* @param sourceArray
* @param destinationClass
* @param <S>
* @param <D>
* @return
*/
public static <S, D> D[] mapArray(final S[] sourceArray, final Class<D> destinationClass) {
D[] destinationArray = newArray(destinationClass, sourceArray.length);
int i = 0;
for (S source : sourceArray) {
if (source != null) {
destinationArray[i] = map(sourceArray[i], destinationClass);
i++;
}
}
return destinationArray;
}
}