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 9f8d120a7859ded16d30ceceff5ffc8549bb86f8..f3a1e43207615ffa9bea04d21c47d01087f65f4b 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/cache/global/ExecutorProxyCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/ExecutorProxyCache.java new file mode 100644 index 0000000000000000000000000000000000000000..82ae3d0ab806569285fedbd4b127a3d6efa6448c --- /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/config/Configuration.java b/mongo-plus-core/src/main/java/com/anwen/mongo/config/Configuration.java index 6457ba22b0bd32315e7a8475baf663e88dc5bb5a..bbd55fec6cfd09acc5cea2d52cb043525cfae484 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 b26bce66403a812684a40829390d40adf53d7d11..0a8b5f8e8bec436c52cb70a44b7c199c681ef0af 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-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java b/mongo-plus-core/src/main/java/com/anwen/mongo/proxy/ExecutorProxy.java index 301fe4593a64b72982ddca4c8cfefe10082ce17b..7f45931fec13d085ed956ddeb005abb6b7d97818 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 0000000000000000000000000000000000000000..74495cab959ab04d204f366de5aa659f7a67fd7c --- /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 0000000000000000000000000000000000000000..ae316883b30f8837ba025f81f638bc0218285332 --- /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 0000000000000000000000000000000000000000..764ceb944562c9974f356720e8180c550a2730e1 --- /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 0000000000000000000000000000000000000000..8cc0a09129e9c51fde6647d505a7cb995058a03e --- /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 0000000000000000000000000000000000000000..747caaf0ca7f9ca9645e7576bd974435ade082d6 --- /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 0000000000000000000000000000000000000000..9fd351acf08e531b07ea6af37ee295bc6977b948 --- /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 0000000000000000000000000000000000000000..9800ce5e62251b3c604cfb45a4b772736f23035f --- /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 0000000000000000000000000000000000000000..297dad577c00a6cec4be029bd9dd949f58780940 --- /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(); + } + +} 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 688efecfa5df0c8f556f356fd3b6f8340fc62a96..4acc6d36337d3fc58d7416b2f10e885397c02589 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); }