Kaynağa Gözat

优化乐观锁反射缓存

Caratacus 6 yıl önce
ebeveyn
işleme
f05d0efb72

+ 22 - 9
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/ReflectionKit.java

@@ -15,17 +15,27 @@
  */
 package com.baomidou.mybatisplus.core.toolkit;
 
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toMap;
 
-import java.lang.reflect.*;
-import java.util.*;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Stream;
 
-import static java.util.function.Function.identity;
-import static java.util.stream.Collectors.toCollection;
-import static java.util.stream.Collectors.toMap;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
 
 /**
  * <p>
@@ -168,8 +178,8 @@ public class ReflectionKit {
      * @param clazz 反射类
      */
     public static List<Field> getFieldList(Class<?> clazz) {
-        if (null == clazz) {
-            return null;
+        if (Objects.isNull(clazz)) {
+            return Collections.emptyList();
         }
         List<Field> fields = classFieldCache.get(clazz);
         if (CollectionUtils.isEmpty(fields)) {
@@ -189,6 +199,9 @@ public class ReflectionKit {
      * @param clazz 反射类
      */
     public static List<Field> doGetFieldList(Class<?> clazz) {
+        if (Object.class.equals(clazz)) {
+            return Collections.emptyList();
+        }
         List<Field> fieldList = Stream.of(clazz.getDeclaredFields())
             /* 过滤静态属性 */
             .filter(field -> !Modifier.isStatic(field.getModifiers()))

+ 10 - 33
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/OptimisticLockerInterceptor.java

@@ -3,13 +3,13 @@ package com.baomidou.mybatisplus.extension.plugins;
 import java.lang.reflect.Field;
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.mapping.MappedStatement;
@@ -243,24 +243,10 @@ public class OptimisticLockerInterceptor implements Interceptor {
      * @return
      */
     private EntityField getVersionFieldRegular(Class<?> parameterClass, TableInfo tableInfo) {
-        if (parameterClass != Object.class) {
-            for (Field field : parameterClass.getDeclaredFields()) {
-                if (field.isAnnotationPresent(Version.class)) {
-                    field.setAccessible(true);
-                    String versionPropertyName = field.getName();
-                    String versionColumnName = null;
-                    for (TableFieldInfo fieldInfo : tableInfo.getFieldList()) {
-                        if (versionPropertyName.equals(fieldInfo.getProperty())) {
-                            versionColumnName = fieldInfo.getColumn();
-                        }
-                    }
-                    return new EntityField(field, true, versionColumnName);
-                }
-            }
-            // 递归父类
-            return this.getVersionFieldRegular(parameterClass.getSuperclass(), tableInfo);
-        }
-        return null;
+        return Object.class.equals(parameterClass) ? null : ReflectionKit.getFieldList(parameterClass).stream().filter(e -> e.isAnnotationPresent(Version.class)).map(field -> {
+            field.setAccessible(true);
+            return new EntityField(field, true, tableInfo.getFieldList().stream().filter(e -> field.getName().equals(e.getProperty())).map(TableFieldInfo::getColumn).findFirst().orElse(null));
+        }).findFirst().orElseGet(() -> this.getVersionFieldRegular(parameterClass.getSuperclass(), tableInfo));
     }
 
     /**
@@ -273,25 +259,16 @@ public class OptimisticLockerInterceptor implements Interceptor {
         if (entityFieldsCache.containsKey(parameterClass)) {
             return entityFieldsCache.get(parameterClass);
         }
-        List<EntityField> fields = this.getFieldsFromClazz(parameterClass, null);
+        List<EntityField> fields = this.getFieldsFromClazz(parameterClass);
         entityFieldsCache.put(parameterClass, fields);
         return fields;
     }
 
-    private List<EntityField> getFieldsFromClazz(Class<?> parameterClass, List<EntityField> fieldList) {
-        if (fieldList == null) {
-            fieldList = new ArrayList<>();
-        }
-        List<Field> fields = ReflectionKit.getFieldList(parameterClass);
-        for (Field field : fields) {
+    private List<EntityField> getFieldsFromClazz(Class<?> parameterClass) {
+        return ReflectionKit.getFieldList(parameterClass).stream().map(field -> {
             field.setAccessible(true);
-            if (field.isAnnotationPresent(Version.class)) {
-                fieldList.add(new EntityField(field, true));
-            } else {
-                fieldList.add(new EntityField(field, false));
-            }
-        }
-        return fieldList;
+            return field.isAnnotationPresent(Version.class) ? new EntityField(field, true) : new EntityField(field, false);
+        }).collect(Collectors.toList());
     }
 
     @Data