From 30f0bdc754cc1d85a72c5cb86b84ca20a67ef20c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Sat, 16 Apr 2022 14:08:11 +0800
Subject: [PATCH] =?UTF-8?q?update=20=E4=BD=BF=E7=94=A8=20spring=20cglib=20?=
=?UTF-8?q?=E6=9B=BF=E6=8D=A2=20=E5=81=9C=E6=AD=A2=E7=BB=B4=E6=8A=A4?=
=?UTF-8?q?=E7=9A=84=20cglib?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 7 --
ruoyi-common/pom.xml | 5 --
.../com/ruoyi/common/utils/BeanCopyUtils.java | 75 +++++++++++++++++--
3 files changed, 68 insertions(+), 19 deletions(-)
diff --git a/pom.xml b/pom.xml
index e28caf8a1..7592c0e03 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,6 @@
4.1.2
1.21
3.0.5
- 3.3.0
2.3
1.29.0
3.5.1
@@ -134,12 +133,6 @@
-
- cglib
- cglib
- ${cglib.version}
-
-
org.apache.velocity
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 81a983f99..c5fadf24c 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -69,11 +69,6 @@
easyexcel
-
- cglib
- cglib
-
-
org.yaml
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java
index 23ace00f9..ae8422230 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java
@@ -1,15 +1,20 @@
package com.ruoyi.common.utils;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.SimpleCache;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
-import cn.hutool.extra.cglib.CglibUtil;
+import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import net.sf.cglib.core.Converter;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.cglib.beans.BeanMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
/**
* bean深拷贝工具(基于 cglib 性能优异)
@@ -37,7 +42,8 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(desc)) {
return null;
}
- return CglibUtil.copy(source, desc);
+ final V target = ReflectUtil.newInstanceIfPossible(desc);
+ return copy(source, target);
}
/**
@@ -54,7 +60,8 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(desc)) {
return null;
}
- CglibUtil.copy(source, desc);
+ BeanCopier beanCopier = BeanCopierCache.INSTANCE.get(source.getClass(), desc.getClass(), null);
+ beanCopier.copy(source, desc, null);
return desc;
}
@@ -72,7 +79,11 @@ public class BeanCopyUtils {
if (CollUtil.isEmpty(sourceList)) {
return CollUtil.newArrayList();
}
- return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc));
+ return sourceList.stream().map(source -> {
+ V target = ReflectUtil.newInstanceIfPossible(desc);
+ copy(source, target);
+ return target;
+ }).collect(Collectors.toList());
}
/**
@@ -81,11 +92,12 @@ public class BeanCopyUtils {
* @param bean 数据来源实体
* @return map对象
*/
+ @SuppressWarnings("unchecked")
public static Map copyToMap(T bean) {
if (ObjectUtil.isNull(bean)) {
return null;
}
- return CglibUtil.toMap(bean);
+ return BeanMap.create(bean);
}
/**
@@ -102,7 +114,8 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(beanClass)) {
return null;
}
- return CglibUtil.toBean(map, beanClass);
+ T bean = ReflectUtil.newInstanceIfPossible(beanClass);
+ return mapToBean(map, bean);
}
/**
@@ -119,6 +132,54 @@ public class BeanCopyUtils {
if (ObjectUtil.isNull(bean)) {
return null;
}
- return CglibUtil.fillBean(map, bean);
+ BeanMap.create(bean).putAll(map);
+ return bean;
}
+
+ /**
+ * BeanCopier属性缓存
+ * 缓存用于防止多次反射造成的性能问题
+ *
+ * @author Looly
+ * @since 5.4.1
+ */
+ public enum BeanCopierCache {
+ /**
+ * BeanCopier属性缓存单例
+ */
+ INSTANCE;
+
+ private final SimpleCache cache = new SimpleCache<>();
+
+ /**
+ * 获得类与转换器生成的key在{@link BeanCopier}的Map中对应的元素
+ *
+ * @param srcClass 源Bean的类
+ * @param targetClass 目标Bean的类
+ * @param converter 转换器
+ * @return Map中对应的BeanCopier
+ */
+ public BeanCopier get(Class> srcClass, Class> targetClass, Converter converter) {
+ final String key = genKey(srcClass, targetClass, converter);
+ return cache.get(key, () -> BeanCopier.create(srcClass, targetClass, converter != null));
+ }
+
+ /**
+ * 获得类与转换器生成的key
+ *
+ * @param srcClass 源Bean的类
+ * @param targetClass 目标Bean的类
+ * @param converter 转换器
+ * @return 属性名和Map映射的key
+ */
+ private String genKey(Class> srcClass, Class> targetClass, Converter converter) {
+ final StringBuilder key = StrUtil.builder()
+ .append(srcClass.getName()).append('#').append(targetClass.getName());
+ if(null != converter){
+ key.append('#').append(converter.getClass().getName());
+ }
+ return key.toString();
+ }
+ }
+
}