import org.springframework.cglib.beans.BeanCopier;标签:beanCopier,cacheKey,target,BeanCopierUtil,beanCopierCacheMap,source,复制,BeanCopie From: https://blog.51cto.com/u_4981212/5790937
import java.util.HashMap;
import java.util.Map;
/**
* BeanCopier工具类
* @author
*
*/
public class BeanCopierUtil {
/**
* BeanCopier缓存
*/
public static Map<String, BeanCopier> beanCopierCacheMap = new HashMap<String, BeanCopier>();
/**
* 将source对象的属性拷贝到target对象中去
* @param source source对象
* @param target target对象
*/
public static void copy(Object source, Object target){
String cacheKey = genKey(source.getClass(), target.getClass());
BeanCopier beanCopier = null;
// 线程1和线程2,同时过来了
if (!beanCopierCacheMap.containsKey(cacheKey)) {
synchronized(BeanCopierUtil.class) {
if(!beanCopierCacheMap.containsKey(cacheKey)) {
// 进入到这里会创建一个BeanCopier实例并且放在缓存map中
beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
beanCopierCacheMap.put(cacheKey, beanCopier);
} else {
beanCopier = beanCopierCacheMap.get(cacheKey);
}
}
} else {
beanCopier = beanCopierCacheMap.get(cacheKey);
}
beanCopier.copy(source, target, null);
}
/**
* 生成key
*
* @param srcClazz 源文件的class
* @param tgtClazz 目标文件的class
* @return string
*/
private static String genKey(Class<?> srcClazz, Class<?> tgtClazz) {
return srcClazz.getName() + tgtClazz.getName();
}
}