diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenPluginException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenPluginException.java new file mode 100644 index 00000000..13b76a86 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenPluginException.java @@ -0,0 +1,48 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.exception; + +/** + * 一个异常:代表插件安装过程中出现异常 + * + * @author click33 + * @since 1.28.0 + */ +public class SaTokenPluginException extends SaTokenException { + + /** + * 序列化版本号 + */ + private static final long serialVersionUID = 6806129545290130131L; + + /** + * 一个异常:代表插件安装过程中出现异常 + * @param message 异常描述 + */ + public SaTokenPluginException(String message) { + super(message); + } + + /** + * 一个异常:代表插件安装过程中出现异常 + * + * @param cause 异常对象 + */ + public SaTokenPluginException(Throwable cause) { + super(cause); + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/fun/hooks/SaTokenPluginHookFunction.java b/sa-token-core/src/main/java/cn/dev33/satoken/fun/hooks/SaTokenPluginHookFunction.java new file mode 100644 index 00000000..2c425892 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/fun/hooks/SaTokenPluginHookFunction.java @@ -0,0 +1,34 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.fun.hooks; + +import cn.dev33.satoken.plugin.SaTokenPlugin; + +/** + * SaTokenPlugin 钩子函数 + * + * @author click33 + * @since 1.41.0 + */ +@FunctionalInterface +public interface SaTokenPluginHookFunction { + + /** + * 执行的方法 + * @param plugin 插件实例 + */ + void execute(SaTokenPlugin plugin); +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPlugin.java b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPlugin.java index 64efc44b..62cdecb3 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPlugin.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPlugin.java @@ -26,6 +26,13 @@ public interface SaTokenPlugin { /** * 安装插件 */ - void setup(); + void install(); + + /** + * 卸载插件 + */ + default void destroy(){ + + } } 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 new file mode 100644 index 00000000..a4ea4c7b --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHolder.java @@ -0,0 +1,291 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.plugin; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.exception.SaTokenPluginException; +import cn.dev33.satoken.fun.hooks.SaTokenPluginHookFunction; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; +import java.util.ServiceLoader; + +/** + * Sa-Token 插件管理器,管理所有插件的加载与卸载 + * + * @author click33 + * @since 1.41.0 + */ +public class SaTokenPluginHolder { + + /** + * 默认实例,非单例模式,可替换 + */ + public static SaTokenPluginHolder instance = new SaTokenPluginHolder(); + + + // ------------------- 插件初始化相关 ------------------- + + /** + * 是否已经加载过插件 + */ + public boolean isLoader = false; + + /** + * 初始化加载所有插件(多次调用只会执行一次) + */ + public synchronized void init() { + if(isLoader) { + return; + } + loaderPlugins(); + isLoader = true; + } + + /** + * 根据 SPI 机制加载所有插件 + */ + public synchronized void loaderPlugins() { + SaManager.getLog().info("SPI 插件加载开始 ..."); + ServiceLoader plugins = ServiceLoader.load(SaTokenPlugin.class); + for (SaTokenPlugin plugin : plugins) { + installPlugin(plugin); + } + SaManager.getLog().info("SPI 插件加载结束 ..."); + } + + + // ------------------- 插件管理 ------------------- + + /** + * 所有插件的集合 + */ + private final List pluginList = new ArrayList<>(); + + /** + * 获取插件集合副本 (拷贝插件集合,而非每个插件实例) + * @return / + */ + public synchronized List getPluginListCopy() { + return new ArrayList<>(pluginList); + } + + /** + * 判断是否已经安装了指定插件 + * + * @param pluginClass 插件类型 + * @return / + */ + public synchronized boolean isInstalledPlugin(Class pluginClass) { + for (SaTokenPlugin plugin : pluginList) { + if (plugin.getClass().equals(pluginClass)) { + return true; + } + } + return false; + } + + /** + * 获取指定类型的插件 + * @param pluginClass / + * @return / + * @param / + */ + public synchronized T getPlugin(Class pluginClass) { + for (SaTokenPlugin plugin : pluginList) { + if (plugin.getClass().equals(pluginClass)) { + return (T) plugin; + } + } + return null; + } + + /** + * 消费指定集合的钩子函数 + * @param pluginClass / + * @param hooks / + * @param / + */ + protected synchronized void _consumeHooks(List> hooks, Class pluginClass) { + 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--; + } + } + } + + + // ------------------- 插件 Install ------------------- + + /** + * 安装指定插件 + * @param plugin / + */ + public synchronized void installPlugin(SaTokenPlugin plugin) { + + // 插件为空,拒绝安装 + if (plugin == null) { + throw new SaTokenPluginException("插件不可为空"); + } + + // 插件已经被安装过了,拒绝再次安装 + if (isInstalledPlugin(plugin.getClass())) { + throw new SaTokenPluginException("插件 [ " + plugin.getClass().getCanonicalName() + " ] 已安装,不可重复安装"); + } + + // 执行该插件的 install 前置钩子 + _consumeHooks(beforeInstallHooks, plugin.getClass()); + + // 插件安装 + plugin.install(); + + // 执行该插件的 install 后置钩子 + _consumeHooks(afterInstallHooks, plugin.getClass()); + + // 添加到插件集合 + pluginList.add(plugin); + } + + /** + * 安装指定插件,根据插件类型 + * @param pluginClass / + */ + public synchronized void installPlugin(Class pluginClass) { + try { + T plugin = pluginClass.getDeclaredConstructor().newInstance(); + installPlugin(plugin); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new SaTokenPluginException(e); + } + } + + /** + * 插件 [ Install 前置钩子 ] 集合 + */ + private final List> beforeInstallHooks = new ArrayList<>(); + + /** + * 插件 [ Install 后置钩子 ] 集合 + */ + private final List> afterInstallHooks = new ArrayList<>(); + + /** + * 注册指定插件的 [ Install 前置钩子 ],同插件支持多次注册,如果插件已经安装完毕,则抛出异常 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized void onBeforeInstall(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + // 如果指定的插件已经安装完毕,则不再允许注册前置钩子函数 + if(isInstalledPlugin(listenerClass)) { + throw new SaTokenPluginException("插件 [ " + listenerClass.getCanonicalName() + " ] 已安装完毕,不允许再注册前置钩子函数"); + } + + // 堆积到钩子函数集合 + beforeInstallHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + } + + /** + * 注册指定插件的 [ Install 后置钩子 ],同插件支持多次注册,如果插件已经安装完毕,则立即执行该钩子函数 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized void onAfterInstall(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + // 如果指定的插件已经安装完毕,则立即执行该钩子函数 + if(isInstalledPlugin(listenerClass)) { + executeFunction.execute(getPlugin(listenerClass)); + return; + } + + // 堆积到钩子函数集合 + afterInstallHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + } + + + // ------------------- 插件 Destroy ------------------- + + /** + * 卸载指定插件 + * @param plugin / + */ + public synchronized void destroyPlugin(SaTokenPlugin plugin) { + + // 插件为空,拒绝卸载 + if (plugin == null) { + throw new SaTokenPluginException("插件不可为空"); + } + + // 插件未被安装,拒绝卸载 + if (!isInstalledPlugin(plugin.getClass())) { + throw new SaTokenPluginException("插件 [ " + plugin.getClass().getCanonicalName() + " ] 未安装,无法卸载"); + } + + // 执行该插件的 destroy 前置钩子 + _consumeHooks(beforeDestroyHooks, plugin.getClass()); + + // 插件卸载 + plugin.destroy(); + + // 执行该插件的 destroy 后置钩子 + _consumeHooks(afterDestroyHooks, plugin.getClass()); + } + + /** + * 卸载指定插件,根据插件类型 + * @param pluginClass / + */ + public synchronized void destroyPlugin(Class pluginClass) { + destroyPlugin(getPlugin(pluginClass)); + } + + /** + * 插件 [ Destroy 前置钩子 ] 集合 + */ + private final List> beforeDestroyHooks = new ArrayList<>(); + + /** + * 插件 [ Destroy 后置钩子 ] 集合 + */ + private final List> afterDestroyHooks = new ArrayList<>(); + + /** + * 注册指定插件的 [ Destroy 前置钩子 ],同插件支持多次注册 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized void onBeforeDestroy(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + beforeDestroyHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + } + + /** + * 注册指定插件的 [ Destroy 后置钩子 ],同插件支持多次注册 + * @param listenerClass / + * @param executeFunction / + * @param / + */ + public synchronized void onAfterDestroy(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + afterDestroyHooks.add(new SaTokenPluginHookModel(listenerClass, executeFunction)); + } + + + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHookModel.java b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHookModel.java new file mode 100644 index 00000000..c4694474 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHookModel.java @@ -0,0 +1,48 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.plugin; + +import cn.dev33.satoken.fun.hooks.SaTokenPluginHookFunction; + +/** + * Sa-Token 插件 Hook Model + * + * @author click33 + * @since 1.41.0 + */ +public class SaTokenPluginHookModel { + + /** + * 监听插件类型 + */ + public Class listenerClass; + + /** + * 执行的方法 + */ + public SaTokenPluginHookFunction executeFunction; + + /** + * 构造函数 + * @param listenerClass / + * @param executeFunction / + */ + public SaTokenPluginHookModel(Class listenerClass, SaTokenPluginHookFunction executeFunction) { + this.listenerClass = listenerClass; + this.executeFunction = executeFunction; + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginLoader.java b/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginLoader.java deleted file mode 100644 index 58bcc40b..00000000 --- a/sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginLoader.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2020-2099 sa-token.cc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package cn.dev33.satoken.plugin; - -import cn.dev33.satoken.SaManager; - -import java.util.ArrayList; -import java.util.List; -import java.util.ServiceLoader; - -/** - * Sa-Token 插件加载器,管理所有插件的加载 - * - * @author click33 - * @since 1.41.0 - */ -public class SaTokenPluginLoader { - - /** - * 是否已经加载过插件 - */ - public static boolean isLoader = false; - - /** - * 所有插件的集合 - */ - public static List pluginList; - - /** - * 初始化加载所有插件(多次调用只会执行一次) - */ - public static void init() { - if(isLoader) { - return; - } - loaderPlugins(); - isLoader = true; - } - - /** - * 根据 SPI 机制加载所有插件 - */ - public static void loaderPlugins() { - SaManager.getLog().info("SPI 插件加载开始 ..."); - List list = new ArrayList<>(); - ServiceLoader plugins = ServiceLoader.load(SaTokenPlugin.class); - for (SaTokenPlugin plugin : plugins) { - plugin.setup(); - list.add(plugin); - } - pluginList = list; - SaManager.getLog().info("SPI 插件加载结束 ..."); - } - -} 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 6b02af00..e07f8048 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 @@ -3,6 +3,8 @@ package com.pj.satoken; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.filter.SaServletFilter; import cn.dev33.satoken.interceptor.SaInterceptor; +import cn.dev33.satoken.plugin.SaTokenPluginForJackson; +import cn.dev33.satoken.plugin.SaTokenPluginHolder; import cn.dev33.satoken.router.SaHttpMethod; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.util.SaResult; @@ -84,4 +86,24 @@ public class SaTokenConfigure implements WebMvcConfigurer { ; } + /** + * 注册 [Sa-Token 全局过滤器] + */ + @Bean + public SaTokenPluginHolder getSaTokenPluginHolder() { + System.out.println("自定义逻辑"); + SaTokenPluginHolder.instance.onBeforeInstall(SaTokenPluginForJackson.class, plugin -> { + 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; + } + } diff --git a/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo.java b/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo.java index 826c0310..3484819f 100644 --- a/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo.java +++ b/sa-token-plugin/sa-token-dubbo/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo.java @@ -27,7 +27,7 @@ import cn.dev33.satoken.context.dubbo.SaTokenSecondContextForDubbo; public class SaTokenPluginForDubbo implements SaTokenPlugin { @Override - public void setup() { + public void install() { SaManager.setSaTokenSecondContext(new SaTokenSecondContextForDubbo()); } diff --git a/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo3.java b/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo3.java index 2ea179e8..201d552b 100644 --- a/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo3.java +++ b/sa-token-plugin/sa-token-dubbo3/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForDubbo3.java @@ -27,7 +27,7 @@ import cn.dev33.satoken.context.dubbo3.SaTokenSecondContextForDubbo3; public class SaTokenPluginForDubbo3 implements SaTokenPlugin { @Override - public void setup() { + public void install() { SaManager.setSaTokenSecondContext(new SaTokenSecondContextForDubbo3()); } diff --git a/sa-token-plugin/sa-token-fastjson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson.java b/sa-token-plugin/sa-token-fastjson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson.java index ba48baee..dafe1224 100644 --- a/sa-token-plugin/sa-token-fastjson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson.java +++ b/sa-token-plugin/sa-token-fastjson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson.java @@ -29,7 +29,7 @@ import cn.dev33.satoken.strategy.SaStrategy; public class SaTokenPluginForFastjson implements SaTokenPlugin { @Override - public void setup() { + public void install() { // 设置JSON转换器:Fastjson 版 SaManager.setSaJsonTemplate(new SaJsonTemplateForFastjson()); diff --git a/sa-token-plugin/sa-token-fastjson2/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson2.java b/sa-token-plugin/sa-token-fastjson2/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson2.java index 9ec2059b..f28ff687 100644 --- a/sa-token-plugin/sa-token-fastjson2/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson2.java +++ b/sa-token-plugin/sa-token-fastjson2/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForFastjson2.java @@ -29,7 +29,7 @@ import cn.dev33.satoken.strategy.SaStrategy; public class SaTokenPluginForFastjson2 implements SaTokenPlugin { @Override - public void setup() { + public void install() { // 设置 JSON 转换器:Fastjson2 版 SaManager.setSaJsonTemplate(new SaJsonTemplateForFastjson2()); diff --git a/sa-token-plugin/sa-token-hutool-timed-cache/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForHutoolCache.java b/sa-token-plugin/sa-token-hutool-timed-cache/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForHutoolCache.java index 4bbeb28f..f1bf76b3 100644 --- a/sa-token-plugin/sa-token-hutool-timed-cache/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForHutoolCache.java +++ b/sa-token-plugin/sa-token-hutool-timed-cache/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForHutoolCache.java @@ -27,7 +27,7 @@ import cn.dev33.satoken.dao.SaTokenDaoForHutoolTimedCache; public class SaTokenPluginForHutoolCache implements SaTokenPlugin { @Override - public void setup() { + public void install() { SaManager.setSaTokenDao(new SaTokenDaoForHutoolTimedCache()); diff --git a/sa-token-plugin/sa-token-jackson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForJackson.java b/sa-token-plugin/sa-token-jackson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForJackson.java index c9775e4b..870d4e8d 100644 --- a/sa-token-plugin/sa-token-jackson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForJackson.java +++ b/sa-token-plugin/sa-token-jackson/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForJackson.java @@ -27,7 +27,7 @@ import cn.dev33.satoken.json.SaJsonTemplateForJackson; public class SaTokenPluginForJackson implements SaTokenPlugin { @Override - public void setup() { + public void install() { SaManager.setSaJsonTemplate(new SaJsonTemplateForJackson()); } diff --git a/sa-token-plugin/sa-token-temp-jwt/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForTempForJwt.java b/sa-token-plugin/sa-token-temp-jwt/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForTempForJwt.java index cd9bd9ed..d841508a 100644 --- a/sa-token-plugin/sa-token-temp-jwt/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForTempForJwt.java +++ b/sa-token-plugin/sa-token-temp-jwt/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginForTempForJwt.java @@ -27,7 +27,7 @@ import cn.dev33.satoken.temp.jwt.SaTempForJwt; public class SaTokenPluginForTempForJwt implements SaTokenPlugin { @Override - public void setup() { + public void install() { SaManager.setSaTemp(new SaTempForJwt()); } diff --git a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java index 0043005a..fbfe9863 100644 --- a/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java +++ b/sa-token-starter/sa-token-jfinal-plugin/src/main/java/cn/dev33/satoken/jfinal/SaTokenDaoRedis.java @@ -16,6 +16,7 @@ package cn.dev33.satoken.jfinal; import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.dao.auto.SaTokenDaoBySessionFollowObject; import cn.dev33.satoken.util.SaFoxUtil; import com.jfinal.plugin.redis.Cache; import com.jfinal.plugin.redis.Redis; @@ -26,7 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -public class SaTokenDaoRedis implements SaTokenDao { +public class SaTokenDaoRedis implements SaTokenDaoBySessionFollowObject { protected Cache redis; protected ISerializer serializer; diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java index f8154d44..ebe5004f 100644 --- a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java +++ b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java @@ -29,7 +29,7 @@ import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.log.SaLog; -import cn.dev33.satoken.plugin.SaTokenPluginLoader; +import cn.dev33.satoken.plugin.SaTokenPluginHolder; import cn.dev33.satoken.same.SaSameTemplate; import cn.dev33.satoken.serializer.SaSerializerTemplate; import cn.dev33.satoken.sign.SaSignTemplate; @@ -61,8 +61,9 @@ public class SaBeanInject { * @param saTokenConfig 配置对象 */ public SaBeanInject( - @Autowired(required = false) SaLog log, - @Autowired(required = false) SaTokenConfig saTokenConfig + @Autowired(required = false) SaLog log, + @Autowired(required = false) SaTokenConfig saTokenConfig, + @Autowired(required = false) SaTokenPluginHolder pluginHolder ){ if(log != null) { SaManager.setLog(log); @@ -71,7 +72,11 @@ public class SaBeanInject { SaManager.setConfig(saTokenConfig); } // 初始化 Sa-Token SPI 插件 - SaTokenPluginLoader.init(); + if (pluginHolder == null) { + pluginHolder = SaTokenPluginHolder.instance; + } + pluginHolder.init(); + SaTokenPluginHolder.instance = pluginHolder; } /**