فهرست منبع

解决PluginUtils重复获取元数据带来的性能消耗.

https://github.com/baomidou/mybatis-plus/issues/3812
nieqiurong 1 سال پیش
والد
کامیت
5abbd4f831
1فایلهای تغییر یافته به همراه25 افزوده شده و 4 حذف شده
  1. 25 4
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/PluginUtils.java

+ 25 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/PluginUtils.java

@@ -21,6 +21,7 @@ import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.mapping.BoundSql;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.ParameterMapping;
+import org.apache.ibatis.reflection.DefaultReflectorFactory;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.session.Configuration;
@@ -38,6 +39,14 @@ import java.util.Map;
  * @since 2017-06-20
  */
 public abstract class PluginUtils {
+
+    /**
+     * 缓存内置的插件对象反射信息
+     *
+     * @since 3.5.3
+     */
+    public static final DefaultReflectorFactory DEFAULT_REFLECTOR_FACTORY = new DefaultReflectorFactory();
+
     public static final String DELEGATE_BOUNDSQL_SQL = "delegate.boundSql.sql";
 
     /**
@@ -46,12 +55,23 @@ public abstract class PluginUtils {
     @SuppressWarnings("unchecked")
     public static <T> T realTarget(Object target) {
         if (Proxy.isProxyClass(target.getClass())) {
-            MetaObject metaObject = SystemMetaObject.forObject(target);
+            MetaObject metaObject = getMetaObject(target);
             return realTarget(metaObject.getValue("h.target"));
         }
         return (T) target;
     }
 
+    /**
+     * 获取对象元数据信息
+     *
+     * @param object 参数
+     * @return 元数据信息
+     * @since 3.5.3
+     */
+    public static MetaObject getMetaObject(Object object) {
+        return MetaObject.forObject(object, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY);
+    }
+
     /**
      * 给 BoundSql 设置 additionalParameters
      *
@@ -68,8 +88,8 @@ public abstract class PluginUtils {
 
     public static MPStatementHandler mpStatementHandler(StatementHandler statementHandler) {
         statementHandler = realTarget(statementHandler);
-        MetaObject object = SystemMetaObject.forObject(statementHandler);
-        return new MPStatementHandler(SystemMetaObject.forObject(object.getValue("delegate")));
+        MetaObject object = getMetaObject(statementHandler);
+        return new MPStatementHandler(getMetaObject(object.getValue("delegate")));
     }
 
     /**
@@ -116,12 +136,13 @@ public abstract class PluginUtils {
      * {@link BoundSql}
      */
     public static class MPBoundSql {
+
         private final MetaObject boundSql;
         private final BoundSql delegate;
 
         MPBoundSql(BoundSql boundSql) {
             this.delegate = boundSql;
-            this.boundSql = SystemMetaObject.forObject(boundSql);
+            this.boundSql = getMetaObject(boundSql);
         }
 
         public String sql() {