From 9452a570ad0a67070908f8a80e6babbd72f03df3 Mon Sep 17 00:00:00 2001 From: kanghailin <1227734668@qq.com> Date: Wed, 22 May 2024 17:40:42 +0800 Subject: [PATCH] Optimize Plugin --- src/main/java/org/apache/ibatis/plugin/Plugin.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/ibatis/plugin/Plugin.java b/src/main/java/org/apache/ibatis/plugin/Plugin.java index e4f829221ed..46eaf501313 100644 --- a/src/main/java/org/apache/ibatis/plugin/Plugin.java +++ b/src/main/java/org/apache/ibatis/plugin/Plugin.java @@ -22,6 +22,8 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.apache.ibatis.reflection.ExceptionUtil; import org.apache.ibatis.util.MapUtil; @@ -34,6 +36,7 @@ public class Plugin implements InvocationHandler { private final Object target; private final Interceptor interceptor; private final Map, Set> signatureMap; + private final ConcurrentMap methodMap = new ConcurrentHashMap<>(); private Plugin(Object target, Interceptor interceptor, Map, Set> signatureMap) { this.target = target; @@ -53,9 +56,12 @@ public static Object wrap(Object target, Interceptor interceptor) { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - try { + boolean intercepted = MapUtil.computeIfAbsent(methodMap, method, key -> { Set methods = signatureMap.get(method.getDeclaringClass()); - if (methods != null && methods.contains(method)) { + return methods != null && methods.contains(method); + }); + try { + if (intercepted) { return interceptor.intercept(new Invocation(target, method, args)); } return method.invoke(target, args);