From 672015adf09370f4bfbe26a3e6c44eacdc2bf5c2 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Mon, 24 Feb 2025 20:20:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E6=8F=92=E4=BB=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Install=20=E4=B8=8E=20Destroy=20=E9=92=A9=E5=AD=90?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../satoken/plugin/SaTokenPluginHolder.java | 170 ++++++++++++------ .../java/com/pj/satoken/SaTokenConfigure.java | 4 + 2 files changed, 115 insertions(+), 59 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHolder.java b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHolder.java index 9bac40a3..754c30de 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHolder.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHolder.java @@ -165,24 +165,27 @@ public class SaTokenPluginHolder { } /** - * 消费指定集合的钩子函数 + * 消费指定集合的钩子函数,返回消费的数量 * @param pluginClass / * @param hooks / * @param / */ - protected synchronized void _consumeHooks(List> hooks, Class pluginClass) { + protected synchronized int _consumeHooks(List> hooks, Class pluginClass) { + int consumeCount = 0; for (int i = 0; i < hooks.size(); i++) { SaTokenPluginHookModel model = hooks.get(i); if(model.listenerClass.equals(pluginClass)) { model.executeFunction.execute(getPlugin(pluginClass)); hooks.remove(i); i--; + consumeCount++; } } + return consumeCount; } - // ------------------- 插件 Install ------------------- + // ------------------- 插件 Install 与 Destroy ------------------- /** * 安装指定插件 @@ -204,7 +207,10 @@ public class SaTokenPluginHolder { _consumeHooks(beforeInstallHooks, plugin.getClass()); // 插件安装 - plugin.install(); + int consumeCount = _consumeHooks(installHooks, plugin.getClass()); + if (consumeCount == 0) { + plugin.install(); + } // 执行该插件的 install 后置钩子 _consumeHooks(afterInstallHooks, plugin.getClass()); @@ -229,58 +235,6 @@ public class SaTokenPluginHolder { } } - /** - * 插件 [ Install 前置钩子 ] 集合 - */ - private final List> beforeInstallHooks = new ArrayList<>(); - - /** - * 插件 [ Install 后置钩子 ] 集合 - */ - private final List> afterInstallHooks = new ArrayList<>(); - - /** - * 注册指定插件的 [ Install 前置钩子 ],同插件支持多次注册,如果插件已经安装完毕,则抛出异常 - * @param listenerClass / - * @param executeFunction / - * @param / - */ - public synchronized SaTokenPluginHolder onBeforeInstall(Class listenerClass, SaTokenPluginHookFunction executeFunction) { - // 如果指定的插件已经安装完毕,则不再允许注册前置钩子函数 - if(isInstalledPlugin(listenerClass)) { - throw new SaTokenPluginException("插件 [ " + listenerClass.getCanonicalName() + " ] 已安装完毕,不允许再注册前置钩子函数"); - } - - // 堆积到钩子函数集合 - beforeInstallHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); - - // 返回对象自身,支持连缀风格调用 - return this; - } - - /** - * 注册指定插件的 [ Install 后置钩子 ],同插件支持多次注册,如果插件已经安装完毕,则立即执行该钩子函数 - * @param listenerClass / - * @param executeFunction / - * @param / - */ - public synchronized SaTokenPluginHolder onAfterInstall(Class listenerClass, SaTokenPluginHookFunction executeFunction) { - // 如果指定的插件已经安装完毕,则立即执行该钩子函数 - if(isInstalledPlugin(listenerClass)) { - executeFunction.execute(getPlugin(listenerClass)); - return this; - } - - // 堆积到钩子函数集合 - afterInstallHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); - - // 返回对象自身,支持连缀风格调用 - return this; - } - - - // ------------------- 插件 Destroy ------------------- - /** * 卸载指定插件 * @param plugin / @@ -301,7 +255,10 @@ public class SaTokenPluginHolder { _consumeHooks(beforeDestroyHooks, plugin.getClass()); // 插件卸载 - plugin.destroy(); + int consumeCount = _consumeHooks(destroyHooks, plugin.getClass()); + if (consumeCount == 0) { + plugin.destroy(); + } // 执行该插件的 destroy 后置钩子 _consumeHooks(afterDestroyHooks, plugin.getClass()); @@ -318,6 +275,90 @@ public class SaTokenPluginHolder { return destroyPlugin(getPlugin(pluginClass)); } + + // ------------------- 插件 Install 钩子 ------------------- + + /** + * 插件 [ Install 钩子 ] 集合 + */ + private final List> installHooks = new ArrayList<>(); + + /** + * 插件 [ Install 前置钩子 ] 集合 + */ + private final List> beforeInstallHooks = new ArrayList<>(); + + /** + * 插件 [ Install 后置钩子 ] 集合 + */ + private final List> afterInstallHooks = new ArrayList<>(); + + /** + * 注册指定插件的 [ Install 钩子 ],1、同插件支持多次注册。2、如果插件已经安装完毕,则抛出异常。3、注册 Install 钩子的插件默认安装行为将不再执行 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized SaTokenPluginHolder onInstall(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + // 如果指定的插件已经安装完毕,则不再允许注册前置钩子函数 + if(isInstalledPlugin(listenerClass)) { + throw new SaTokenPluginException("插件 [ " + listenerClass.getCanonicalName() + " ] 已安装完毕,不允许再注册 Install 钩子函数"); + } + + // 堆积到钩子函数集合 + installHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + + // 返回对象自身,支持连缀风格调用 + return this; + } + + /** + * 注册指定插件的 [ Install 前置钩子 ],1、同插件支持多次注册。2、如果插件已经安装完毕,则抛出异常 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized SaTokenPluginHolder onBeforeInstall(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + // 如果指定的插件已经安装完毕,则不再允许注册前置钩子函数 + if(isInstalledPlugin(listenerClass)) { + throw new SaTokenPluginException("插件 [ " + listenerClass.getCanonicalName() + " ] 已安装完毕,不允许再注册 Install 前置钩子函数"); + } + + // 堆积到钩子函数集合 + beforeInstallHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + + // 返回对象自身,支持连缀风格调用 + return this; + } + + /** + * 注册指定插件的 [ Install 后置钩子 ],1、同插件支持多次注册。2、如果插件已经安装完毕,则立即执行该钩子函数 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized SaTokenPluginHolder onAfterInstall(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + // 如果指定的插件已经安装完毕,则立即执行该钩子函数 + if(isInstalledPlugin(listenerClass)) { + executeFunction.execute(getPlugin(listenerClass)); + return this; + } + + // 堆积到钩子函数集合 + afterInstallHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + + // 返回对象自身,支持连缀风格调用 + return this; + } + + + // ------------------- 插件 Destroy 钩子 ------------------- + + /** + * 插件 [ Destroy 钩子 ] 集合 + */ + private final List> destroyHooks = new ArrayList<>(); + /** * 插件 [ Destroy 前置钩子 ] 集合 */ @@ -328,6 +369,19 @@ public class SaTokenPluginHolder { */ private final List> afterDestroyHooks = new ArrayList<>(); + /** + * 注册指定插件的 [ Destroy 钩子 ],1、同插件支持多次注册。2、注册 Destroy 钩子的插件默认卸载行为将不再执行 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized SaTokenPluginHolder onDestroy(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + destroyHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + + // 返回对象自身,支持连缀风格调用 + return this; + } + /** * 注册指定插件的 [ Destroy 前置钩子 ],同插件支持多次注册 * @param listenerClass / @@ -354,6 +408,4 @@ public class SaTokenPluginHolder { return this; } - - } diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java index 42a71bbc..36c06081 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java +++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/SaTokenConfigure.java @@ -106,6 +106,10 @@ public class SaTokenConfigure implements WebMvcConfigurer { System.out.println("SaTokenPluginForJackson 插件安装后置钩子2..."); }) +// .onInstall(SaTokenPluginForJackson.class, plugin -> { +// System.out.println("注册 install 钩子函数后,插件的默认安装行为将不再执行 ..."); +// }) + ; }