From 12fdd81fa050a9a4342d581681ad9e0122a343fe Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Sun, 28 Apr 2024 22:03:20 +0800 Subject: [PATCH 1/2] =?UTF-8?q?ExecutorProxy=E5=8A=9F=E8=83=BD=E8=A7=A3?= =?UTF-8?q?=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cache/global/ExecutorProxyCache.java | 36 ++++++++++++++ .../com/anwen/mongo/proxy/ExecutorProxy.java | 48 ++++--------------- .../mongo/proxy/executor/MethodExecutor.java | 24 ++++++++++ .../executor/impl/AggregateExecutor.java | 22 +++++++++ .../executor/impl/BulkWriteExecutor.java | 23 +++++++++ .../proxy/executor/impl/CountExecutor.java | 24 ++++++++++ .../proxy/executor/impl/QueryExecutor.java | 25 ++++++++++ .../proxy/executor/impl/RemoveExecutor.java | 20 ++++++++ .../proxy/executor/impl/SaveExecutor.java | 22 +++++++++ .../proxy/executor/impl/UpdateExecutor.java | 23 +++++++++ 10 files changed, 227 insertions(+), 40 deletions(-) create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorProxyCache.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/MethodExecutor.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/AggregateExecutor.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/BulkWriteExecutor.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/CountExecutor.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/QueryExecutor.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/RemoveExecutor.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/SaveExecutor.java create mode 100644 mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/UpdateExecutor.java diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorProxyCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorProxyCache.java new file mode 100644 index 0000000..82ae3d0 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorProxyCache.java @@ -0,0 +1,36 @@ +package com.anwen.mongo.cache.global; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.proxy.executor.MethodExecutor; +import com.anwen.mongo.proxy.executor.impl.AggregateExecutor; +import com.anwen.mongo.proxy.executor.impl.BulkWriteExecutor; +import com.anwen.mongo.proxy.executor.impl.CountExecutor; +import com.anwen.mongo.proxy.executor.impl.QueryExecutor; +import com.anwen.mongo.proxy.executor.impl.RemoveExecutor; +import com.anwen.mongo.proxy.executor.impl.SaveExecutor; +import com.anwen.mongo.proxy.executor.impl.UpdateExecutor; + +import java.util.HashMap; +import java.util.Map; + +/** + * 方法执行器缓存 + * + * @author loser + * @date 2024/4/28 + */ +public class ExecutorProxyCache { + + public static final Map EXECUTOR_MAP = new HashMap<>(ExecuteMethodEnum.values().length); + + static { + EXECUTOR_MAP.put(ExecuteMethodEnum.SAVE.getMethod(), new SaveExecutor()); + EXECUTOR_MAP.put(ExecuteMethodEnum.REMOVE.getMethod(), new RemoveExecutor()); + EXECUTOR_MAP.put(ExecuteMethodEnum.UPDATE.getMethod(), new UpdateExecutor()); + EXECUTOR_MAP.put(ExecuteMethodEnum.QUERY.getMethod(), new QueryExecutor()); + EXECUTOR_MAP.put(ExecuteMethodEnum.AGGREGATE.getMethod(), new AggregateExecutor()); + EXECUTOR_MAP.put(ExecuteMethodEnum.COUNT.getMethod(), new CountExecutor()); + EXECUTOR_MAP.put(ExecuteMethodEnum.BULK_WRITE.getMethod(), new BulkWriteExecutor()); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java index 301fe45..7f45931 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java @@ -1,20 +1,13 @@ package com.anwen.mongo.proxy; +import com.anwen.mongo.cache.global.ExecutorProxyCache; import com.anwen.mongo.cache.global.InterceptorCache; -import com.anwen.mongo.enums.ExecuteMethodEnum; import com.anwen.mongo.execute.Execute; -import com.anwen.mongo.model.AggregateBasicDBObject; -import com.anwen.mongo.model.MutablePair; -import com.anwen.mongo.model.QueryParam; -import com.mongodb.BasicDBObject; -import com.mongodb.client.model.CountOptions; -import com.mongodb.client.model.WriteModel; -import org.bson.Document; -import org.bson.conversions.Bson; +import com.anwen.mongo.proxy.executor.MethodExecutor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; -import java.util.List; +import java.util.Objects; /** * 执行器代理 @@ -34,36 +27,11 @@ public class ExecutorProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String name = method.getName(); - InterceptorCache.interceptors.forEach(interceptor -> { - if (name.equals(ExecuteMethodEnum.SAVE.getMethod())){ - args[0] = interceptor.executeSave((List) args[0]); - } - if (name.equals(ExecuteMethodEnum.REMOVE.getMethod())){ - args[0] = interceptor.executeRemove((Bson) args[0]); - } - if (name.equals(ExecuteMethodEnum.UPDATE.getMethod())){ - MutablePair bsonBsonMutablePair = interceptor.executeUpdate((Bson) args[0], (Bson) args[1]); - args[0] = bsonBsonMutablePair.getLeft(); - args[1] = bsonBsonMutablePair.getRight(); - } - if (name.equals(ExecuteMethodEnum.QUERY.getMethod())){ - QueryParam queryParam = interceptor.executeQuery((Bson) args[0], (BasicDBObject) args[1], (BasicDBObject) args[2]); - args[0] = queryParam.getQuery(); - args[1] = queryParam.getProjection(); - args[2] = queryParam.getSort(); - } - if (name.equals(ExecuteMethodEnum.AGGREGATE.getMethod())){ - args[0] = interceptor.executeAggregate((List) args[0]); - } - if (name.equals(ExecuteMethodEnum.COUNT.getMethod())){ - MutablePair basicDBObjectCountOptionsMutablePair = interceptor.executeCount((BasicDBObject) args[0], (CountOptions) args[1]); - args[0] = basicDBObjectCountOptionsMutablePair.getLeft(); - args[1] = basicDBObjectCountOptionsMutablePair.getRight(); - } - if (name.equals(ExecuteMethodEnum.BULK_WRITE.getMethod())){ - args[0] = interceptor.executeBulkWrite((List>) args[0]); - } - }); + MethodExecutor executor = ExecutorProxyCache.EXECUTOR_MAP.get(name); + if (Objects.nonNull(executor)) { + InterceptorCache.interceptors.forEach(interceptor -> executor.invoke(interceptor, args)); + } return method.invoke(target, args); } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/MethodExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/MethodExecutor.java new file mode 100644 index 0000000..74495ca --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/MethodExecutor.java @@ -0,0 +1,24 @@ +package com.anwen.mongo.proxy.executor; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; + +/** + * 解耦逻辑 + * + * @author loser + * @date 2024/4/28 + */ +public interface MethodExecutor { + + /** + * 方法类型 + */ + ExecuteMethodEnum method(); + + /** + * 执行拦截方法 + */ + void invoke(Interceptor interceptor, Object[] args); + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/AggregateExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/AggregateExecutor.java new file mode 100644 index 0000000..ae31688 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/AggregateExecutor.java @@ -0,0 +1,22 @@ +package com.anwen.mongo.proxy.executor.impl; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.model.AggregateBasicDBObject; +import com.anwen.mongo.proxy.executor.MethodExecutor; + +import java.util.List; + +public class AggregateExecutor implements MethodExecutor { + + @Override + public ExecuteMethodEnum method() { + return ExecuteMethodEnum.AGGREGATE; + } + + @Override + public void invoke(Interceptor interceptor, Object[] args) { + args[0] = interceptor.executeAggregate((List) args[0]); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/BulkWriteExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/BulkWriteExecutor.java new file mode 100644 index 0000000..764ceb9 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/BulkWriteExecutor.java @@ -0,0 +1,23 @@ +package com.anwen.mongo.proxy.executor.impl; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.proxy.executor.MethodExecutor; +import com.mongodb.client.model.WriteModel; +import org.bson.Document; + +import java.util.List; + +public class BulkWriteExecutor implements MethodExecutor { + + @Override + public ExecuteMethodEnum method() { + return ExecuteMethodEnum.BULK_WRITE; + } + + @Override + public void invoke(Interceptor interceptor, Object[] args) { + args[0] = interceptor.executeBulkWrite((List>) args[0]); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/CountExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/CountExecutor.java new file mode 100644 index 0000000..8cc0a09 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/CountExecutor.java @@ -0,0 +1,24 @@ +package com.anwen.mongo.proxy.executor.impl; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.model.MutablePair; +import com.anwen.mongo.proxy.executor.MethodExecutor; +import com.mongodb.BasicDBObject; +import com.mongodb.client.model.CountOptions; + +public class CountExecutor implements MethodExecutor { + + @Override + public ExecuteMethodEnum method() { + return ExecuteMethodEnum.COUNT; + } + + @Override + public void invoke(Interceptor interceptor, Object[] args) { + MutablePair basicDBObjectCountOptionsMutablePair = interceptor.executeCount((BasicDBObject) args[0], (CountOptions) args[1]); + args[0] = basicDBObjectCountOptionsMutablePair.getLeft(); + args[1] = basicDBObjectCountOptionsMutablePair.getRight(); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/QueryExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/QueryExecutor.java new file mode 100644 index 0000000..747caaf --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/QueryExecutor.java @@ -0,0 +1,25 @@ +package com.anwen.mongo.proxy.executor.impl; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.model.QueryParam; +import com.anwen.mongo.proxy.executor.MethodExecutor; +import com.mongodb.BasicDBObject; +import org.bson.conversions.Bson; + +public class QueryExecutor implements MethodExecutor { + + @Override + public ExecuteMethodEnum method() { + return ExecuteMethodEnum.QUERY; + } + + @Override + public void invoke(Interceptor interceptor, Object[] args) { + QueryParam queryParam = interceptor.executeQuery((Bson) args[0], (BasicDBObject) args[1], (BasicDBObject) args[2]); + args[0] = queryParam.getQuery(); + args[1] = queryParam.getProjection(); + args[2] = queryParam.getSort(); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/RemoveExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/RemoveExecutor.java new file mode 100644 index 0000000..9fd351a --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/RemoveExecutor.java @@ -0,0 +1,20 @@ +package com.anwen.mongo.proxy.executor.impl; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.proxy.executor.MethodExecutor; +import org.bson.conversions.Bson; + +public class RemoveExecutor implements MethodExecutor { + + @Override + public ExecuteMethodEnum method() { + return ExecuteMethodEnum.REMOVE; + } + + @Override + public void invoke(Interceptor interceptor, Object[] args) { + args[0] = interceptor.executeRemove((Bson) args[0]); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/SaveExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/SaveExecutor.java new file mode 100644 index 0000000..9800ce5 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/SaveExecutor.java @@ -0,0 +1,22 @@ +package com.anwen.mongo.proxy.executor.impl; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.proxy.executor.MethodExecutor; +import org.bson.Document; + +import java.util.List; + +public class SaveExecutor implements MethodExecutor { + + @Override + public ExecuteMethodEnum method() { + return ExecuteMethodEnum.SAVE; + } + + @Override + public void invoke(Interceptor interceptor, Object[] args) { + args[0] = interceptor.executeSave((List) args[0]); + } + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/UpdateExecutor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/UpdateExecutor.java new file mode 100644 index 0000000..297dad5 --- /dev/null +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/executor/impl/UpdateExecutor.java @@ -0,0 +1,23 @@ +package com.anwen.mongo.proxy.executor.impl; + +import com.anwen.mongo.enums.ExecuteMethodEnum; +import com.anwen.mongo.interceptor.Interceptor; +import com.anwen.mongo.model.MutablePair; +import com.anwen.mongo.proxy.executor.MethodExecutor; +import org.bson.conversions.Bson; + +public class UpdateExecutor implements MethodExecutor { + + @Override + public ExecuteMethodEnum method() { + return ExecuteMethodEnum.UPDATE; + } + + @Override + public void invoke(Interceptor interceptor, Object[] args) { + MutablePair bsonBsonMutablePair = interceptor.executeUpdate((Bson) args[0], (Bson) args[1]); + args[0] = bsonBsonMutablePair.getLeft(); + args[1] = bsonBsonMutablePair.getRight(); + } + +} -- Gitee From 7112e4b0fbf561eafbac62c4d7fcbd780cd9a0fd Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Sun, 28 Apr 2024 22:35:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Interceptor=E6=B7=BB=E5=8A=A0=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MongoPlusAutoConfiguration.java | 3 ++ .../com/anwen/mongo/config/Configuration.java | 1 + .../anwen/mongo/interceptor/Interceptor.java | 46 +++++++++++++------ .../config/MongoPlusAutoConfiguration.java | 7 ++- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index 9f8d120..f3a1e43 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -193,6 +193,9 @@ public class MongoPlusAutoConfiguration implements InitializingBean { */ private void setInterceptor(){ Collection interceptorCollection = applicationContext.getBeansOfType(Interceptor.class).values(); + if (CollUtil.isNotEmpty(interceptorCollection)) { + interceptorCollection = interceptorCollection.stream().sorted(Comparator.comparing(Interceptor::order)).collect(Collectors.toList()); + } InterceptorCache.interceptors = new ArrayList<>(interceptorCollection); } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java index 6457ba2..bbd55fe 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java @@ -229,6 +229,7 @@ public class Configuration { throw new RuntimeException(e); } } + InterceptorCache.interceptors = InterceptorCache.interceptors.stream().sorted(Comparator.comparing(Interceptor::order)).collect(Collectors.toList()); return this; } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java index b26bce6..0a8b5f8 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/interceptor/Interceptor.java @@ -18,68 +18,84 @@ import java.util.List; **/ public interface Interceptor { + /** + * 拦截器 排序 + * + * @return 升序 从小到大 + */ + default int order() { + return Integer.MAX_VALUE; + } + /** * 添加拦截方法 + * * @param documentList 经过添加方法的值 * @return java.util.List * @author JiaChaoYang * @date 2024/3/17 0:37 - */ - default List executeSave(List documentList){ + */ + default List executeSave(List documentList) { return documentList; - }; + } /** * 删除拦截方法 + * * @author JiaChaoYang * @date 2024/3/19 19:18 - */ - default Bson executeRemove(Bson filter){ + */ + default Bson executeRemove(Bson filter) { return filter; } /** * 修改拦截方法 + * * @author JiaChaoYang * @date 2024/3/19 19:18 - */ - default MutablePair executeUpdate(Bson queryBasic, Bson updateBasic){ + */ + default MutablePair executeUpdate(Bson queryBasic, Bson updateBasic) { return new MutablePair<>(queryBasic, updateBasic); } /** * 查询拦截方法 + * * @author JiaChaoYang * @date 2024/3/19 19:18 - */ - default QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond){ + */ + default QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond) { return new QueryParam(queryBasic, projectionList, sortCond); } /** * 管道拦截方法 + * * @author JiaChaoYang * @date 2024/3/19 19:18 - */ - default List executeAggregate(List aggregateConditionList){ + */ + default List executeAggregate(List aggregateConditionList) { return aggregateConditionList; } /** * 统计拦截方法 + * * @author JiaChaoYang * @date 2024/3/19 19:18 - */ - default MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions){ + */ + default MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions) { return new MutablePair<>(queryBasic, countOptions); } /** * 批量操作拦截方法 + * * @author JiaChaoYang * @date 2024/3/19 19:19 - */ - default List> executeBulkWrite(List> writeModelList){ + */ + default List> executeBulkWrite(List> writeModelList) { return writeModelList; } diff --git a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java index 688efec..4acc6d3 100644 --- a/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java +++ b/mongo-plus-solon-plugin/src/main/java/com/anwen/mongo/config/MongoPlusAutoConfiguration.java @@ -35,6 +35,7 @@ import org.slf4j.LoggerFactory; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** @@ -184,11 +185,15 @@ public class MongoPlusAutoConfiguration { /** * 从Bean中拿到拦截器 + * * @author JiaChaoYang * @date 2024/3/17 0:30 */ - private void setInterceptor(AppContext context){ + private void setInterceptor(AppContext context) { Collection interceptorCollection = context.getBeansOfType(Interceptor.class); + if (CollUtil.isNotEmpty(interceptorCollection)) { + interceptorCollection = interceptorCollection.stream().sorted(Comparator.comparing(Interceptor::order)).collect(Collectors.toList()); + } InterceptorCache.interceptors = new ArrayList<>(interceptorCollection); } -- Gitee