1
0
mirror of https://gitee.com/dromara/sa-token.git synced 2025-04-05 17:37:53 +08:00

feat: 插件钩子函数的注册支持连缀风格调用

This commit is contained in:
click33 2025-02-24 17:08:16 +08:00
parent d65881b59a
commit a97e3f9902
2 changed files with 43 additions and 22 deletions
sa-token-core/src/main/java/cn/dev33/satoken/plugin
sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken

View File

@ -138,7 +138,7 @@ public class SaTokenPluginHolder {
* 安装指定插件
* @param plugin /
*/
public synchronized void installPlugin(SaTokenPlugin plugin) {
public synchronized SaTokenPluginHolder installPlugin(SaTokenPlugin plugin) {
// 插件为空拒绝安装
if (plugin == null) {
@ -161,16 +161,19 @@ public class SaTokenPluginHolder {
// 添加到插件集合
pluginList.add(plugin);
// 返回对象自身支持连缀风格调用
return this;
}
/**
* 安装指定插件根据插件类型
* @param pluginClass /
*/
public synchronized<T extends SaTokenPlugin> void installPlugin(Class<T> pluginClass) {
public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder installPlugin(Class<T> pluginClass) {
try {
T plugin = pluginClass.getDeclaredConstructor().newInstance();
installPlugin(plugin);
return installPlugin(plugin);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
throw new SaTokenPluginException(e);
}
@ -192,7 +195,7 @@ public class SaTokenPluginHolder {
* @param executeFunction /
* @param <T> /
*/
public synchronized<T extends SaTokenPlugin> void onBeforeInstall(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onBeforeInstall(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
// 如果指定的插件已经安装完毕则不再允许注册前置钩子函数
if(isInstalledPlugin(listenerClass)) {
throw new SaTokenPluginException("插件 [ " + listenerClass.getCanonicalName() + " ] 已安装完毕,不允许再注册前置钩子函数");
@ -200,6 +203,9 @@ public class SaTokenPluginHolder {
// 堆积到钩子函数集合
beforeInstallHooks.add(new SaTokenPluginHookModel<T>(listenerClass, executeFunction));
// 返回对象自身支持连缀风格调用
return this;
}
/**
@ -208,15 +214,18 @@ public class SaTokenPluginHolder {
* @param executeFunction /
* @param <T> /
*/
public synchronized<T extends SaTokenPlugin> void onAfterInstall(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onAfterInstall(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
// 如果指定的插件已经安装完毕则立即执行该钩子函数
if(isInstalledPlugin(listenerClass)) {
executeFunction.execute(getPlugin(listenerClass));
return;
return this;
}
// 堆积到钩子函数集合
afterInstallHooks.add(new SaTokenPluginHookModel<T>(listenerClass, executeFunction));
// 返回对象自身支持连缀风格调用
return this;
}
@ -226,7 +235,7 @@ public class SaTokenPluginHolder {
* 卸载指定插件
* @param plugin /
*/
public synchronized void destroyPlugin(SaTokenPlugin plugin) {
public synchronized SaTokenPluginHolder destroyPlugin(SaTokenPlugin plugin) {
// 插件为空拒绝卸载
if (plugin == null) {
@ -246,14 +255,17 @@ public class SaTokenPluginHolder {
// 执行该插件的 destroy 后置钩子
_consumeHooks(afterDestroyHooks, plugin.getClass());
// 返回对象自身支持连缀风格调用
return this;
}
/**
* 卸载指定插件根据插件类型
* @param pluginClass /
*/
public synchronized<T extends SaTokenPlugin> void destroyPlugin(Class<T> pluginClass) {
destroyPlugin(getPlugin(pluginClass));
public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder destroyPlugin(Class<T> pluginClass) {
return destroyPlugin(getPlugin(pluginClass));
}
/**
@ -272,8 +284,11 @@ public class SaTokenPluginHolder {
* @param executeFunction /
* @param <T> /
*/
public synchronized<T extends SaTokenPlugin> void onBeforeDestroy(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onBeforeDestroy(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
beforeDestroyHooks.add(new SaTokenPluginHookModel<T>(listenerClass, executeFunction));
// 返回对象自身支持连缀风格调用
return this;
}
/**
@ -282,8 +297,11 @@ public class SaTokenPluginHolder {
* @param executeFunction /
* @param <T> /
*/
public synchronized<T extends SaTokenPlugin> void onAfterDestroy(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onAfterDestroy(Class<T> listenerClass, SaTokenPluginHookFunction<T> executeFunction) {
afterDestroyHooks.add(new SaTokenPluginHookModel<T>(listenerClass, executeFunction));
// 返回对象自身支持连缀风格调用
return this;
}

View File

@ -91,19 +91,22 @@ public class SaTokenConfigure implements WebMvcConfigurer {
*/
@Bean
public SaTokenPluginHolder getSaTokenPluginHolder() {
System.out.println("自定义逻辑");
SaTokenPluginHolder.instance.onBeforeInstall(SaTokenPluginForJackson.class, plugin -> {
System.out.println("自定义逻辑前置");
});
System.out.println("自定义插件安装钩子函数...");
SaTokenPluginHolder.instance.onAfterInstall(SaTokenPluginForJackson.class, plugin -> {
System.out.println("自定义逻辑后");
});
SaTokenPluginHolder.instance.onAfterInstall(SaTokenPluginForJackson.class, plugin -> {
System.out.println("自定义逻辑后置2");
});
return SaTokenPluginHolder.instance
.onBeforeInstall(SaTokenPluginForJackson.class, plugin -> {
System.out.println("SaTokenPluginForJackson 插件安装前置钩子...");
})
return SaTokenPluginHolder.instance;
.onAfterInstall(SaTokenPluginForJackson.class, plugin -> {
System.out.println("SaTokenPluginForJackson 插件安装后置钩子...");
})
.onAfterInstall(SaTokenPluginForJackson.class, plugin -> {
System.out.println("SaTokenPluginForJackson 插件安装后置钩子2...");
})
;
}
}