From 314f463858ffc49a3a807baec249168100edd7df Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Thu, 28 Jan 2021 11:29:31 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=A1=88=E4=BE=8B?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/basic-example/basic-example-main/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/example/basic-example/basic-example-main/pom.xml b/example/basic-example/basic-example-main/pom.xml index 32c29e3..43ed682 100644 --- a/example/basic-example/basic-example-main/pom.xml +++ b/example/basic-example/basic-example-main/pom.xml @@ -30,17 +30,11 @@ ${springboot-plugin-framework.version} - - org.springframework.boot - spring-boot - - org.springframework.boot spring-boot-starter-web - org.quartz-scheduler quartz -- Gitee From 571525448420a7b2f6cbe692878ac4ae7156e4b6 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 30 Jan 2021 15:12:42 +0800 Subject: [PATCH 2/9] =?UTF-8?q?1=E3=80=81=E7=AE=80=E5=8C=96=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E5=99=A8=E6=B3=A8=E5=86=8C=E6=96=B9=E5=BC=8F=202?= =?UTF-8?q?=E3=80=81PluginOperator=20=E8=AE=BE=E7=BD=AE=E4=B8=BA=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/PluginListenerFactory.java | 28 ++++++++++++++++--- .../operator/DefaultPluginOperator.java | 18 ++++++------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java index 37e9fca..e59a642 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java @@ -1,10 +1,12 @@ package com.gitee.starblues.integration.listener; +import com.gitee.starblues.utils.SpringBeanUtils; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.context.support.GenericApplicationContext; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * 插件监听工厂 @@ -76,8 +78,7 @@ public class PluginListenerFactory implements PluginListener { } } - public void buildListenerClass(GenericApplicationContext - applicationContext) { + public void buildListenerClass(GenericApplicationContext applicationContext) { if (applicationContext == null) { return; } @@ -85,11 +86,30 @@ public class PluginListenerFactory implements PluginListener { if(isBuildListenerClass){ return; } + // 搜索Spring容器中的监听器 + List pluginListeners = SpringBeanUtils.getBeans(applicationContext, PluginListener.class); + if(pluginListeners.isEmpty()){ + pluginListeners = new ArrayList<>(); + } for (Class listenerClass : listenerClasses) { // 兼容 spring 4.x - applicationContext.registerBeanDefinition(listenerClass.getName(), BeanDefinitionBuilder.genericBeanDefinition(listenerClass).getBeanDefinition()); + applicationContext.registerBeanDefinition(listenerClass.getName(), + BeanDefinitionBuilder.genericBeanDefinition(listenerClass).getBeanDefinition()); T bean = applicationContext.getBean(listenerClass); - listeners.add(bean); + pluginListeners.add(bean); + } + for (PluginListener pluginListener : pluginListeners) { + boolean find = false; + for (PluginListener listener : listeners) { + if(Objects.equals(listener, pluginListener)){ + find = true; + break; + } + } + // 防止监听器重复注册 + if(!find){ + listeners.add(pluginListener); + } } listenerClasses.clear(); isBuildListenerClass = true; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java index 2572158..0cf86a5 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java @@ -147,7 +147,7 @@ public class DefaultPluginOperator implements PluginOperator { @Override - public boolean install(Path jarPath) throws Exception { + public synchronized boolean install(Path jarPath) throws Exception { if(isDev()){ throw new RuntimeException("Plugin cannot be installed in 'dev' environment"); } @@ -214,7 +214,7 @@ public class DefaultPluginOperator implements PluginOperator { @Override - public boolean uninstall(String pluginId, boolean isBackup) throws Exception { + public synchronized boolean uninstall(String pluginId, boolean isBackup) throws Exception { if(isDev()){ throw new RuntimeException("Plugin cannot be uninstalled in 'dev' environment"); } @@ -268,7 +268,7 @@ public class DefaultPluginOperator implements PluginOperator { } @Override - public boolean start(String pluginId) throws Exception { + public synchronized boolean start(String pluginId) throws Exception { if(StringUtils.isEmpty(pluginId)){ throw new IllegalArgumentException("Method:start param 'pluginId' can not be empty"); } @@ -302,7 +302,7 @@ public class DefaultPluginOperator implements PluginOperator { } @Override - public boolean stop(String pluginId) throws Exception { + public synchronized boolean stop(String pluginId) throws Exception { if(StringUtils.isEmpty(pluginId)){ throw new IllegalArgumentException("Method:stop param 'pluginId' can not be empty"); } @@ -329,7 +329,7 @@ public class DefaultPluginOperator implements PluginOperator { @Override - public boolean uploadPluginAndStart(MultipartFile pluginFile) throws Exception { + public synchronized boolean uploadPluginAndStart(MultipartFile pluginFile) throws Exception { if(isDev()){ throw new RuntimeException("Plugin cannot uploadPluginAndStart in the 'dev' environment"); } @@ -346,7 +346,7 @@ public class DefaultPluginOperator implements PluginOperator { } @Override - public boolean installConfigFile(Path configFilePath) throws Exception { + public synchronized boolean installConfigFile(Path configFilePath) throws Exception { if(isDev()){ throw new RuntimeException("Plugin config file cannot be installed in the 'dev' environment"); } @@ -366,7 +366,7 @@ public class DefaultPluginOperator implements PluginOperator { } @Override - public boolean uploadConfigFile(MultipartFile configFile) throws Exception { + public synchronized boolean uploadConfigFile(MultipartFile configFile) throws Exception { if(isDev()){ throw new RuntimeException("Plugin config file cannot be uploaded in the 'dev' environment"); } @@ -387,7 +387,7 @@ public class DefaultPluginOperator implements PluginOperator { } @Override - public boolean backupPlugin(Path backDirPath, String sign) throws Exception { + public synchronized boolean backupPlugin(Path backDirPath, String sign) throws Exception { if(isDev()){ throw new RuntimeException("Plugin cannot backup in the 'dev' environment"); } @@ -397,7 +397,7 @@ public class DefaultPluginOperator implements PluginOperator { @Override - public boolean backupPlugin(String pluginId, String sign) throws Exception { + public synchronized boolean backupPlugin(String pluginId, String sign) throws Exception { if(isDev()){ throw new RuntimeException("Plugin cannot backup in the 'dev' environment"); } -- Gitee From c8a5c8c1d8ff5f233753196b51ef8735dd0912c4 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 1 Feb 2021 19:12:59 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=8F=AF=E9=85=8D=E7=BD=AE=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=A6=81=E6=B1=82=20Mybatis=E3=80=81Mybatis-Plus=E3=80=81Tk-My?= =?UTF-8?q?batis=E6=89=A9=E5=B1=95=E6=96=B0=E5=A2=9E=E5=8F=AF=E9=87=8D?= =?UTF-8?q?=E5=86=99=E8=A6=86=E7=9B=96=E4=B8=BB=E7=A8=8B=E5=BA=8F=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE(=E9=87=8D=E5=86=99=E5=90=8E=E4=BC=9A?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E6=8F=92=E4=BB=B6=E7=A7=81=E6=9C=89,=20?= =?UTF-8?q?=E4=B8=8D=E5=BD=B1=E5=93=8D=E4=B8=BB=E7=A8=8B=E5=BA=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 66 +++++++++---------- .../extension/mybatis/MybatisProcessor.java | 1 + .../mybatis/SpringBootMybatisConfig.java | 8 +++ .../mybatisplus/MybatisPlusProcessor.java | 49 ++++++++------ .../SpringBootMybatisPlusConfig.java | 12 ++++ .../tkmyabtis/SpringBootTkMybatisConfig.java | 15 +++-- .../mybatis/tkmyabtis/TkMybatisProcessor.java | 8 ++- .../README.md | 42 ++++++------ .../resources/StaticResourceExtension.java | 27 ++++++-- .../AutoIntegrationConfiguration.java | 47 +++++++++++++ .../integration/ConfigurationBuilder.java | 43 ++++++++++-- .../DefaultIntegrationConfiguration.java | 10 +++ .../integration/IntegrationConfiguration.java | 15 +++++ .../integration/pf4j/DefaultPf4jFactory.java | 11 +++- 14 files changed, 257 insertions(+), 97 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md index ecb5844..6dcbf43 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md @@ -1,24 +1,21 @@ -### 特性 -- 支持在插件中自定义Mapper接口、Mapper xml 以及对应的实体bean -- 支持插件独立定义数据源 -- 支持集成 `Mybatis` -- 支持集成 `Mybatis-Plus` -- 支持集成`Tk-Mybatis` +### 集成Mybatis扩展 -### maven 仓库地址 +## 包含集成 +- 可集成`Mybatis` +- 可集成`Mybatis-Plus` +- 可集成`Tk-Mybatis` -https://mvnrepository.com/artifact/com.gitee.starblues/springboot-plugin-framework-extension-mybatis +## maven 仓库地址 -### 集成步骤 +[maven 仓库地址](https://mvnrepository.com/artifact/com.gitee.starblues/springboot-plugin-framework-extension-mybatis) -#### 主程序集成步骤 - -一. 引入依赖 +## 主程序集成步骤 +#### 引入依赖 ```xmml com.gitee.starblues springboot-plugin-framework-extension-mybatis - ${latest.version} + 2.4.0-RELEASE @@ -44,7 +41,7 @@ https://mvnrepository.com/artifact/com.gitee.starblues/springboot-plugin-framewo ``` -二. 配置扩展 +#### 配置扩展 定义PluginApplication bean时, 新增该扩展。 ```java @@ -63,10 +60,9 @@ public PluginApplication pluginApplication(){ - Mybatis-Plus类型为:`SpringBootMybatisExtension.Type.MYBATIS_PLUS` - Tk-Mybatis类型为:`SpringBootMybatisExtension.Type.TK_MYBATIS` +## 插件集成步骤 -#### 插件程序集成步骤 - -一. 以provided方式引入主程序依赖, 例如: +#### 以provided方式引入主程序依赖, 例如: ```xml com.gitee.starblues @@ -76,15 +72,15 @@ public PluginApplication pluginApplication(){ ``` -二. 进行配置 +#### 进行配置 -- 如果集成`mybatis`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootMybatisConfig` -- 如果集成`mybatis-plus`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootMybatisPlusConfig` -- 如果集成`tkmybatis`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootTkMybatisConfig` +- 如果集成`Mybatis`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootMybatisConfig` +- 如果集成`Mybatis-Plus`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootMybatisPlusConfig` +- 如果集成`TkMybatis`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootTkMybatisConfig` -- 以上实现类添加注解`@ConfigDefinition` +以上实现类添加注解`@ConfigDefinition` -例如集成mybatis-plus: +例如集成`Mybatis-Plus`: ```java @ConfigDefinition @@ -122,7 +118,7 @@ classpath路径-> classpath: xml/mapper/*PluginMapper.xml ``` -三. 定义的Mapper 接口需要加上注解 @Mapper +#### 定义的Mapper 接口需要加上注解 @Mapper 注解位置: org.apache.ibatis.annotations.Mapper @@ -154,7 +150,7 @@ public interface Plugin1Mapper { } ``` -### 如果插件不想使用主程序的配置或者数据源, 插件可自定义配置, 配置说明如下: +#### 如果插件不想使用主程序的配置或者数据源, 插件可自定义配置, 配置说明如下: 1. 实现`enableOneselfConfig`方法, 并设置返回值为true 2. 实现`oneselfConfig(xx)`方法进行独立配置 - Mybatis独立配置: @@ -205,28 +201,32 @@ public void oneselfConfig(Config config){ ``` -#### 集成Mybatis-Plus说明 +### 集成Mybatis-Plus说明 - 集成mybatis-plus后,在插件中无法使用 `LambdaQueryWrapper` 条件构造器 -### 版本升级 -#### 2.4.0 版本 +## 版本说明 +#### `2.4.1-RELEASE` 版本 +- 修复插件中使用`Mybatis-Plus`批量插入bug +- 针对`Mybatis`、`Mybatis-Plus`、`Tk-Mybatis` 新增使用主程序配置时,可重写主程序配置到本插件中 + +### `2.4.0-RELEASE` 版本 - 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 -#### 2.2.5 版本 +### `2.2.5-RELEASE` 版本 全新升级该扩展 1. 对 `Mybatis`、`Mybatis-Plus`、`Tk-Mybatis` 进行支持 2. 支持动态卸载和安装 3. 支持插件可独立进行配置, 与主程序和其他插件进行环境隔离 -#### 2.1.3 版本 +### `2.1.3-RELEASE` 版本 跟随 springboot-plugin-framework 版本的部分类修改。升级到 2.1.3 -#### 2.1.1 版本 +### `2.1.1-RELEASE` 版本 1. 新增支持 Mybatis-Plus ServiceImpl的包装类。ServiceImplWrapper。使用详见`集成Mybatis-Plus说明` 2. 修复 Mapper.xml 中定义的 resultType 类型无法定义的bug。 -#### 2.0.3 版本 -1. 修复Mapper无法注入的bug. (由于springboot-plugin-framework 2.0.3 版本升级导致) \ No newline at end of file +### `2.0.3-RELEASE` 版本 +1. 修复Mapper无法注入的bug. (由于springboot-plugin-framework 2.0.3 版本升级导致) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java index bcbd6c0..b5fa7fb 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java @@ -66,6 +66,7 @@ public class MybatisProcessor implements PluginBeanRegistrarExtend { configuration.getLanguageRegistry().register(languageDriver); } } + } PluginResourceFinder pluginResourceFinder = new PluginResourceFinder(pluginRegistryInfo); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisConfig.java index ab86ccb..75ec57f 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisConfig.java @@ -1,5 +1,6 @@ package com.gitee.starblues.extension.mybatis; +import org.apache.ibatis.session.Configuration; import org.mybatis.spring.SqlSessionFactoryBean; /** @@ -18,5 +19,12 @@ public interface SpringBootMybatisConfig extends MybatisCommonConfig{ default void oneselfConfig(SqlSessionFactoryBean sqlSessionFactoryBean){ } + /** + * 重写配置当前跟随主程序的配置 + * 只有 enableOneselfConfig 返回 false, 实现该方法才生效 + * @param configuration Mybatis Configuration 的配置 + */ + default void reSetMainConfig(Configuration configuration){ + } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java index 32f808d..d111143 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java @@ -1,10 +1,12 @@ package com.gitee.starblues.extension.mybatis.mybatisplus; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; +import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; import com.baomidou.mybatisplus.core.injector.ISqlInjector; +import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import com.gitee.starblues.extension.mybatis.MapperHandler; import com.gitee.starblues.extension.mybatis.PluginFollowCoreConfig; @@ -20,6 +22,7 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; @@ -59,8 +62,9 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig( pluginRegistryInfo.getMainApplicationContext() ); + MybatisConfiguration mybatisPlusConfiguration = followCoreConfig.getMybatisPlusConfiguration(); factory.setDataSource(followCoreConfig.getDataSource()); - factory.setConfiguration(followCoreConfig.getMybatisPlusConfiguration()); + factory.setConfiguration(mybatisPlusConfiguration); Interceptor[] interceptor = followCoreConfig.getInterceptor(); if(interceptor != null && interceptor.length > 0){ factory.setPlugins(interceptor); @@ -73,8 +77,9 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { if(languageDriver != null){ factory.setScriptingLanguageDrivers(languageDriver); } - // 配置mybatis私有的配置 - mybatisPlusFollowCoreConfig(factory, pluginRegistryInfo.getMainApplicationContext()); + // 配置mybatis-plus私有的配置 + GlobalConfig globalConfig = mybatisPlusFollowCoreConfig(factory, pluginRegistryInfo.getMainApplicationContext()); + config.reSetMainConfig(mybatisPlusConfiguration, globalConfig); } PluginResourceFinder pluginResourceFinder = new PluginResourceFinder(pluginRegistryInfo); @@ -108,35 +113,39 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { - private void mybatisPlusFollowCoreConfig(MybatisSqlSessionFactoryBean factory, - GenericApplicationContext parentApplicationContext){ - MybatisPlusProperties plusProperties = parentApplicationContext.getBean(MybatisPlusProperties.class); + private GlobalConfig mybatisPlusFollowCoreConfig(MybatisSqlSessionFactoryBean factory, + GenericApplicationContext mainApplicationContext){ + MybatisPlusProperties plusProperties = mainApplicationContext.getBean(MybatisPlusProperties.class); + GlobalConfig currentGlobalConfig = new GlobalConfig(); GlobalConfig globalConfig = plusProperties.getGlobalConfig(); - - if (parentApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, + if(globalConfig != null){ + BeanUtils.copyProperties(globalConfig, currentGlobalConfig); + } + if (mainApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, false).length > 0) { - IKeyGenerator keyGenerator = parentApplicationContext.getBean(IKeyGenerator.class); - globalConfig.getDbConfig().setKeyGenerator(keyGenerator); + IKeyGenerator keyGenerator = mainApplicationContext.getBean(IKeyGenerator.class); + currentGlobalConfig.getDbConfig().setKeyGenerator(keyGenerator); } - if (parentApplicationContext.getBeanNamesForType(MetaObjectHandler.class, + if (mainApplicationContext.getBeanNamesForType(MetaObjectHandler.class, false, false).length > 0) { - MetaObjectHandler metaObjectHandler = parentApplicationContext.getBean(MetaObjectHandler.class); - globalConfig.setMetaObjectHandler(metaObjectHandler); + MetaObjectHandler metaObjectHandler = mainApplicationContext.getBean(MetaObjectHandler.class); + currentGlobalConfig.setMetaObjectHandler(metaObjectHandler); } - if (parentApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, + if (mainApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, false).length > 0) { - IKeyGenerator keyGenerator = parentApplicationContext.getBean(IKeyGenerator.class); - globalConfig.getDbConfig().setKeyGenerator(keyGenerator); + IKeyGenerator keyGenerator = mainApplicationContext.getBean(IKeyGenerator.class); + currentGlobalConfig.getDbConfig().setKeyGenerator(keyGenerator); } - if (parentApplicationContext.getBeanNamesForType(ISqlInjector.class, false, + if (mainApplicationContext.getBeanNamesForType(ISqlInjector.class, false, false).length > 0) { - ISqlInjector iSqlInjector = parentApplicationContext.getBean(ISqlInjector.class); - globalConfig.setSqlInjector(iSqlInjector); + ISqlInjector iSqlInjector = mainApplicationContext.getBean(ISqlInjector.class); + currentGlobalConfig.setSqlInjector(iSqlInjector); } - factory.setGlobalConfig(globalConfig); + factory.setGlobalConfig(currentGlobalConfig); + return currentGlobalConfig; } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/SpringBootMybatisPlusConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/SpringBootMybatisPlusConfig.java index af4d315..0eeac07 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/SpringBootMybatisPlusConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/SpringBootMybatisPlusConfig.java @@ -1,5 +1,7 @@ package com.gitee.starblues.extension.mybatis.mybatisplus; +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import com.gitee.starblues.extension.mybatis.MybatisCommonConfig; @@ -20,5 +22,15 @@ public interface SpringBootMybatisPlusConfig extends MybatisCommonConfig { default void oneselfConfig(MybatisSqlSessionFactoryBean sqlSessionFactoryBean){ } + /** + * 重写设置配置 + * 只有 enableOneselfConfig 返回 false, 实现该方法才生效 + * @param configuration 当前 MybatisConfiguration + * @param globalConfig 当前全局配置GlobalConfig + */ + default void reSetMainConfig(MybatisConfiguration configuration, GlobalConfig globalConfig){ + + } + } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/SpringBootTkMybatisConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/SpringBootTkMybatisConfig.java index 815fea7..eeeb9ef 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/SpringBootTkMybatisConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/SpringBootTkMybatisConfig.java @@ -1,6 +1,7 @@ package com.gitee.starblues.extension.mybatis.tkmyabtis; import com.gitee.starblues.extension.mybatis.MybatisCommonConfig; +import org.apache.ibatis.session.Configuration; import org.mybatis.spring.SqlSessionFactoryBean; import tk.mybatis.mapper.entity.Config; @@ -17,17 +18,19 @@ public interface SpringBootTkMybatisConfig extends MybatisCommonConfig { * 插件自主配置Mybatis的 SqlSessionFactoryBean * SqlSessionFactoryBean 具体配置说明参考 Mybatis 官网 * @param sqlSessionFactoryBean SqlSessionFactoryBean + * @param config 插件自主配置tk的 Config 具体配置说明参考 https://gitee.com/free/Mapper/wikis/1.1-java?sort_id=208196 */ - default void oneselfConfig(SqlSessionFactoryBean sqlSessionFactoryBean){ + default void oneselfConfig(SqlSessionFactoryBean sqlSessionFactoryBean, Config config){ } /** - * 插件自主配置tk的 Config - * Config 具体配置说明参考 https://gitee.com/free/Mapper/wikis/1.1-java?sort_id=208196 - * @param config Config + * 重写配置当前跟随主程序的配置 + * 只有 enableOneselfConfig 返回 false, 实现该方法才生效 + * @param config 插件自主配置tk的 Config 具体配置说明参考 https://gitee.com/free/Mapper/wikis/1.1-java?sort_id=208196 + * @param configuration Mybatis Configuration 的配置 */ - default void oneselfConfig(Config config){ - } + default void reSetMainConfig(Configuration configuration, Config config){ + } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java index e735168..56b3d19 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java @@ -10,6 +10,7 @@ import com.gitee.starblues.utils.SpringBeanUtils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.DatabaseIdProvider; import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; @@ -57,14 +58,14 @@ public class TkMybatisProcessor implements PluginBeanRegistrarExtend { Config tkConfig = null; if(config.enableOneselfConfig()){ - config.oneselfConfig(factory); tkConfig = new Config(); - config.oneselfConfig(tkConfig); + config.oneselfConfig(factory, tkConfig); } else { GenericApplicationContext mainApplicationContext = pluginRegistryInfo.getMainApplicationContext(); PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig(mainApplicationContext); factory.setDataSource(followCoreConfig.getDataSource()); - factory.setConfiguration(followCoreConfig.getConfiguration(SpringBootMybatisExtension.Type.TK_MYBATIS)); + Configuration configuration = followCoreConfig.getConfiguration(SpringBootMybatisExtension.Type.TK_MYBATIS); + factory.setConfiguration(configuration); Interceptor[] interceptor = followCoreConfig.getInterceptor(); if(interceptor != null && interceptor.length > 0){ factory.setPlugins(interceptor); @@ -77,6 +78,7 @@ public class TkMybatisProcessor implements PluginBeanRegistrarExtend { false, false).length > 0){ tkConfig = mainApplicationContext.getBean(Config.class); } + config.reSetMainConfig(configuration, tkConfig); } MapperHelper mapperHelper = new MapperHelper(); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index e6c74e1..438add3 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -1,25 +1,25 @@ -### 特性 -- 支持通过http访问插件中静态资源 -- 支持集成`Thymeleaf` +### 集成静态资源扩展 +## 包含内容 +- 可集成插件静态资源访问 +- 可集成`Thymeleaf` -### maven 仓库地址 +## maven 仓库地址 -https://mvnrepository.com/artifact/com.gitee.starblues/springboot-plugin-framework-extension-mybatis +[maven 仓库地址](https://mvnrepository.com/artifact/com.gitee.starblues/springboot-plugin-framework-extension-mybatis) -### 集成步骤 -#### 主程序集成步骤 +## 主程序集成步骤 -一. 引入依赖 +#### 引入依赖 ```xmml com.gitee.starblues springboot-plugin-framework-extension-resources - ${latest.version} + 2.4.0-RELEASE ``` -二. 配置扩展 +#### 配置扩展 定义PluginApplication bean时, 新增该扩展。 ```java @@ -39,9 +39,9 @@ public PluginApplication pluginApplication(){ **插件的http资源url访问规则为: http://ip:port/pathPrefix(上述说明配置的值)/插件id/具体插件的资源路径** -#### 插件程序集成步骤 +## 插件程序集成步骤 -一. 以provided方式引入主程序依赖, 例如: +#### 以`provided`方式引入主程序依赖, 例如: ```xml com.gitee.starblues @@ -51,7 +51,7 @@ public PluginApplication pluginApplication(){ ``` -二. 进行配置 +#### 进行配置 1. 配置集成静态资源 @@ -99,20 +99,20 @@ public class ResourceConfig implements SpringBootThymeleafConfig { ``` -### 版本升级 +## 版本说明 +#### `2.4.1-RELEASE` 版本 +- 新增使用该扩展时可选择性包含`thymeleaf` -#### 2.4.0 版本 +#### `2.4.0-RELEASE` 版本 - 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 - 修复插件中的静态资源和主程序冲突的bug -#### 2.2.5 版本 +#### `2.2.5-RELEASE` 版本 1. 新增`Thymeleaf`模板引擎 2. 修改插件中扩展的配置方式 -#### 2.2.1 版本 +#### `2.2.1-RELEASE` 版本 修改该扩展导致无法卸载插件的bug -#### 2.1.1 版本 -新增当前扩展 - - +#### `2.1.1-RELEASE` 版本 +新增当前扩展 \ No newline at end of file diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java index 64512ff..b4c95c7 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java @@ -10,8 +10,7 @@ import org.springframework.http.CacheControl; import org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; /** @@ -33,9 +32,18 @@ public class StaticResourceExtension extends AbstractExtension { * 访问静态资源的缓存控制。默认最大1小时。主要针对http协议的缓存。 */ private static CacheControl pluginStaticResourcesCacheControl = - CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic();; + CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic(); + private final Set includes = new HashSet<>(1); + public StaticResourceExtension(){ + } + + public StaticResourceExtension(Include... includes){ + if(includes != null){ + this.includes.addAll(Arrays.asList(includes)); + } + } @Override public String key() { @@ -54,9 +62,12 @@ public class StaticResourceExtension extends AbstractExtension { @Override public List getPluginPipeProcessor(ApplicationContext mainApplicationContext) { - final List pluginPipeProcessorExtends = new ArrayList<>(); - pluginPipeProcessorExtends.add(new ThymeleafProcessor()); - return pluginPipeProcessorExtends; + if(includes.contains(Include.THYMELEAF)){ + final List pluginPipeProcessorExtends = new ArrayList<>(1); + pluginPipeProcessorExtends.add(new ThymeleafProcessor()); + return pluginPipeProcessorExtends; + } + return null; } @Override @@ -96,4 +107,8 @@ public class StaticResourceExtension extends AbstractExtension { return pluginStaticResourcesCacheControl; } + + public enum Include{ + THYMELEAF + } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java index 8ac3c56..8c8f7e9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java @@ -77,6 +77,22 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio @Value("${uploadTempPath:}") private String uploadTempPath; + /** + * 当前主程序的版本号, 用于校验插件是否可安装. + * 插件中可通过插件配置信息 requires 来指定可安装的主程序版本 + * 如果为: 0.0.0 的话, 表示不校验 + */ + @Value("${version:0.0.0}") + private String version; + + /** + * 设置为true表示插件设置的requires的版本号完全匹配version版本号才可允许插件安装, 即: requires=x.y.z + * 设置为false表示插件设置的requires的版本号小于等于version值, 插件就可安装, 即requires<=x.y.z + * 默认为false + */ + @Value("${exactVersionAllowed:false}") + private Boolean exactVersionAllowed; + /** * 启用的插件id */ @@ -168,6 +184,21 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio return enableSwaggerRefresh; } + @Override + public List sortInitPluginIds() { + return sortInitPluginIds; + } + + @Override + public String version() { + return version; + } + + @Override + public boolean exactVersionAllowed() { + return exactVersionAllowed; + } + public String getRunMode() { return runMode; } @@ -240,6 +271,22 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio this.uploadTempPath = uploadTempPath; } + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Boolean getExactVersionAllowed() { + return exactVersionAllowed; + } + + public void setExactVersionAllowed(Boolean exactVersionAllowed) { + this.exactVersionAllowed = exactVersionAllowed; + } + public Set getEnablePluginIds() { return enablePluginIds; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/ConfigurationBuilder.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/ConfigurationBuilder.java index 6e973a7..f937fd1 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/ConfigurationBuilder.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/ConfigurationBuilder.java @@ -1,7 +1,7 @@ package com.gitee.starblues.integration; import org.pf4j.RuntimeMode; -import org.springframework.util.StringUtils; +import org.pf4j.util.StringUtils; import java.util.List; import java.util.Objects; @@ -32,6 +32,9 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ private List sortInitPluginIds; private Boolean enableSwaggerRefresh; + private String version; + private Boolean exactVersionAllowed; + public ConfigurationBuilder(Builder builder) { this.runtimeMode = Objects.requireNonNull(builder.runtimeMode, "runtimeMode can't be empty"); this.pluginPath = Objects.requireNonNull(builder.pluginPath, "pluginPath can't be empty"); @@ -44,7 +47,8 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ this.enablePluginIds = builder.enablePluginIds; this.disablePluginIds = builder.disablePluginIds; this.sortInitPluginIds = builder.sortInitPluginIds; - + this.version = builder.version; + this.exactVersionAllowed = builder.exactVersionAllowed; if(builder.enable == null){ this.enable = true; } else { @@ -79,6 +83,9 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ private List sortInitPluginIds; private Boolean enableSwaggerRefresh; + private String version; + private Boolean exactVersionAllowed; + public Builder runtimeMode(RuntimeMode runtimeMode){ this.runtimeMode = runtimeMode; return this; @@ -139,6 +146,16 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ return this; } + public Builder version(String version){ + this.version = version; + return this; + } + + public Builder exactVersionAllowed(Boolean exactVersionAllowed){ + this.exactVersionAllowed = exactVersionAllowed; + return this; + } + public ConfigurationBuilder build(){ return new ConfigurationBuilder(this); } @@ -164,7 +181,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ @Override public String uploadTempPath() { - if(StringUtils.isEmpty(uploadTempPath)){ + if(StringUtils.isNullOrEmpty(uploadTempPath)){ return super.uploadTempPath(); } else { return uploadTempPath; @@ -173,7 +190,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ @Override public String backupPath() { - if(StringUtils.isEmpty(backupPath)){ + if(StringUtils.isNullOrEmpty(backupPath)){ return super.backupPath(); } else { return backupPath; @@ -182,7 +199,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ @Override public String pluginRestPathPrefix() { - if(StringUtils.isEmpty(pluginRestPathPrefix)){ + if(StringUtils.isNullOrEmpty(pluginRestPathPrefix)){ return super.pluginRestPathPrefix(); } else { return pluginRestPathPrefix; @@ -225,4 +242,20 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ } return enableSwaggerRefresh; } + + @Override + public String version() { + if(StringUtils.isNullOrEmpty(version)){ + return super.version(); + } + return version; + } + + @Override + public boolean exactVersionAllowed() { + if(exactVersionAllowed == null){ + return super.exactVersionAllowed(); + } + return exactVersionAllowed; + } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java index 12a84e2..6beb695 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java @@ -55,4 +55,14 @@ public abstract class DefaultIntegrationConfiguration implements IntegrationConf public List sortInitPluginIds() { return null; } + + @Override + public String version() { + return "0.0.0"; + } + + @Override + public boolean exactVersionAllowed() { + return false; + } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/IntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/IntegrationConfiguration.java index a15d55f..727e6ce 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/IntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/IntegrationConfiguration.java @@ -91,4 +91,19 @@ public interface IntegrationConfiguration { */ List sortInitPluginIds(); + /** + * 当前主程序的版本号, 用于校验插件是否可安装. + * 插件中可通过插件配置信息 requires 来指定可安装的主程序版本 + * @return 系统版本号, 如果为: 0.0.0 的话, 表示不校验 + */ + String version(); + + /** + * 设置为true表示插件设置的requires的版本号完全匹配version版本号才可允许插件安装, 即: requires=x.y.z + * 设置为false表示插件设置的requires的版本号小于等于version值, 插件就可安装, 即requires<=x.y.z + * 默认为false + * @return true or false + */ + boolean exactVersionAllowed(); + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java index 161c38a..6b188df 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java @@ -32,10 +32,11 @@ public class DefaultPf4jFactory implements Pf4jFactory { throw new RuntimeException("Configuration RuntimeMode is null" + configuration.environment()); } List sortInitPluginIds = configuration.sortInitPluginIds(); + DefaultPluginManager defaultPluginManager = null; if(RuntimeMode.DEVELOPMENT == environment){ // 开发环境下的插件管理者 Path path = Paths.get(getDevPluginDir(configuration)); - return new DefaultPluginManager(path){ + defaultPluginManager = new DefaultPluginManager(path){ @Override protected void initialize() { @@ -71,7 +72,7 @@ public class DefaultPf4jFactory implements Pf4jFactory { } else if(RuntimeMode.DEPLOYMENT == environment){ // 运行环境下的插件管理者 Path path = Paths.get(getProdPluginDir(configuration)); - return new DefaultPluginManager(path){ + defaultPluginManager = new DefaultPluginManager(path){ @Override protected void initialize() { @@ -99,9 +100,13 @@ public class DefaultPf4jFactory implements Pf4jFactory { } }; - } else { + } + if(defaultPluginManager == null){ throw new RuntimeException("Not found run environment " + configuration.environment()); } + defaultPluginManager.setSystemVersion(configuration.version()); + defaultPluginManager.setExactVersionAllowed(configuration.exactVersionAllowed()); + return defaultPluginManager; } -- Gitee From 9c3bad287e772f6f4b8a8a96cdcd1425c7fa344f Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Wed, 3 Feb 2021 17:45:52 +0800 Subject: [PATCH 4/9] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E9=9D=99=E6=80=81?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=97=A0=E6=B3=95=E8=AE=BF=E9=97=AE=E7=9A=84?= =?UTF-8?q?bug=202.=20=E4=BF=AE=E6=94=B9mybatis-plus=E5=B7=B2=E7=9F=A5?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/mybatis/MybatisProcessor.java | 2 +- .../mybatis/PluginResourceFinder.java | 2 +- .../mybatisplus/MybatisPlusProcessor.java | 32 ++------- .../mybatis/tkmyabtis/TkMybatisProcessor.java | 2 +- .../README.md | 5 +- .../resolver/PluginResourceResolver.java | 2 +- .../starblues/factory/PluginRegistryInfo.java | 69 +------------------ ...PluginPipeApplicationContextProcessor.java | 2 +- .../process/pipe/loader/PluginResource.java | 2 +- .../loader/load/PluginConfigFileLoader.java | 2 +- 10 files changed, 18 insertions(+), 102 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java index b5fa7fb..db83b73 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java @@ -82,7 +82,7 @@ public class MybatisProcessor implements PluginBeanRegistrarExtend { ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); try { - Resources.setDefaultClassLoader(pluginRegistryInfo.getDefaultPluginClassLoader()); + Resources.setDefaultClassLoader(pluginRegistryInfo.getPluginClassLoader()); SqlSessionFactory sqlSessionFactory = factory.getObject(); if(sqlSessionFactory == null){ throw new Exception("Get mybatis sqlSessionFactory is null"); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java index 8756ad0..45f19c6 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java @@ -36,7 +36,7 @@ public class PluginResourceFinder { public PluginResourceFinder(PluginRegistryInfo pluginRegistryInfo) { - this.classLoader = pluginRegistryInfo.getDefaultPluginClassLoader(); + this.classLoader = pluginRegistryInfo.getPluginClassLoader(); this.resourcePatternResolver = new PathMatchingResourcePatternResolver(classLoader);; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java index d111143..d5e738a 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java @@ -95,7 +95,7 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { } ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); try { - Resources.setDefaultClassLoader(pluginRegistryInfo.getDefaultPluginClassLoader()); + Resources.setDefaultClassLoader(pluginRegistryInfo.getPluginClassLoader()); SqlSessionFactory sqlSessionFactory = factory.getObject(); if(sqlSessionFactory == null){ throw new Exception("Get mybatis-plus sqlSessionFactory is null"); @@ -114,35 +114,17 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { private GlobalConfig mybatisPlusFollowCoreConfig(MybatisSqlSessionFactoryBean factory, - GenericApplicationContext mainApplicationContext){ + GenericApplicationContext mainApplicationContext){ MybatisPlusProperties plusProperties = mainApplicationContext.getBean(MybatisPlusProperties.class); GlobalConfig currentGlobalConfig = new GlobalConfig(); + currentGlobalConfig.setBanner(false); GlobalConfig globalConfig = plusProperties.getGlobalConfig(); if(globalConfig != null){ - BeanUtils.copyProperties(globalConfig, currentGlobalConfig); - } - if (mainApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, - false).length > 0) { - IKeyGenerator keyGenerator = mainApplicationContext.getBean(IKeyGenerator.class); - currentGlobalConfig.getDbConfig().setKeyGenerator(keyGenerator); - } - - if (mainApplicationContext.getBeanNamesForType(MetaObjectHandler.class, - false, false).length > 0) { - MetaObjectHandler metaObjectHandler = mainApplicationContext.getBean(MetaObjectHandler.class); - currentGlobalConfig.setMetaObjectHandler(metaObjectHandler); - } - if (mainApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, - false).length > 0) { - IKeyGenerator keyGenerator = mainApplicationContext.getBean(IKeyGenerator.class); - currentGlobalConfig.getDbConfig().setKeyGenerator(keyGenerator); - } - - if (mainApplicationContext.getBeanNamesForType(ISqlInjector.class, false, - false).length > 0) { - ISqlInjector iSqlInjector = mainApplicationContext.getBean(ISqlInjector.class); - currentGlobalConfig.setSqlInjector(iSqlInjector); + currentGlobalConfig.setDbConfig(globalConfig.getDbConfig()); + currentGlobalConfig.setIdentifierGenerator(globalConfig.getIdentifierGenerator()); + currentGlobalConfig.setMetaObjectHandler(globalConfig.getMetaObjectHandler()); + currentGlobalConfig.setSqlInjector(globalConfig.getSqlInjector()); } factory.setGlobalConfig(currentGlobalConfig); return currentGlobalConfig; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java index 56b3d19..427b60f 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java @@ -98,7 +98,7 @@ public class TkMybatisProcessor implements PluginBeanRegistrarExtend { if(xmlResource != null && xmlResource.length > 0){ factory.setMapperLocations(xmlResource); } - ClassLoader pluginClassLoader = pluginRegistryInfo.getDefaultPluginClassLoader(); + ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginClassLoader(); ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index 438add3..ef6127a 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -97,11 +97,12 @@ public class ResourceConfig implements SpringBootThymeleafConfig { } ``` +## 注意事项 +**插件中`resources`中存放的资源文件目录一定不能和主程序相同, 否则就会加载到主程序的资源** +- 例如: 主程序在`resources`中定义了 `web` 文件夹. 插件中的`resources`中不能再定义`web`文件夹来存放静态资源 ## 版本说明 -#### `2.4.1-RELEASE` 版本 -- 新增使用该扩展时可选择性包含`thymeleaf` #### `2.4.0-RELEASE` 版本 - 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java index deee547..7b4a32c 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java @@ -100,7 +100,7 @@ public class PluginResourceResolver extends AbstractResourceResolver { return null; } - ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PDA); + ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginClassLoader(); for (String classPath : classPaths) { try { PluginResource resource = new PluginResource(classPath + partialPath, pluginRegistryInfo); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java index 7577217..81fd6de 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java @@ -70,12 +70,6 @@ public class PluginRegistryInfo { */ private final Map processorInfo = new ConcurrentHashMap<>(8); - /** - * 自定义策略插件类加载器缓存 - */ - private final Map pluginClassLoaders = new ConcurrentHashMap<>(8); - - private PluginRegistryInfo(PluginWrapper pluginWrapper, PluginManager pluginManager, GenericApplicationContext mainApplicationContext, @@ -289,49 +283,10 @@ public class PluginRegistryInfo { } } - public ClassLoader getDefaultPluginClassLoader(){ + public ClassLoader getPluginClassLoader(){ return pluginWrapper.getPluginClassLoader(); } - public ClassLoader getPluginClassLoader(ClassLoaderStrategy strategy){ - PluginClassLoader pluginClassLoader = pluginClassLoaders.get(strategy); - if(pluginClassLoader != null){ - return pluginClassLoader; - } - ClassLoadingStrategy classLoadingStrategy = null; - switch (strategy){ - case APD: - classLoadingStrategy = ClassLoadingStrategy.APD; - break; - case ADP: - classLoadingStrategy = ClassLoadingStrategy.ADP; - break; - case PAD: - classLoadingStrategy = ClassLoadingStrategy.PAD; - break; - case DAP: - classLoadingStrategy = ClassLoadingStrategy.DAP; - break; - case DPA: - classLoadingStrategy = ClassLoadingStrategy.DPA; - break; - case PDA: - classLoadingStrategy = ClassLoadingStrategy.PDA; - break; - } - - pluginClassLoader = new PluginClassLoader(pluginManager, pluginWrapper.getDescriptor(), - this.getClass().getClassLoader(), classLoadingStrategy); - pluginClassLoader.addFile(pluginWrapper.getPluginPath().toFile()); - pluginClassLoaders.put(strategy, pluginClassLoader); - return pluginClassLoader; - } - - public List getPluginClassLoaders(){ - return Collections.unmodifiableList(new ArrayList<>(pluginClassLoaders.values())); - } - - public boolean isFollowingInitial() { return followingInitial; } @@ -346,22 +301,6 @@ public class PluginRegistryInfo { logger.error("Close plugin '{}'-ApplicationContext failure", getPluginWrapper().getPluginId(), e); } - // 关闭ClassClassLoader - try { - for (ClassLoader pluginClassLoader : pluginClassLoaders.values()) { - if (pluginClassLoader instanceof Closeable) { - try { - ((Closeable) pluginClassLoader).close(); - } catch (IOException e) { - logger.error("Close plugin '{}'-ClassLoader-'{}' failure", getPluginWrapper().getPluginId(), - pluginClassLoader.getClass().getName(), e); - } - } - } - } finally { - pluginClassLoaders.clear(); - } - // 清除数据集合 try { extensionMap.clear(); @@ -385,11 +324,5 @@ public class PluginRegistryInfo { } - public enum ClassLoaderStrategy{ - APD, ADP, PAD, DAP, DPA, PDA - } - - - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index 0b0757e..e24af53 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -48,7 +48,7 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso addBeanExtend(pluginRegistryInfo); ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { - Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getDefaultPluginClassLoader()); + Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getPluginClassLoader()); pluginApplicationContext.refresh(); } finally { Thread.currentThread().setContextClassLoader(contextClassLoader); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java index 8df9694..59543fb 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java @@ -47,7 +47,7 @@ public class PluginResource implements Resource { this.path = pathToUse; PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - this.classLoader = pluginRegistryInfo.getDefaultPluginClassLoader(); + this.classLoader = pluginRegistryInfo.getPluginClassLoader(); this.pluginWrapper = pluginWrapper; this.lastModified = pluginRegistryInfo.getBasePlugin().getBasePluginExtend().getStartTimestamp(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java index 85497ac..eccbb9b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java @@ -49,7 +49,7 @@ public class PluginConfigFileLoader implements PluginResourceLoader { BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); suppliers.add(findConfigRoot()); suppliers.add(findPluginRoot(basePlugin)); - suppliers.add(findClassPath(pluginRegistryInfo.getDefaultPluginClassLoader())); + suppliers.add(findClassPath(pluginRegistryInfo.getPluginClassLoader())); for (Supplier supplier : suppliers) { -- Gitee From 5d49712ad3eea82c0622fb1bf449e94d352a5038 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 5 Feb 2021 19:35:13 +0800 Subject: [PATCH 5/9] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E6=89=A9=E5=B1=95=E6=96=B9=E5=BC=8F,=20?= =?UTF-8?q?=E5=8F=AF=E6=A0=B9=E6=8D=AE=E6=B3=A8=E8=A7=A3=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E6=89=A9=E5=B1=95=E5=AE=9E=E7=8E=B0=202.=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6=E4=B8=AD=E5=8F=AF=E9=85=8D?= =?UTF-8?q?=E7=BD=AE`=E6=8B=A6=E6=88=AA=E5=99=A8`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/main/config/MainInterceptor.java | 32 ++++ .../main/config/PluginConfiguration.java | 5 + .../example/main/extract/ExtractExample.java | 50 ++++++ .../example/main/rest/ExtractController.java | 57 +++++++ .../example/plugin1/PluginInterceptor1.java | 22 +++ .../example/plugin1/PluginInterceptorR.java | 27 ++++ .../plugin1/extract/PluginExtract.java | 33 ++++ .../src/main/resources/plugin.properties | 3 +- .../example/plugin2/PluginInterceptorR.java | 29 ++++ .../plugin2/extract/PluginExtract.java | 33 ++++ .../plugin2/rest/ExtractController.java | 57 +++++++ .../mybatisplus/MybatisPlusProcessor.java | 2 +- .../gitee/starblues/annotation/Extract.java | 33 ++++ .../starblues/factory/PluginRegistryInfo.java | 6 +- .../starblues/factory/SpringBeanRegister.java | 34 ++-- .../pipe/PluginInterceptorsPipeProcessor.java | 129 ++++++++++++++++ ...PluginPipeApplicationContextProcessor.java | 39 +---- .../pipe/PluginPipeProcessorFactory.java | 13 +- .../process/pipe/bean/BasicBeanRegistrar.java | 2 +- .../pipe/bean/PluginInsetBeanRegistrar.java | 46 ++++++ .../pipe/bean/inset/ExtractFactoryInset.java | 22 +++ .../pipe/bean/inset/PluginInsetBean.java | 23 +++ .../pipe/bean/inset/PluginUtilsInset.java | 26 ++++ .../pipe/classs/group/ComponentGroup.java | 9 +- .../pipe/classs/group/ControllerGroup.java | 2 +- .../pipe/extract/ExtractCoordinate.java | 94 +++++++++++ .../process/pipe/extract/ExtractFactory.java | 83 ++++++++++ .../extract/PluginExtractPipeProcessor.java | 53 +++++++ .../PluginInterceptorRegister.java | 17 ++ .../PluginInterceptorRegistration.java | 146 ++++++++++++++++++ .../PluginInterceptorRegistry.java | 93 +++++++++++ .../bean/PluginControllerPostProcessor.java | 43 +----- .../starblues/utils/AnnotationsUtils.java | 1 + .../gitee/starblues/utils/CommonUtils.java | 83 ++++++++++ .../starblues/utils/CommonUtilsTest.java | 21 +++ 35 files changed, 1271 insertions(+), 97 deletions(-) create mode 100644 example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/MainInterceptor.java create mode 100644 example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/ExtractExample.java create mode 100644 example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptor1.java create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/extract/PluginExtract.java create mode 100644 example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/PluginInterceptorR.java create mode 100644 example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/extract/PluginExtract.java create mode 100644 example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInterceptorsPipeProcessor.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/ExtractFactoryInset.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginInsetBean.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginUtilsInset.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegister.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistration.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java create mode 100644 springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/CommonUtilsTest.java diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/MainInterceptor.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/MainInterceptor.java new file mode 100644 index 0000000..cd0f938 --- /dev/null +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/MainInterceptor.java @@ -0,0 +1,32 @@ +package com.basic.example.main.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.config.annotation.InterceptorRegistration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author starBlues + * @version 1.0 + */ +@Configuration +public class MainInterceptor implements HandlerInterceptor, WebMvcConfigurer { + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("进入主拦截器"); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + //注册TestInterceptor拦截器 + InterceptorRegistration registration = registry.addInterceptor(new MainInterceptor()); + registration.addPathPatterns("/**"); + } + +} diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java index 16eb1c9..3eb0e28 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java @@ -100,6 +100,11 @@ public class PluginConfiguration extends DefaultIntegrationConfiguration { return true; } + @Override + public String version() { + return "1.2.6"; + } + public String getRunMode() { return runMode; } diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/ExtractExample.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/ExtractExample.java new file mode 100644 index 0000000..d8814ce --- /dev/null +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/ExtractExample.java @@ -0,0 +1,50 @@ +package com.basic.example.main.extract; + +/** + * @author starBlues + * @version 1.0 + */ +public interface ExtractExample { + + void exe(); + + void exe(String name); + + void exe(Info info); + + Info exeInfo(Info info); + + + class Info{ + private String name; + private Integer age; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "Info{" + + "name='" + name + '\'' + + ", age=" + age + + '}'; + } + } + + + + +} diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java new file mode 100644 index 0000000..34abdc0 --- /dev/null +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java @@ -0,0 +1,57 @@ +package com.basic.example.main.rest; + +import com.basic.example.main.extract.ExtractExample; +import com.gitee.starblues.factory.process.pipe.extract.ExtractCoordinate; +import com.gitee.starblues.factory.process.pipe.extract.ExtractFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author starBlues + * @version 1.0 + */ +@RestController +@RequestMapping("/extract") +public class ExtractController { + + @Resource + private ExtractFactory extractFactory; + + + @GetMapping("{name}/exe") + public void exe(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + extractExample.exe(); + } + + @GetMapping("{name}/exeName") + public void exeName(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + extractExample.exe("name"); + } + + + @GetMapping("{name}/exeInfo") + public void exeInfo(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample.Info info = new ExtractExample.Info(); + info.setName("plugin2"); + info.setAge(3); + extractExample.exe(info); + } + + + @GetMapping("{name}/exeR") + public ExtractExample.Info exeInfoR(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample.Info info = new ExtractExample.Info(); + return extractExample.exeInfo(info); + } + + + +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptor1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptor1.java new file mode 100644 index 0000000..f58fdaa --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptor1.java @@ -0,0 +1,22 @@ +package com.basic.example.plugin1; + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author starBlues + * @version 1.0 + */ +@Component +public class PluginInterceptor1 implements HandlerInterceptor { + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("进入插件1拦截器"); + } + +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java new file mode 100644 index 0000000..b2e177e --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java @@ -0,0 +1,27 @@ +package com.basic.example.plugin1; + +import com.gitee.starblues.factory.process.pipe.interceptor.PluginInterceptorRegister; +import com.gitee.starblues.factory.process.pipe.interceptor.PluginInterceptorRegistration; +import com.gitee.starblues.factory.process.pipe.interceptor.PluginInterceptorRegistry; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; + +import javax.annotation.Resource; + +/** + * @author starBlues + * @version 1.0 + */ +@Component +public class PluginInterceptorR implements PluginInterceptorRegister { + + @Resource + private PluginInterceptor1 pluginInterceptor1; + + + @Override + public void registry(PluginInterceptorRegistry registry) { + registry.addInterceptor(pluginInterceptor1, PluginInterceptorRegistry.Type.PLUGIN) + .addPathPatterns("plugin1/**"); + } +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/extract/PluginExtract.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/extract/PluginExtract.java new file mode 100644 index 0000000..2278fc9 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/extract/PluginExtract.java @@ -0,0 +1,33 @@ +package com.basic.example.plugin1.extract; + +import com.basic.example.main.extract.ExtractExample; +import com.gitee.starblues.annotation.Extract; + +/** + * @author starBlues + * @version 1.0 + */ +@Extract(bus = "PluginExtract1") +public class PluginExtract implements ExtractExample { + @Override + public void exe() { + System.out.println(PluginExtract.class.getName()); + } + + @Override + public void exe(String name) { + System.out.println(PluginExtract.class.getName() + ": name"); + } + + @Override + public void exe(Info info) { + System.out.println(PluginExtract.class.getName() + ": " + info); + } + + @Override + public Info exeInfo(Info info) { + info.setName("Plugin1-PluginExtract1"); + info.setAge(0); + return info; + } +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties index ab2b15b..f447d1a 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties @@ -1,4 +1,5 @@ plugin.id=basic-example-plugin1 plugin.class=com.basic.example.plugin1.DefinePlugin plugin.version=2.4.0-RELEASE -plugin.provider=StarBlues \ No newline at end of file +plugin.provider=StarBlues +plugin.requires=1.2.6 \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/PluginInterceptorR.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/PluginInterceptorR.java new file mode 100644 index 0000000..987ccf4 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/PluginInterceptorR.java @@ -0,0 +1,29 @@ +package com.basic.example.plugin2; + +import com.gitee.starblues.factory.process.pipe.interceptor.PluginInterceptorRegister; +import com.gitee.starblues.factory.process.pipe.interceptor.PluginInterceptorRegistry; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author starBlues + * @version 1.0 + */ +@Component +public class PluginInterceptorR implements PluginInterceptorRegister, HandlerInterceptor { + + @Override + public void registry(PluginInterceptorRegistry registry) { + registry.addInterceptor(this, PluginInterceptorRegistry.Type.PLUGIN); + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("拦截器进入插件2"); + } +} diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/extract/PluginExtract.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/extract/PluginExtract.java new file mode 100644 index 0000000..74de2d6 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/extract/PluginExtract.java @@ -0,0 +1,33 @@ +package com.basic.example.plugin2.extract; + +import com.basic.example.main.extract.ExtractExample; +import com.gitee.starblues.annotation.Extract; + +/** + * @author starBlues + * @version 1.0 + */ +@Extract(bus = "PluginExtract2") +public class PluginExtract implements ExtractExample { + @Override + public void exe() { + System.out.println(PluginExtract.class.getName()); + } + + @Override + public void exe(String name) { + System.out.println(PluginExtract.class.getName() + ": name"); + } + + @Override + public void exe(Info info) { + System.out.println(PluginExtract.class.getName() + ": " + info); + } + + @Override + public Info exeInfo(Info info) { + info.setName("plugin2-PluginExtract2"); + info.setAge(0); + return info; + } +} diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java new file mode 100644 index 0000000..8ffdf7a --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java @@ -0,0 +1,57 @@ +package com.basic.example.plugin2.rest; + +import com.basic.example.main.extract.ExtractExample; +import com.gitee.starblues.factory.process.pipe.extract.ExtractCoordinate; +import com.gitee.starblues.factory.process.pipe.extract.ExtractFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author starBlues + * @version 1.0 + */ +@RestController +@RequestMapping("/extract") +public class ExtractController { + + @Resource + private ExtractFactory extractFactory; + + + @GetMapping("{name}/exe") + public void exe(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + extractExample.exe(); + } + + @GetMapping("{name}/exeName") + public void exeName(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + extractExample.exe("name"); + } + + + @GetMapping("{name}/exeInfo") + public void exeInfo(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample.Info info = new ExtractExample.Info(); + info.setName("plugin2"); + info.setAge(3); + extractExample.exe(info); + } + + + @GetMapping("{name}/exeR") + public ExtractExample.Info exeInfoR(@PathVariable("name") String name){ + ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample.Info info = new ExtractExample.Info(); + return extractExample.exeInfo(info); + } + + + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java index d5e738a..e372ec6 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java @@ -30,7 +30,7 @@ import org.springframework.core.io.Resource; /** * springboot-mybatis plus 处理者 * @author starBlues - * @version 2.4.0 + * @version 2.4.1 */ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java new file mode 100644 index 0000000..5b262ee --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java @@ -0,0 +1,33 @@ +package com.gitee.starblues.annotation; + +import java.lang.annotation.*; + +/** + * 基于业务的扩展注解 + * @author starBlues + * @version 2.4.1 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Extract { + + /** + * 业务 + * @return 业务标志 + */ + String bus(); + + /** + * 场景 + * @return 场景标志 + */ + String useCase() default ""; + + /** + * 用例 + * @return 用例标志 + */ + String scene() default ""; + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java index 81fd6de..338ad1d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginRegistryInfo.java @@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap; * 注册的插件信息 * * @author starBlues - * @version 2.4.0 + * @version 2.4.1 */ public class PluginRegistryInfo { @@ -316,13 +316,11 @@ public class PluginRegistryInfo { private void closePluginApplicationContext() { try { - PluginPipeApplicationContextProcessor.removeBeanExtend(this); + getSpringBeanRegister().destroySingletons(); pluginApplicationContext.close(); } catch (Exception e){ logger.error("Close plugin '{}' ApplicationContext failure", getPluginWrapper().getPluginId(), e); } } - - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java index 7c8f6a5..ddb1393 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java @@ -15,21 +15,21 @@ import java.util.function.Consumer; * Spring bean注册者, 向Spring注册Bean时, 必须使用该对象进行注册 * * @author starBlues - * @version 2.4.0 + * @version 2.4.1 */ public class SpringBeanRegister { private static final Logger logger = LoggerFactory.getLogger(SpringBeanRegister.class); - private final GenericApplicationContext pluginApplicationContext; + private final GenericApplicationContext applicationContext; - public SpringBeanRegister(GenericApplicationContext pluginApplicationContext){ - this.pluginApplicationContext = pluginApplicationContext; + public SpringBeanRegister(GenericApplicationContext applicationContext){ + this.applicationContext = applicationContext; } public boolean exist(String name){ - return pluginApplicationContext.containsBean(name); + return applicationContext.containsBean(name); } /** @@ -56,9 +56,9 @@ public class SpringBeanRegister { beanDefinition.setBeanClass(aClass); BeanNameGenerator beanNameGenerator = new PluginAnnotationBeanNameGenerator(pluginId); - String beanName = beanNameGenerator.generateBeanName(beanDefinition, pluginApplicationContext); + String beanName = beanNameGenerator.generateBeanName(beanDefinition, applicationContext); - if(pluginApplicationContext.containsBean(beanName)){ + if(applicationContext.containsBean(beanName)){ String error = MessageFormat.format("Bean name {0} already exist of {1}", beanName, aClass.getName()); logger.debug(error); @@ -67,7 +67,7 @@ public class SpringBeanRegister { if(consumer != null){ consumer.accept(beanDefinition); } - pluginApplicationContext.registerBeanDefinition(beanName, beanDefinition); + applicationContext.registerBeanDefinition(beanName, beanDefinition); return beanName; } @@ -94,7 +94,7 @@ public class SpringBeanRegister { Consumer consumer) { AnnotatedGenericBeanDefinition beanDefinition = new AnnotatedGenericBeanDefinition(aClass); - if(pluginApplicationContext.containsBean(beanName)){ + if(applicationContext.containsBean(beanName)){ String error = MessageFormat.format("Bean name {0} already exist of {1}", beanName, aClass.getName()); throw new RuntimeException(error); @@ -102,7 +102,7 @@ public class SpringBeanRegister { if(consumer != null){ consumer.accept(beanDefinition); } - pluginApplicationContext.registerBeanDefinition(beanName, beanDefinition); + applicationContext.registerBeanDefinition(beanName, beanDefinition); } /** @@ -111,7 +111,7 @@ public class SpringBeanRegister { * @param object 对象 */ public void registerSingleton(String name, Object object){ - DefaultListableBeanFactory listableBeanFactory = pluginApplicationContext.getDefaultListableBeanFactory(); + DefaultListableBeanFactory listableBeanFactory = applicationContext.getDefaultListableBeanFactory(); if(!listableBeanFactory.containsSingleton(name)){ listableBeanFactory.registerSingleton(name, object); } @@ -123,12 +123,20 @@ public class SpringBeanRegister { * @param name 单例名称 */ public void destroySingleton(String name){ - DefaultListableBeanFactory listableBeanFactory = pluginApplicationContext.getDefaultListableBeanFactory(); + DefaultListableBeanFactory listableBeanFactory = applicationContext.getDefaultListableBeanFactory(); if(listableBeanFactory.containsSingleton(name)){ listableBeanFactory.destroySingleton(name); } } + /** + * 销毁所有单例 + */ + public void destroySingletons(){ + DefaultListableBeanFactory listableBeanFactory = applicationContext.getDefaultListableBeanFactory(); + listableBeanFactory.destroySingletons(); + } + /** * 卸载bean * @param pluginId 插件id @@ -136,7 +144,7 @@ public class SpringBeanRegister { */ public void unregister(String pluginId, String beanName){ try { - pluginApplicationContext.removeBeanDefinition(beanName); + applicationContext.removeBeanDefinition(beanName); } catch (Exception e){ logger.error("Remove plugin '{}' bean {} error. {}", pluginId, beanName, e.getMessage()); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInterceptorsPipeProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInterceptorsPipeProcessor.java new file mode 100644 index 0000000..9783987 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInterceptorsPipeProcessor.java @@ -0,0 +1,129 @@ +package com.gitee.starblues.factory.process.pipe; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.pipe.interceptor.PluginInterceptorRegister; +import com.gitee.starblues.factory.process.pipe.interceptor.PluginInterceptorRegistry; +import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.utils.ClassUtils; +import com.gitee.starblues.utils.CommonUtils; +import com.gitee.starblues.utils.SpringBeanUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.web.context.request.WebRequestInterceptor; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.handler.AbstractHandlerMapping; +import org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 插件 SpringMVC 拦截器的处理 + * @author starBlues + * @version 2.4.1 + */ +public class PluginInterceptorsPipeProcessor implements PluginPipeProcessor{ + + private final ApplicationContext mainApplicationContext; + private final IntegrationConfiguration configuration; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final static String INTERCEPTORS = "interceptors"; + + private AbstractHandlerMapping handlerMapping; + + + public PluginInterceptorsPipeProcessor(ApplicationContext mainApplicationContext){ + this.mainApplicationContext = mainApplicationContext; + this.configuration = mainApplicationContext.getBean(IntegrationConfiguration.class); + } + + @Override + public void initialize() throws Exception { + handlerMapping = SpringBeanUtils.getExistBean(mainApplicationContext, + AbstractHandlerMapping.class); + if(handlerMapping == null){ + logger.warn("Not found AbstractHandlerMapping, Plugin interceptor can't use"); + } + } + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + if(handlerMapping == null){ + return; + } + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + List interceptorRegisters = SpringBeanUtils.getBeans(pluginApplicationContext, + PluginInterceptorRegister.class); + List interceptorsObjects = new ArrayList<>(); + List adaptedInterceptors = getAdaptedInterceptors(); + if(adaptedInterceptors == null){ + return; + } + String pluginRestPrefix = CommonUtils.getPluginRestPrefix(configuration, pluginRegistryInfo.getPluginWrapper().getPluginId()); + + for (PluginInterceptorRegister interceptorRegister : interceptorRegisters) { + PluginInterceptorRegistry interceptorRegistry = new PluginInterceptorRegistry(pluginRestPrefix); + interceptorRegister.registry(interceptorRegistry); + List interceptors = interceptorRegistry.getInterceptors(); + if(interceptors == null || interceptors.isEmpty()){ + continue; + } + for (Object interceptor : interceptors) { + HandlerInterceptor handlerInterceptor = adaptInterceptor(interceptor); + adaptedInterceptors.add(handlerInterceptor); + interceptorsObjects.add(handlerInterceptor); + } + } + pluginRegistryInfo.addExtension(INTERCEPTORS, interceptorsObjects); + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + if(handlerMapping == null){ + return; + } + List interceptorsObjects = pluginRegistryInfo.getExtension(INTERCEPTORS); + if(interceptorsObjects == null || interceptorsObjects.isEmpty()){ + return; + } + List adaptedInterceptors = getAdaptedInterceptors(); + if(adaptedInterceptors == null){ + return; + } + for (HandlerInterceptor interceptor : interceptorsObjects) { + adaptedInterceptors.remove(interceptor); + } + } + + /** + * 得到拦截器存储者 + * @return List + */ + private List getAdaptedInterceptors(){ + try { + return ClassUtils.getReflectionField(handlerMapping, "adaptedInterceptors", List.class); + } catch (IllegalAccessException e) { + logger.error("Can't get 'adaptedInterceptors' from AbstractHandlerMapping, so " + + "You can't use HandlerInterceptor. {} ", e.getMessage()); + return null; + } + } + + /** + * 转换拦截器 + * @param interceptor interceptor + * @return HandlerInterceptor + */ + private HandlerInterceptor adaptInterceptor(Object interceptor) { + if (interceptor instanceof HandlerInterceptor) { + return (HandlerInterceptor) interceptor; + } else if (interceptor instanceof WebRequestInterceptor) { + return new WebRequestHandlerInterceptorAdapter((WebRequestInterceptor) interceptor); + } else { + throw new IllegalArgumentException("Interceptor type not supported: " + interceptor.getClass().getName()); + } + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index e24af53..dc69655 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -3,13 +3,15 @@ package com.gitee.starblues.factory.process.pipe; import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.*; -import com.gitee.starblues.realize.PluginUtils; -import org.pf4j.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.web.servlet.HandlerExecutionChain; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.handler.AbstractHandlerMapping; +import javax.servlet.ServletContext; import java.util.*; /** @@ -25,12 +27,14 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso private final List pluginBeanDefinitionRegistrars = new ArrayList<>(); private final ApplicationContext mainApplicationContext; + public PluginPipeApplicationContextProcessor(ApplicationContext mainApplicationContext) { this.mainApplicationContext = mainApplicationContext; } @Override public void initialize() throws Exception { + pluginBeanDefinitionRegistrars.add(new PluginInsetBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigFileBeanRegistrar(mainApplicationContext)); pluginBeanDefinitionRegistrars.add(new BasicBeanRegistrar()); @@ -45,7 +49,6 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso for (PluginBeanRegistrar pluginBeanDefinitionRegistrar : pluginBeanDefinitionRegistrars) { pluginBeanDefinitionRegistrar.registry(pluginRegistryInfo); } - addBeanExtend(pluginRegistryInfo); ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getPluginClassLoader()); @@ -72,34 +75,4 @@ public class PluginPipeApplicationContextProcessor implements PluginPipeProcesso } } - - /** - * 向插件ApplicationContext容器中添加扩展的bean - * @param pluginRegistryInfo 插件注册信息 - */ - private void addBeanExtend(PluginRegistryInfo pluginRegistryInfo){ - GenericApplicationContext parentApplicationContext = pluginRegistryInfo.getMainApplicationContext(); - GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); - PluginUtils pluginUtils = new PluginUtils(parentApplicationContext, - pluginApplicationContext, - pluginRegistryInfo.getPluginWrapper().getDescriptor()); - String name = pluginUtils.getClass().getName(); - pluginApplicationContext.getBeanFactory().registerSingleton(name, pluginUtils); - pluginRegistryInfo.addExtension("PluginUtilsName", name); - } - - - /** - * 移除扩展绑定 - * @param pluginRegistryInfo 插件注册信息 - */ - public static void removeBeanExtend(PluginRegistryInfo pluginRegistryInfo) { - String pluginUtilsName = pluginRegistryInfo.getExtension("PluginUtilsName"); - if(StringUtils.isNullOrEmpty(pluginUtilsName)){ - return; - } - GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); - pluginApplicationContext.getDefaultListableBeanFactory().destroySingleton(pluginUtilsName); - } - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java index e75b260..23a604c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessorFactory.java @@ -3,6 +3,7 @@ package com.gitee.starblues.factory.process.pipe; import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.classs.PluginClassProcess; +import com.gitee.starblues.factory.process.pipe.extract.PluginExtractPipeProcessor; import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoadFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,11 +22,11 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final ApplicationContext applicationContext; + private final ApplicationContext mainApplicationContext; private final List pluginPipeProcessors = new ArrayList<>(); - public PluginPipeProcessorFactory(ApplicationContext applicationContext){ - this.applicationContext = applicationContext; + public PluginPipeProcessorFactory(ApplicationContext mainApplicationContext){ + this.mainApplicationContext = mainApplicationContext; } @@ -40,9 +41,13 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { // 添加前置扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPreProcessorExtends()); // 插件的ApplicationContext处理者 - pluginPipeProcessors.add(new PluginPipeApplicationContextProcessor(applicationContext)); + pluginPipeProcessors.add(new PluginPipeApplicationContextProcessor(mainApplicationContext)); + // 拦截器处理者 + pluginPipeProcessors.add(new PluginInterceptorsPipeProcessor(mainApplicationContext)); // 插件ConfigBean处理者 pluginPipeProcessors.add(new PluginConfigBeanPipeProcessor()); + // 插件扩展的流处理者 + pluginPipeProcessors.add(new PluginExtractPipeProcessor(mainApplicationContext)); // 添加扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPipeProcessorExtends()); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java index 69077fb..5e8fedf 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java @@ -50,7 +50,7 @@ public class BasicBeanRegistrar implements PluginBeanRegistrar { if(aClass == null){ continue; } - String beanName = springBeanRegister.register(pluginId, aClass); + springBeanRegister.register(pluginId, aClass); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java new file mode 100644 index 0000000..02557b1 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginInsetBeanRegistrar.java @@ -0,0 +1,46 @@ +package com.gitee.starblues.factory.process.pipe.bean; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.SpringBeanRegister; +import com.gitee.starblues.factory.process.pipe.bean.inset.ExtractFactoryInset; +import com.gitee.starblues.factory.process.pipe.bean.inset.PluginInsetBean; +import com.gitee.starblues.factory.process.pipe.bean.inset.PluginUtilsInset; +import org.pf4j.util.StringUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 系统内嵌的Bean注册者 + * @author starBlues + * @version 1.0 + */ +public class PluginInsetBeanRegistrar implements PluginBeanRegistrar{ + + private final List pluginInsetBeans = new ArrayList<>(2); + + public PluginInsetBeanRegistrar() { + this.pluginInsetBeans.add(new PluginUtilsInset()); + this.pluginInsetBeans.add(new ExtractFactoryInset()); + } + + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); + for (PluginInsetBean pluginInsetBean : this.pluginInsetBeans) { + String beanName = pluginInsetBean.getBeanName(); + Object bean = pluginInsetBean.getBean(pluginRegistryInfo); + if(bean == null){ + continue; + } + if(StringUtils.isNullOrEmpty(beanName)){ + beanName = bean.getClass().getName(); + } + springBeanRegister.registerSingleton(beanName, bean); + } + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/ExtractFactoryInset.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/ExtractFactoryInset.java new file mode 100644 index 0000000..26db0af --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/ExtractFactoryInset.java @@ -0,0 +1,22 @@ +package com.gitee.starblues.factory.process.pipe.bean.inset; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.pipe.extract.ExtractFactory; + +/** + * ExtractFactory 扩展工厂注册者 + * @author starBlues + * @version 2.4.1 + */ +public class ExtractFactoryInset implements PluginInsetBean{ + + @Override + public String getBeanName() { + return ExtractFactoryInset.class.getName(); + } + + @Override + public Object getBean(PluginRegistryInfo pluginRegistryInfo) { + return ExtractFactory.getInstant(); + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginInsetBean.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginInsetBean.java new file mode 100644 index 0000000..924086a --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginInsetBean.java @@ -0,0 +1,23 @@ +package com.gitee.starblues.factory.process.pipe.bean.inset; + +import com.gitee.starblues.factory.PluginRegistryInfo; + +/** + * @author starBlues + * @version 2.4.1 + */ +public interface PluginInsetBean { + + /** + * 得到bean名称 + * @return bean 名称 + */ + String getBeanName(); + + /** + * 得到bean对象 + * @return 对象 + */ + Object getBean(PluginRegistryInfo pluginRegistryInfo); + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginUtilsInset.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginUtilsInset.java new file mode 100644 index 0000000..5d720d9 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/inset/PluginUtilsInset.java @@ -0,0 +1,26 @@ +package com.gitee.starblues.factory.process.pipe.bean.inset; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.realize.PluginUtils; +import org.springframework.context.support.GenericApplicationContext; + +/** + * PluginUtils 对象注册者 + * @author starBlues + * @version 2.4.1 + */ +public class PluginUtilsInset implements PluginInsetBean{ + @Override + public String getBeanName() { + return "PluginUtilsName"; + } + + @Override + public Object getBean(PluginRegistryInfo pluginRegistryInfo) { + GenericApplicationContext parentApplicationContext = pluginRegistryInfo.getMainApplicationContext(); + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + return new PluginUtils(parentApplicationContext, + pluginApplicationContext, + pluginRegistryInfo.getPluginWrapper().getDescriptor()); + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ComponentGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ComponentGroup.java index fd76f16..99eaed9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ComponentGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ComponentGroup.java @@ -1,5 +1,6 @@ package com.gitee.starblues.factory.process.pipe.classs.group; +import com.gitee.starblues.annotation.Extract; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; @@ -9,6 +10,8 @@ import org.springframework.stereotype.Controller; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RestController; +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; @@ -50,8 +53,10 @@ public class ComponentGroup implements PluginClassGroup { @Override public boolean filter(Class aClass) { - boolean have = AnnotationsUtils.haveAnnotations(aClass, false, Component.class, Service.class, - Controller.class, RestController.class, Configuration.class); + boolean have = AnnotationsUtils.haveAnnotations(aClass, false, + Component.class, Service.class, + Controller.class, RestController.class, Configuration.class, + Extract.class); if(!have){ return false; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ControllerGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ControllerGroup.java index eeeacd1..4a9bb31 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ControllerGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ControllerGroup.java @@ -18,7 +18,7 @@ public class ControllerGroup implements PluginClassGroup { /** * spring @Controller @RestController 注解bean */ - public static final String GROUP_ID= "spring_controller"; + public static final String GROUP_ID = "spring_controller"; @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java new file mode 100644 index 0000000..b68341e --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java @@ -0,0 +1,94 @@ +package com.gitee.starblues.factory.process.pipe.extract; + +import com.gitee.starblues.annotation.Extract; +import org.pf4j.util.StringUtils; + +import java.util.Objects; + +/** + * 执行器坐标 + * @author starBlues + * @version 1.0 + */ +public class ExtractCoordinate { + + private String bus; + private String useCase; + private String scene; + + ExtractCoordinate(String bus, String useCase, String scene) { + this.bus = bus; + this.useCase = useCase; + this.scene = scene; + } + + + ExtractCoordinate(Extract extract) { + this.bus = extract.bus(); + this.useCase = extract.useCase(); + this.scene = extract.scene(); + } + + public static ExtractCoordinate build(String bus) { + return new ExtractCoordinate(bus, null, null); + } + + public static ExtractCoordinate build(String bus, String useCase) { + return new ExtractCoordinate(bus, useCase, null); + } + + public static ExtractCoordinate build(String bus, String useCase, String scene) { + return new ExtractCoordinate(bus, useCase, scene); + } + + public String getBus() { + return bus; + } + + public String getUseCase() { + return useCase; + } + + public String getScene() { + return scene; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ExtractCoordinate)) return false; + ExtractCoordinate that = (ExtractCoordinate) o; + if(StringUtils.isNotNullOrEmpty(bus) && + StringUtils.isNotNullOrEmpty(useCase) && + StringUtils.isNotNullOrEmpty(scene)){ + return Objects.equals(getBus(), that.getBus()) && + Objects.equals(getUseCase(), that.getUseCase()) && + Objects.equals(getScene(), that.getScene()); + } + + if(StringUtils.isNotNullOrEmpty(bus) && StringUtils.isNotNullOrEmpty(useCase)){ + return Objects.equals(getBus(), that.getBus()) && + Objects.equals(getUseCase(), that.getUseCase()); + } + + if(StringUtils.isNotNullOrEmpty(bus)){ + return Objects.equals(getBus(), that.getBus()); + } + + return false; + } + + @Override + public int hashCode() { + return Objects.hash(getBus(), getUseCase(), getScene()); + } + + @Override + public String toString() { + return "ExtractCoordinate{" + + "bus='" + bus + '\'' + + ", useCase='" + useCase + '\'' + + ", scene='" + scene + '\'' + + '}'; + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java new file mode 100644 index 0000000..e4f92cb --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java @@ -0,0 +1,83 @@ +package com.gitee.starblues.factory.process.pipe.extract; + +import com.gitee.starblues.annotation.Extract; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 扩展工厂 + * @author starBlues + * @version 2.4.1 + */ +public class ExtractFactory { + + private Map> extractMap = new ConcurrentHashMap<>(); + + private static ExtractFactory EXTRACT_FACTORY = new ExtractFactory(); + + private ExtractFactory(){} + + /** + * 得到全局的扩展工厂 + * @return ExtractFactory + */ + public static ExtractFactory getInstant(){ + return EXTRACT_FACTORY; + } + + /** + * 添加扩展 + * @param pluginId 插件id + * @param extractObject 扩展的bean + */ + void add(String pluginId, Object extractObject){ + if(extractObject == null){ + return; + } + Extract extract = getExtract(extractObject); + if(extract == null){ + return; + } + Map extractObjects = extractMap.computeIfAbsent(pluginId, k -> new ConcurrentHashMap<>()); + extractObjects.put(new ExtractCoordinate(extract), extractObject); + } + + /** + * 根据插件id来移除扩展 + * @param pluginId 插件id + */ + void remove(String pluginId){ + extractMap.remove(pluginId); + } + + /** + * 得到扩展 + * @param coordinate 扩展的坐标 + * @param 扩展的泛型 + * @return 扩展实例, 如果不存在则抛出 RuntimeException 异常 + */ + public T getExtract(ExtractCoordinate coordinate){ + for (Map value : extractMap.values()) { + Object o = value.get(coordinate); + if(o != null){ + return (T) o; + } + } + throw new RuntimeException("Not found " + coordinate); + } + + /** + * 得到扩展的对象注解 + * @param extractObject 扩展对象 + * @return Extract 注解 + */ + private Extract getExtract(Object extractObject){ + Extract annotation = extractObject.getClass().getAnnotation(Extract.class); + if(annotation == null){ + return null; + } + return annotation; + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java new file mode 100644 index 0000000..f6c30e8 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java @@ -0,0 +1,53 @@ +package com.gitee.starblues.factory.process.pipe.extract; + +import com.gitee.starblues.annotation.Extract; +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.SpringBeanRegister; +import com.gitee.starblues.factory.process.pipe.PluginPipeProcessor; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.GenericApplicationContext; + +import java.util.Map; + +/** + * 插件扩展处理者 + * @author starBlues + * @version 2.4.1 + */ +public class PluginExtractPipeProcessor implements PluginPipeProcessor { + + private final SpringBeanRegister springBeanRegister; + private final ExtractFactory extractFactory; + + public PluginExtractPipeProcessor(ApplicationContext mainApplicationContext) { + this.springBeanRegister = new SpringBeanRegister((GenericApplicationContext) mainApplicationContext); + this.extractFactory = ExtractFactory.getInstant(); + } + + @Override + public void initialize() throws Exception { + springBeanRegister.registerSingleton(ExtractFactory.class.getName(), extractFactory); + } + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + Map extractMap = pluginApplicationContext.getBeansWithAnnotation(Extract.class); + if(extractMap.isEmpty()){ + return; + } + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + for (Object extract : extractMap.values()) { + extractFactory.add(pluginId, extract); + } + pluginRegistryInfo.getSpringBeanRegister().registerSingleton( + ExtractFactory.class.getName(), extractFactory + ); + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + extractFactory.remove(pluginId); + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegister.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegister.java new file mode 100644 index 0000000..56fcba3 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegister.java @@ -0,0 +1,17 @@ +package com.gitee.starblues.factory.process.pipe.interceptor; + +/** + * 插件拦截器注册者 + * @author starBlues + * @version 2.4.1 + */ +public interface PluginInterceptorRegister { + + /** + * 拦截器注册者 + * @param registry 注册对象 + */ + void registry(PluginInterceptorRegistry registry); + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistration.java new file mode 100644 index 0000000..ba067c7 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistration.java @@ -0,0 +1,146 @@ +package com.gitee.starblues.factory.process.pipe.interceptor; + +import com.gitee.starblues.utils.CommonUtils; +import org.pf4j.util.StringUtils; +import org.springframework.lang.Nullable; +import org.springframework.util.PathMatcher; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistration; +import org.springframework.web.servlet.handler.MappedInterceptor; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 插件拦截器注册的信息 + * @author starBlues + * @version 2.4.1 + */ +public class PluginInterceptorRegistration { + + private final HandlerInterceptor interceptor; + private final PluginInterceptorRegistry.Type type; + private final String pluginRestApiPrefix; + + private final List includePatterns = new ArrayList<>(); + + private final List excludePatterns = new ArrayList<>(); + + @Nullable + private PathMatcher pathMatcher; + + private int order = 0; + + /** + * Create an {@link InterceptorRegistration} instance. + * + * @param interceptor 拦截器 + * @param type 类型 + * @param pluginRestApiPrefix 接口前缀 + */ + public PluginInterceptorRegistration(HandlerInterceptor interceptor, + PluginInterceptorRegistry.Type type, + String pluginRestApiPrefix) { + this.interceptor = interceptor; + this.type = type; + String apiPrefix = null; + if(pluginRestApiPrefix.startsWith("/")){ + apiPrefix = pluginRestApiPrefix; + } else { + apiPrefix = "/" + pluginRestApiPrefix; + } + if(apiPrefix.endsWith("/")){ + apiPrefix = apiPrefix.substring(0, apiPrefix.lastIndexOf("/")); + } + this.pluginRestApiPrefix = apiPrefix; + } + + + /** + * Add URL patterns to which the registered interceptor should apply to. + */ + public PluginInterceptorRegistration addPathPatterns(String... patterns) { + if(type == PluginInterceptorRegistry.Type.GLOBAL){ + this.includePatterns.addAll(Arrays.asList(patterns)); + } + // 局部的 + for (String pattern : patterns) { + if(StringUtils.isNullOrEmpty(pattern)){ + continue; + } + this.includePatterns.add(CommonUtils.joiningPath(pluginRestApiPrefix, pattern)); + } + return this; + } + + /** + * Add URL patterns to which the registered interceptor should not apply to. + */ + public PluginInterceptorRegistration excludePathPatterns(String... patterns) { + if(type == PluginInterceptorRegistry.Type.GLOBAL){ + this.excludePatterns.addAll(Arrays.asList(patterns)); + } + for (String pattern : patterns) { + if(StringUtils.isNullOrEmpty(pattern)){ + continue; + } + this.excludePatterns.add(CommonUtils.joiningPath(pluginRestApiPrefix, pattern)); + } + return this; + } + + + /** + * A PathMatcher implementation to use with this interceptor. This is an optional, + * advanced property required only if using custom PathMatcher implementations + * that support mapping metadata other than the Ant path patterns supported + * by default. + */ + public PluginInterceptorRegistration pathMatcher(PathMatcher pathMatcher) { + this.pathMatcher = pathMatcher; + return this; + } + + /** + * Specify an order position to be used. Default is 0. + * @since 5.0 + */ + public PluginInterceptorRegistration order(int order){ + this.order = order; + return this; + } + + /** + * Return the order position to be used. + * @since 5.0 + */ + protected int getOrder() { + return this.order; + } + + + /** + * Build the underlying interceptor. If URL patterns are provided, the returned + * type is {@link MappedInterceptor}; otherwise {@link HandlerInterceptor}. + */ + protected Object getInterceptor() { + if(type == PluginInterceptorRegistry.Type.PLUGIN){ + if(this.includePatterns.isEmpty()){ + this.includePatterns.add(CommonUtils.joiningPath(pluginRestApiPrefix, "/**")); + } + } + if (this.includePatterns.isEmpty() && this.excludePatterns.isEmpty()) { + return this.interceptor; + } + + String[] include = this.includePatterns.toArray(new String[]{}); + String[] exclude = this.excludePatterns.toArray(new String[]{}); + MappedInterceptor mappedInterceptor = new MappedInterceptor(include, exclude, this.interceptor); + if (this.pathMatcher != null) { + mappedInterceptor.setPathMatcher(this.pathMatcher); + } + return mappedInterceptor; + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java new file mode 100644 index 0000000..b9b4d38 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java @@ -0,0 +1,93 @@ +package com.gitee.starblues.factory.process.pipe.interceptor; + +import org.springframework.core.OrderComparator; +import org.springframework.core.Ordered; +import org.springframework.web.context.request.WebRequestInterceptor; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 插件拦截器添加者 + * @author starBlues + * @version 2.4.1 + */ +public class PluginInterceptorRegistry { + + + private final List registrations = new ArrayList<>(); + private final String pluginRestApiPrefix; + + public PluginInterceptorRegistry(String pluginRestApiPrefix) { + this.pluginRestApiPrefix = pluginRestApiPrefix; + } + + + /** + * Adds the provided {@link HandlerInterceptor}. + * @param interceptor the interceptor to add + * @return An {@link InterceptorRegistration} that allows you optionally configure the + * registered interceptor further for example adding URL patterns it should apply to. + */ + public PluginInterceptorRegistration addInterceptor(HandlerInterceptor interceptor, Type type) { + PluginInterceptorRegistration registration = new PluginInterceptorRegistration(interceptor, + type, pluginRestApiPrefix); + this.registrations.add(registration); + return registration; + } + + /** + * Adds the provided {@link WebRequestInterceptor}. + * @param interceptor the interceptor to add + * @return An {@link InterceptorRegistration} that allows you optionally configure the + * registered interceptor further for example adding URL patterns it should apply to. + */ + public PluginInterceptorRegistration addWebRequestInterceptor(WebRequestInterceptor interceptor, Type type) { + WebRequestHandlerInterceptorAdapter adapted = new WebRequestHandlerInterceptorAdapter(interceptor); + PluginInterceptorRegistration registration = new PluginInterceptorRegistration(adapted, type, + pluginRestApiPrefix); + this.registrations.add(registration); + return registration; + } + + /** + * Return all registered interceptors. + */ + public List getInterceptors() { + return this.registrations.stream() + .sorted(INTERCEPTOR_ORDER_COMPARATOR) + .map(PluginInterceptorRegistration::getInterceptor) + .collect(Collectors.toList()); + } + + + public enum Type{ + /** + * 全局拦截器 + */ + GLOBAL, + + /** + * 插件局部拦截器, 必须设置 pluginRestPathPrefix 的值才生效 + */ + PLUGIN + } + + + private static final Comparator INTERCEPTOR_ORDER_COMPARATOR = + OrderComparator.INSTANCE.withSourceProvider(object -> { + if (object instanceof PluginInterceptorRegistration) { + return (Ordered) ((PluginInterceptorRegistration) object)::getOrder; + } + return null; + }); + + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginControllerPostProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginControllerPostProcessor.java index eab817f..0928fdc 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginControllerPostProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginControllerPostProcessor.java @@ -7,6 +7,8 @@ import com.gitee.starblues.factory.process.pipe.classs.group.ControllerGroup; import com.gitee.starblues.factory.process.post.PluginPostProcessor; import com.gitee.starblues.factory.process.post.bean.model.ControllerWrapper; import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.utils.CommonUtils; +import org.pf4j.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; @@ -210,18 +212,9 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { if(requestMapping == null){ return; } - String pathPrefix = configuration.pluginRestPathPrefix(); - if(configuration.enablePluginIdRestPathPrefix()){ - if(pathPrefix != null && !"".equals(pathPrefix)){ - pathPrefix = joiningPath(pathPrefix, pluginId); - } else { - pathPrefix = pluginId; - } - } else { - if(pathPrefix == null || "".equals(pathPrefix)){ - // 不启用插件id作为路径前缀, 并且路径前缀为空, 则直接返回。 - return; - } + String pathPrefix = CommonUtils.getPluginRestPrefix(configuration, pluginId); + if(StringUtils.isNullOrEmpty(pathPrefix)){ + return; } InvocationHandler invocationHandler = Proxy.getInvocationHandler(requestMapping); Set definePaths = new HashSet<>(); @@ -238,7 +231,7 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { if(definePath.contains(pathPrefix)){ newPath[i++] = definePath; } else { - newPath[i++] = joiningPath(pathPrefix, definePath); + newPath[i++] = CommonUtils.restJoiningPath(pathPrefix, definePath); } } if(newPath.length == 0){ @@ -251,30 +244,6 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { } } - /** - * 拼接路径 - * @param path1 路径1 - * @param path2 路径2 - * @return 拼接的路径 - */ - private String joiningPath(String path1, String path2){ - if(path1 != null && path2 != null){ - if(path1.endsWith("/") && path2.startsWith("/")){ - return path1 + path2.substring(1); - } else if(!path1.endsWith("/") && !path2.startsWith("/")){ - return path1 + "/" + path2; - } else { - return path1 + path2; - } - } else if(path1 != null){ - return path1; - } else if(path2 != null){ - return path2; - } else { - return ""; - } - } - /** * 方法上是否存在 @RequestMapping 注解 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AnnotationsUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AnnotationsUtils.java index b747458..7ed5143 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AnnotationsUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AnnotationsUtils.java @@ -22,6 +22,7 @@ public class AnnotationsUtils { * @param annotationClasses 注解类 * @return boolean */ + @SafeVarargs public static boolean haveAnnotations(Class aClass, boolean isAllMatch, Class ...annotationClasses){ if(aClass == null){ diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java index 29daaba..54ceaed 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/CommonUtils.java @@ -1,5 +1,8 @@ package com.gitee.starblues.utils; +import com.gitee.starblues.integration.IntegrationConfiguration; +import org.pf4j.util.StringUtils; + import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -48,4 +51,84 @@ public class CommonUtils { } + /** + * 得到插件接口前缀 + * @param configuration 配置 + * @param pluginId 插件id + * @return 接口前缀 + */ + public static String getPluginRestPrefix(IntegrationConfiguration configuration, String pluginId){ + String pathPrefix = configuration.pluginRestPathPrefix(); + if(configuration.enablePluginIdRestPathPrefix()){ + if(pathPrefix != null && !"".equals(pathPrefix)){ + pathPrefix = restJoiningPath(pathPrefix, pluginId); + } else { + pathPrefix = pluginId; + } + return pathPrefix; + } else { + if(pathPrefix == null || "".equals(pathPrefix)){ + // 不启用插件id作为路径前缀, 并且路径前缀为空, 则直接返回。 + return null; + } + } + return pathPrefix; + } + + + /** + * rest接口拼接路径 + * @param path1 路径1 + * @param path2 路径2 + * @return 拼接的路径 + */ + public static String restJoiningPath(String path1, String path2){ + if(path1 != null && path2 != null){ + if(path1.endsWith("/") && path2.startsWith("/")){ + return path1 + path2.substring(1); + } else if(!path1.endsWith("/") && !path2.startsWith("/")){ + return path1 + "/" + path2; + } else { + return path1 + path2; + } + } else if(path1 != null){ + return path1; + } else if(path2 != null){ + return path2; + } else { + return ""; + } + } + + + /** + * 拼接路径 + * @param paths 拼接的路径 + * @return 拼接的路径 + */ + public static String joiningPath(String ...paths){ + if(paths == null || paths.length == 0){ + return ""; + } + StringBuilder stringBuilder = new StringBuilder(); + int length = paths.length; + for (int i = 0; i < length; i++) { + String path = paths[i]; + if(StringUtils.isNullOrEmpty(path)) { + continue; + } + if((i < length - 1) && path.endsWith("/")){ + path = path.substring(path.lastIndexOf("/")); + } + if(path.startsWith("/")){ + stringBuilder.append(path); + } else { + stringBuilder.append("/").append(path); + } + } + + return stringBuilder.toString(); + } + + } diff --git a/springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/CommonUtilsTest.java b/springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/CommonUtilsTest.java new file mode 100644 index 0000000..19e945f --- /dev/null +++ b/springboot-plugin-framework/src/test/java/com/gitee/starblues/utils/CommonUtilsTest.java @@ -0,0 +1,21 @@ +package com.gitee.starblues.utils; + +import org.junit.Assert; +import org.junit.Test; + +/** + * @author starBlues + * @version 1.0 + */ +public class CommonUtilsTest { + + @Test + public void testJoin(){ + Assert.assertEquals(CommonUtils.joiningPath("/p1", "p2", "p3"), "/p1/p2/p3"); + Assert.assertEquals(CommonUtils.joiningPath("/p1", "p2", "p3/"), "/p1/p2/p3/"); + Assert.assertEquals(CommonUtils.joiningPath("p1", "p2", "p3/"), "/p1/p2/p3/"); + } + + + +} -- Gitee From 6a732dff8e18125d38779ffe74bf84251b9d43da Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 5 Feb 2021 19:40:48 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/starblues/annotation/Extract.java | 4 +- .../process/pipe/PluginInfoContainers.java | 2 - .../pipe/extract/ExtractCoordinate.java | 43 ++++++++++--------- .../PluginInterceptorRegistry.java | 1 - 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java index 5b262ee..bd64499 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Extract.java @@ -22,12 +22,12 @@ public @interface Extract { * 场景 * @return 场景标志 */ - String useCase() default ""; + String scene() default ""; /** * 用例 * @return 用例标志 */ - String scene() default ""; + String useCase() default ""; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java index 81fea36..5afe94e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java @@ -15,8 +15,6 @@ public class PluginInfoContainers { private final static Map PLUGIN_APPLICATION_CONTEXTS = new ConcurrentHashMap<>(); - - public static void addPluginApplicationContext(String pluginId, GenericApplicationContext applicationContext){ PLUGIN_APPLICATION_CONTEXTS.put(pluginId, applicationContext); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java index b68341e..1d15314 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java @@ -8,67 +8,67 @@ import java.util.Objects; /** * 执行器坐标 * @author starBlues - * @version 1.0 + * @version 2.4.1 */ public class ExtractCoordinate { private String bus; - private String useCase; private String scene; + private String useCase; - ExtractCoordinate(String bus, String useCase, String scene) { + ExtractCoordinate(String bus, String scene, String useCase) { this.bus = bus; - this.useCase = useCase; this.scene = scene; + this.useCase = useCase; } ExtractCoordinate(Extract extract) { this.bus = extract.bus(); - this.useCase = extract.useCase(); this.scene = extract.scene(); + this.useCase = extract.useCase(); } public static ExtractCoordinate build(String bus) { return new ExtractCoordinate(bus, null, null); } - public static ExtractCoordinate build(String bus, String useCase) { - return new ExtractCoordinate(bus, useCase, null); + public static ExtractCoordinate build(String bus, String scene) { + return new ExtractCoordinate(bus, scene, null); } - public static ExtractCoordinate build(String bus, String useCase, String scene) { - return new ExtractCoordinate(bus, useCase, scene); + public static ExtractCoordinate build(String bus, String scene, String useCase) { + return new ExtractCoordinate(bus, scene, useCase); } public String getBus() { return bus; } - public String getUseCase() { - return useCase; - } - public String getScene() { return scene; } + public String getUseCase() { + return useCase; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof ExtractCoordinate)) return false; ExtractCoordinate that = (ExtractCoordinate) o; if(StringUtils.isNotNullOrEmpty(bus) && - StringUtils.isNotNullOrEmpty(useCase) && - StringUtils.isNotNullOrEmpty(scene)){ + StringUtils.isNotNullOrEmpty(scene) && + StringUtils.isNotNullOrEmpty(useCase)){ return Objects.equals(getBus(), that.getBus()) && - Objects.equals(getUseCase(), that.getUseCase()) && - Objects.equals(getScene(), that.getScene()); + Objects.equals(getScene(), that.getScene()) && + Objects.equals(getUseCase(), that.getUseCase()); } - if(StringUtils.isNotNullOrEmpty(bus) && StringUtils.isNotNullOrEmpty(useCase)){ + if(StringUtils.isNotNullOrEmpty(bus) && StringUtils.isNotNullOrEmpty(scene)){ return Objects.equals(getBus(), that.getBus()) && - Objects.equals(getUseCase(), that.getUseCase()); + Objects.equals(getScene(), that.getScene()); } if(StringUtils.isNotNullOrEmpty(bus)){ @@ -80,15 +80,16 @@ public class ExtractCoordinate { @Override public int hashCode() { - return Objects.hash(getBus(), getUseCase(), getScene()); + return Objects.hash(getBus(), getScene(), getUseCase()); } @Override public String toString() { return "ExtractCoordinate{" + "bus='" + bus + '\'' + - ", useCase='" + useCase + '\'' + ", scene='" + scene + '\'' + + ", useCase='" + useCase + '\'' + '}'; } + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java index b9b4d38..f2f5ca7 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/interceptor/PluginInterceptorRegistry.java @@ -5,7 +5,6 @@ import org.springframework.core.Ordered; import org.springframework.web.context.request.WebRequestInterceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter; import java.util.ArrayList; -- Gitee From f26e279c95d4b75cdff0eb3799ed60a7ff6f7d24 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sun, 7 Feb 2021 10:38:40 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/main/rest/ExtractController.java | 34 +++---- .../example/main/rest/HelloResource.java | 4 +- .../example/main/rest/PluginResource.java | 4 +- .../plugin2/rest/ExtractController.java | 8 +- .../pipe/extract/ExtractCoordinate.java | 17 +++- .../process/pipe/extract/ExtractFactory.java | 91 ++++++++++++++++++- .../application/DefaultPluginApplication.java | 14 +++ .../operator/DefaultPluginOperator.java | 4 +- .../integration/pf4j/DefaultPf4jFactory.java | 4 +- 9 files changed, 139 insertions(+), 41 deletions(-) diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java index 34abdc0..b03e1ca 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java @@ -9,6 +9,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; /** * @author starBlues @@ -21,33 +25,23 @@ public class ExtractController { @Resource private ExtractFactory extractFactory; - - @GetMapping("{name}/exe") - public void exe(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); - extractExample.exe(); - } - - @GetMapping("{name}/exeName") - public void exeName(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); - extractExample.exe("name"); + @GetMapping("getExtractCoordinates") + public Map> getExtractCoordinates(){ + return extractFactory.getExtractCoordinates(); } - - @GetMapping("{name}/exeInfo") - public void exeInfo(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); - ExtractExample.Info info = new ExtractExample.Info(); - info.setName("plugin2"); - info.setAge(3); - extractExample.exe(info); + @GetMapping("getExtractByInterClass") + public List getExtractByInterClass(){ + List extractByInterClass = extractFactory.getExtractByInterClass(ExtractExample.class); + return extractByInterClass.stream() + .map(extractExample -> extractExample.getClass().getName()) + .collect(Collectors.toList()); } @GetMapping("{name}/exeR") public ExtractExample.Info exeInfoR(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample extractExample = extractFactory.getExtractByCoordinate(ExtractCoordinate.build(name)); ExtractExample.Info info = new ExtractExample.Info(); return extractExample.exeInfo(info); } diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java index d098630..beefe2c 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java @@ -25,9 +25,9 @@ public class HelloResource { private final PluginUser pluginUser; private final ConsoleNameFactory consoleNameFactory; - public HelloResource(PluginApplication pluginApplication, + public HelloResource(PluginUser pluginUser, ConsoleNameFactory consoleNameFactory) { - this.pluginUser = pluginApplication.getPluginUser(); + this.pluginUser = pluginUser; this.consoleNameFactory = consoleNameFactory; } diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java index 9f9d839..6936ce8 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java @@ -24,8 +24,8 @@ public class PluginResource { private final PluginOperator pluginOperator; @Autowired - public PluginResource(PluginApplication pluginApplication) { - this.pluginOperator = pluginApplication.getPluginOperator(); + public PluginResource(PluginOperator pluginOperator) { + this.pluginOperator = pluginOperator; } /** * 获取插件信息 diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java index 8ffdf7a..eca46ae 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ExtractController.java @@ -24,20 +24,20 @@ public class ExtractController { @GetMapping("{name}/exe") public void exe(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample extractExample = extractFactory.getExtractByCoordinate(ExtractCoordinate.build(name)); extractExample.exe(); } @GetMapping("{name}/exeName") public void exeName(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample extractExample = extractFactory.getExtractByCoordinate(ExtractCoordinate.build(name)); extractExample.exe("name"); } @GetMapping("{name}/exeInfo") public void exeInfo(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample extractExample = extractFactory.getExtractByCoordinate(ExtractCoordinate.build(name)); ExtractExample.Info info = new ExtractExample.Info(); info.setName("plugin2"); info.setAge(3); @@ -47,7 +47,7 @@ public class ExtractController { @GetMapping("{name}/exeR") public ExtractExample.Info exeInfoR(@PathVariable("name") String name){ - ExtractExample extractExample = extractFactory.getExtract(ExtractCoordinate.build(name)); + ExtractExample extractExample = extractFactory.getExtractByCoordinate(ExtractCoordinate.build(name)); ExtractExample.Info info = new ExtractExample.Info(); return extractExample.exeInfo(info); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java index 1d15314..85dc04c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractCoordinate.java @@ -15,30 +15,33 @@ public class ExtractCoordinate { private String bus; private String scene; private String useCase; + private Class extractClass; - ExtractCoordinate(String bus, String scene, String useCase) { + ExtractCoordinate(String bus, String scene, String useCase, Class extractClass) { this.bus = bus; this.scene = scene; this.useCase = useCase; + this.extractClass = extractClass; } - ExtractCoordinate(Extract extract) { + ExtractCoordinate(Extract extract, Class extractClass) { this.bus = extract.bus(); this.scene = extract.scene(); this.useCase = extract.useCase(); + this.extractClass = extractClass; } public static ExtractCoordinate build(String bus) { - return new ExtractCoordinate(bus, null, null); + return new ExtractCoordinate(bus, null, null, null); } public static ExtractCoordinate build(String bus, String scene) { - return new ExtractCoordinate(bus, scene, null); + return new ExtractCoordinate(bus, scene, null, null); } public static ExtractCoordinate build(String bus, String scene, String useCase) { - return new ExtractCoordinate(bus, scene, useCase); + return new ExtractCoordinate(bus, scene, useCase, null); } public String getBus() { @@ -53,6 +56,10 @@ public class ExtractCoordinate { return useCase; } + public Class getExtractClass() { + return extractClass; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java index e4f92cb..b6847a6 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java @@ -1,8 +1,9 @@ package com.gitee.starblues.factory.process.pipe.extract; import com.gitee.starblues.annotation.Extract; +import org.springframework.util.ClassUtils; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; /** @@ -40,7 +41,7 @@ public class ExtractFactory { return; } Map extractObjects = extractMap.computeIfAbsent(pluginId, k -> new ConcurrentHashMap<>()); - extractObjects.put(new ExtractCoordinate(extract), extractObject); + extractObjects.put(new ExtractCoordinate(extract, extractObject.getClass()), extractObject); } /** @@ -52,12 +53,13 @@ public class ExtractFactory { } /** - * 得到扩展 + * 通过坐标得到扩展 * @param coordinate 扩展的坐标 * @param 扩展的泛型 * @return 扩展实例, 如果不存在则抛出 RuntimeException 异常 */ - public T getExtract(ExtractCoordinate coordinate){ + public T getExtractByCoordinate(ExtractCoordinate coordinate){ + Objects.requireNonNull(coordinate, "ExtractCoordinate can't be null"); for (Map value : extractMap.values()) { Object o = value.get(coordinate); if(o != null){ @@ -67,6 +69,87 @@ public class ExtractFactory { throw new RuntimeException("Not found " + coordinate); } + /** + * 根据插件id和坐标得到扩展 + * @param pluginId 插件id + * @param coordinate 扩展的坐标 + * @param 扩展的泛型 + * @return 扩展实例, 如果不存在则抛出 RuntimeException 异常 + */ + public T getExtractByCoordinate(String pluginId, ExtractCoordinate coordinate){ + Objects.requireNonNull(coordinate, "ExtractCoordinate can't be null"); + Map extractCoordinates = extractMap.get(pluginId); + if(extractCoordinates == null){ + throw new RuntimeException("Not found " + coordinate + " from plugin '" + pluginId + "'"); + } + Object extracts = extractCoordinates.get(coordinate); + if(extracts == null){ + throw new RuntimeException("Not found " + coordinate + " from plugin '" + pluginId + "'"); + } + return (T) extracts; + } + + /** + * 根据接口类型获取扩展 + * @param interfaceClass 接口类类型 + * @param 接口类型泛型 + * @return 扩展实现集合 + */ + public List getExtractByInterClass(Class interfaceClass){ + if(interfaceClass == null){ + return Collections.emptyList(); + } + List extracts = new ArrayList<>(); + for (Map value : extractMap.values()) { + for (Object o : value.values()) { + Set> allInterfacesForClassAsSet = ClassUtils.getAllInterfacesForClassAsSet(o.getClass()); + if(allInterfacesForClassAsSet.contains(interfaceClass)){ + extracts.add((T)o); + } + } + } + return extracts; + } + + /** + * 根据插件id和接口类型获取扩展 + * @param pluginId 插件id + * @param interfaceClass 接口类类型 + * @param 接口类型泛型 + * @return 扩展实现集合 + */ + public List getExtractByInterClass(String pluginId, Class interfaceClass){ + if(interfaceClass == null){ + return Collections.emptyList(); + } + List extracts = new ArrayList<>(); + Map extractCoordinateObjectMap = extractMap.get(pluginId); + if(extractCoordinateObjectMap == null || extractCoordinateObjectMap.isEmpty()){ + return Collections.emptyList(); + } + for (Object o : extractCoordinateObjectMap.values()) { + Set> allInterfacesForClassAsSet = ClassUtils.getAllInterfacesForClassAsSet(o.getClass()); + if(allInterfacesForClassAsSet.contains(interfaceClass)){ + extracts.add((T)o); + } + } + return extracts; + } + + /** + * 得到所有的扩展坐标 + * @return 扩展坐标集合, key 为插件id, 值为所有扩展坐标集合 + */ + public Map> getExtractCoordinates(){ + Map> extractCoordinateMap = new HashMap<>(extractMap.size()); + extractMap.forEach((k, v)->{ + Set extractCoordinates = new HashSet<>(v.size()); + extractCoordinates.addAll(v.keySet()); + extractCoordinateMap.put(k, extractCoordinates); + }); + return extractCoordinateMap; + } + /** * 得到扩展的对象注解 * @param extractObject 扩展对象 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java index 7814b7d..dbd7906 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java @@ -12,7 +12,9 @@ import com.gitee.starblues.integration.user.PluginUser; import org.pf4j.PluginManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; +import org.springframework.context.support.GenericApplicationContext; import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; @@ -57,6 +59,7 @@ public class DefaultPluginApplication extends AbstractPluginApplication { pluginUser = createPluginUser(applicationContext, pluginManager); pluginOperator = createPluginOperator(applicationContext, pluginManager, configuration); try { + setBeanFactory(applicationContext); pluginOperator.initPlugins(listener); beInitialized.set(true); } catch (Exception e) { @@ -107,6 +110,17 @@ public class DefaultPluginApplication extends AbstractPluginApplication { return pluginUser; } + /** + * 直接将 PluginOperator 和 PluginUser 注入到ApplicationContext容器中 + * @param applicationContext ApplicationContext + */ + private void setBeanFactory(ApplicationContext applicationContext){ + GenericApplicationContext genericApplicationContext = (GenericApplicationContext) applicationContext; + DefaultListableBeanFactory defaultListableBeanFactory = genericApplicationContext.getDefaultListableBeanFactory(); + defaultListableBeanFactory.registerSingleton(pluginOperator.getClass().getName(), pluginOperator); + defaultListableBeanFactory.registerSingleton(pluginUser.getClass().getName(), pluginUser); + } + /** * 检查注入 */ diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java index 0cf86a5..1223c57 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java @@ -561,9 +561,9 @@ public class DefaultPluginOperator implements PluginOperator { String fileName = sourcePath.getFileName().toString(); String targetName = integrationConfiguration.backupPath() + File.separator; if(!StringUtils.isEmpty(sign)){ - targetName = targetName + "[" + sign + "]"; + targetName = targetName + sign; } - targetName = targetName + "[" + getNowTimeByFormat() + "]"; + targetName = targetName + "_" +getNowTimeByFormat(); Path target = Paths.get(targetName + "_" + fileName); if(!Files.exists(target.getParent())){ Files.createDirectories(target.getParent()); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java index 6b188df..9a0897c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java @@ -131,12 +131,12 @@ public class DefaultPf4jFactory implements Pf4jFactory { if(runtimeMode == RuntimeMode.DEPLOYMENT){ // 生产 return new CompoundPluginDescriptorFinder() - .add(new ResourcesPluginDescriptorFinder(RuntimeMode.DEPLOYMENT)) + .add(new ResourcesPluginDescriptorFinder(runtimeMode)) .add(new ManifestPluginDescriptorFinder()); } else { // 开发 return new CompoundPluginDescriptorFinder() - .add(new ResourcesPluginDescriptorFinder(RuntimeMode.DEVELOPMENT)) + .add(new ResourcesPluginDescriptorFinder(runtimeMode)) .add(new ResolvePropertiesPluginDescriptorFinder()) .add(new ManifestPluginDescriptorFinder()); } -- Gitee From 3b59da5d76724b5fc3842742696b6352616a2bec Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sun, 7 Feb 2021 10:40:16 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=88=B02.4.1-RELEASE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/basic-example/basic-example-main/pom.xml | 4 ++-- example/basic-example/basic-example-runner/pom.xml | 2 +- .../basic-example/plugins/basic-example-plugin1/pom.xml | 4 ++-- .../src/main/resources/plugin.properties | 2 +- .../basic-example/plugins/basic-example-plugin2/pom.xml | 4 ++-- .../src/main/resources/plugin.properties | 2 +- example/basic-example/plugins/pom.xml | 2 +- example/basic-example/pom.xml | 2 +- .../integration-mybatis/integration-mybatis-main/pom.xml | 8 ++++---- .../integration-mybatis-plugin-parent/pom.xml | 2 +- .../integration-mybatis-runner/pom.xml | 2 +- .../plugins/integration-mybatis-plugin1/pom.xml | 4 ++-- .../src/main/resources/plugin.properties | 2 +- .../plugins/integration-mybatis-plugin2/plugin.properties | 2 +- .../plugins/integration-mybatis-plugin2/pom.xml | 4 ++-- example/integration-mybatis/pom.xml | 2 +- .../integration-mybatisplus-main/pom.xml | 6 +++--- .../integration-mybatisplus-plugin/plugin.properties | 2 +- .../plugins/integration-mybatisplus-plugin/pom.xml | 2 +- example/integration-mybatisplus/pom.xml | 2 +- .../integration-tkmybatis-main/pom.xml | 2 +- .../integration-tkmybatis-plugin/plugin.properties | 2 +- .../plugins/integration-tkmybatis-plugin/pom.xml | 2 +- example/integration-tkmybatis/pom.xml | 2 +- example/pom.xml | 2 +- pom.xml | 2 +- springboot-plugin-framework-extension/pom.xml | 2 +- .../README.md | 4 ++-- .../springboot-plugin-framework-extension-mybatis/pom.xml | 4 ++-- .../README.md | 4 ++-- .../pom.xml | 4 ++-- springboot-plugin-framework/pom.xml | 2 +- 32 files changed, 46 insertions(+), 46 deletions(-) diff --git a/example/basic-example/basic-example-main/pom.xml b/example/basic-example/basic-example-main/pom.xml index 43ed682..28fb781 100644 --- a/example/basic-example/basic-example-main/pom.xml +++ b/example/basic-example/basic-example-main/pom.xml @@ -13,14 +13,14 @@ com.gitee.starblues basic-example-main - 2.4.0-RELEASE + 2.4.1-RELEASE jar 2.7.0 2.3.2 1.6 - 2.4.0-RELEASE + 2.4.1-RELEASE diff --git a/example/basic-example/basic-example-runner/pom.xml b/example/basic-example/basic-example-runner/pom.xml index 8812ae4..fd6f04a 100644 --- a/example/basic-example/basic-example-runner/pom.xml +++ b/example/basic-example/basic-example-runner/pom.xml @@ -14,7 +14,7 @@ com.gitee.starblues basic-example-runner - 2.4.0-RELEASE + 2.4.1-RELEASE pom diff --git a/example/basic-example/plugins/basic-example-plugin1/pom.xml b/example/basic-example/plugins/basic-example-plugin1/pom.xml index e62f20d..59e5eeb 100644 --- a/example/basic-example/plugins/basic-example-plugin1/pom.xml +++ b/example/basic-example/plugins/basic-example-plugin1/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues basic-example-plugin-parent - 2.4.0-RELEASE + 2.4.1-RELEASE ../pom.xml basic-example-plugin1 - 2.4.0-RELEASE + 2.4.1-RELEASE jar diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties index f447d1a..d456f7e 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/resources/plugin.properties @@ -1,5 +1,5 @@ plugin.id=basic-example-plugin1 plugin.class=com.basic.example.plugin1.DefinePlugin -plugin.version=2.4.0-RELEASE +plugin.version=2.4.1-RELEASE plugin.provider=StarBlues plugin.requires=1.2.6 \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin2/pom.xml b/example/basic-example/plugins/basic-example-plugin2/pom.xml index 3440a91..1c77458 100644 --- a/example/basic-example/plugins/basic-example-plugin2/pom.xml +++ b/example/basic-example/plugins/basic-example-plugin2/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues basic-example-plugin-parent - 2.4.0-RELEASE + 2.4.1-RELEASE ../pom.xml basic-example-plugin2 - 2.4.0-RELEASE + 2.4.1-RELEASE jar diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties b/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties index 2f641c9..7ad556e 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/resources/plugin.properties @@ -1,4 +1,4 @@ plugin.id=basic-example-plugin2 plugin.class=com.basic.example.plugin2.DefinePlugin -plugin.version=2.4.0-RELEASE +plugin.version=2.4.1-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/basic-example/plugins/pom.xml b/example/basic-example/plugins/pom.xml index 0f61ecf..146dc36 100644 --- a/example/basic-example/plugins/pom.xml +++ b/example/basic-example/plugins/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues basic-example-plugin-parent - 2.4.0-RELEASE + 2.4.1-RELEASE pom diff --git a/example/basic-example/pom.xml b/example/basic-example/pom.xml index b636b93..9e2cbe0 100644 --- a/example/basic-example/pom.xml +++ b/example/basic-example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues basic-example - 2.4.0-RELEASE + 2.4.1-RELEASE pom 基本案例 diff --git a/example/integration-mybatis/integration-mybatis-main/pom.xml b/example/integration-mybatis/integration-mybatis-main/pom.xml index 7b174d6..c9aeda2 100644 --- a/example/integration-mybatis/integration-mybatis-main/pom.xml +++ b/example/integration-mybatis/integration-mybatis-main/pom.xml @@ -14,14 +14,14 @@ com.gitee.starblues integration-mybatis-main - 2.4.0-RELEASE + 2.4.1-RELEASE jar 主程序模块 - 2.4.0-RELEASE - 2.4.0-RELEASE - 2.4.0-RELEASE + 2.4.1-RELEASE + 2.4.1-RELEASE + 2.4.1-RELEASE 2.0.1 2.7.0 1.6 diff --git a/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml b/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml index d48c427..e4cc482 100644 --- a/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml +++ b/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues integration-mybatis-plugin-parent - 2.4.0-RELEASE + 2.4.1-RELEASE pom diff --git a/example/integration-mybatis/integration-mybatis-runner/pom.xml b/example/integration-mybatis/integration-mybatis-runner/pom.xml index 91ba7d8..71646f7 100644 --- a/example/integration-mybatis/integration-mybatis-runner/pom.xml +++ b/example/integration-mybatis/integration-mybatis-runner/pom.xml @@ -14,7 +14,7 @@ com.gitee.starblues integration-mybatis-runner - 2.4.0-RELEASE + 2.4.1-RELEASE jar 启动程序模块。将启动类配置到该模块下 diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml index 41fa0f3..5483da3 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues integration-mybatis-plugin-parent - 2.4.0-RELEASE + 2.4.1-RELEASE ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin1 - 2.4.0-RELEASE + 2.4.1-RELEASE jar diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties index 08af4cd..1d2b72d 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatis-plugin1 plugin.class=com.mybatis.plugin1.ExamplePlugin1 -plugin.version=2.4.0-RELEASE +plugin.version=2.4.1-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties index f47e5c9..72c1ab5 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatis-plugin2 plugin.class=com.mybatis.plugin2.ExamplePlugin2 -plugin.version=2.4.0-RELEASE +plugin.version=2.4.1-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml index 03f1925..688e246 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/pom.xml @@ -8,12 +8,12 @@ com.gitee.starblues integration-mybatis-plugin-parent - 2.4.0-RELEASE + 2.4.1-RELEASE ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin2 - 2.4.0-RELEASE + 2.4.1-RELEASE jar diff --git a/example/integration-mybatis/pom.xml b/example/integration-mybatis/pom.xml index c17c26d..271a5ea 100644 --- a/example/integration-mybatis/pom.xml +++ b/example/integration-mybatis/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues integration-mybatis - 2.4.0-RELEASE + 2.4.1-RELEASE pom 集成mybatis案例 diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml b/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml index d6343a5..dee453b 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml +++ b/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues - 2.4.0-RELEASE + 2.4.1-RELEASE integration-mybatisplus-main jar 集成mybatis-plus 案例--主程序 @@ -27,8 +27,8 @@ 2.0.1 3.2.0 - 2.4.0-RELEASE - 2.4.0-RELEASE + 2.4.1-RELEASE + 2.4.1-RELEASE 2.7.0 1.6 diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties index 77783a5..767beb9 100644 --- a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties +++ b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatisplus-plugin plugin.class=com.mybatisplus.plugin.MybatisPlusPlugin -plugin.version=2.4.0-RELEASE +plugin.version=2.4.1-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml index fdc1aa1..6988f15 100644 --- a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml +++ b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-mybatisplus-plugin - 2.4.0-RELEASE + 2.4.1-RELEASE jar diff --git a/example/integration-mybatisplus/pom.xml b/example/integration-mybatisplus/pom.xml index 58eb3ea..886c739 100644 --- a/example/integration-mybatisplus/pom.xml +++ b/example/integration-mybatisplus/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-mybatisplus - 2.4.0-RELEASE + 2.4.1-RELEASE pom 集成mybatis-plus案例 diff --git a/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml b/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml index 2fa3f54..8746af4 100644 --- a/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml +++ b/example/integration-tkmybatis/integration-tkmybatis-main/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues - 2.4.0-RELEASE + 2.4.1-RELEASE integration-tkmybatis-main jar 集成mybatis-plus 案例--主程序 diff --git a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties index 0207ba3..01d0a2e 100644 --- a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties +++ b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-tkmybatis-plugin plugin.class=com.tkmybatis.plugin.TkMybatisPlugin -plugin.version=2.4.0-RELEASE +plugin.version=2.4.1-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml index 326a9fa..678e485 100644 --- a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml +++ b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-tkmybatis-plugin - 2.4.0-RELEASE + 2.4.1-RELEASE jar diff --git a/example/integration-tkmybatis/pom.xml b/example/integration-tkmybatis/pom.xml index 4895172..81b2604 100644 --- a/example/integration-tkmybatis/pom.xml +++ b/example/integration-tkmybatis/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-tkmybatis - 2.4.0-RELEASE + 2.4.1-RELEASE pom 集成mybatis-plus案例 diff --git a/example/pom.xml b/example/pom.xml index 2722f4e..3d16ee6 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues springboot-plugin-framework-example - 2.4.0-RELEASE + 2.4.1-RELEASE pom diff --git a/pom.xml b/pom.xml index 391f044..842d5dc 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues springboot-plugin-framework-parent pom - 2.4.0-RELEASE + 2.4.1-RELEASE spring boot 插件开发集成包 diff --git a/springboot-plugin-framework-extension/pom.xml b/springboot-plugin-framework-extension/pom.xml index bf68db6..5a6ae27 100644 --- a/springboot-plugin-framework-extension/pom.xml +++ b/springboot-plugin-framework-extension/pom.xml @@ -9,7 +9,7 @@ com.gitee.starblues springboot-plugin-framework-extension pom - 2.4.0-RELEASE + 2.4.1-RELEASE spring boot 插件式开发集成包--扩展模块 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md index 6dcbf43..e08a042 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md @@ -15,7 +15,7 @@ com.gitee.starblues springboot-plugin-framework-extension-mybatis - 2.4.0-RELEASE + 2.4.1-RELEASE @@ -211,7 +211,7 @@ public void oneselfConfig(Config config){ - 修复插件中使用`Mybatis-Plus`批量插入bug - 针对`Mybatis`、`Mybatis-Plus`、`Tk-Mybatis` 新增使用主程序配置时,可重写主程序配置到本插件中 -### `2.4.0-RELEASE` 版本 +### `2.4.1-RELEASE` 版本 - 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 ### `2.2.5-RELEASE` 版本 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml index 99cd8e7..c9f36c4 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues springboot-plugin-framework-extension-mybatis - 2.4.0-RELEASE + 2.4.1-RELEASE jar 插件扩展-spring boot mybatis 集成扩展 @@ -64,7 +64,7 @@ 3.1.0 1.6 - 2.4.0-RELEASE + 2.4.1-RELEASE 2.0.1 3.4.1 2.1.5 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index ef6127a..44f2dce 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -15,7 +15,7 @@ com.gitee.starblues springboot-plugin-framework-extension-resources - 2.4.0-RELEASE + 2.4.1-RELEASE ``` @@ -104,7 +104,7 @@ public class ResourceConfig implements SpringBootThymeleafConfig { ## 版本说明 -#### `2.4.0-RELEASE` 版本 +#### `2.4.1-RELEASE` 版本 - 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 - 修复插件中的静态资源和主程序冲突的bug diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml index 159c675..83b9e44 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues springboot-plugin-framework-extension-resources - 2.4.0-RELEASE + 2.4.1-RELEASE jar 插件扩展-通过url读取插件中的静态资源 @@ -69,7 +69,7 @@ 5.0.7.RELEASE 4.0.1 - 2.4.0-RELEASE + 2.4.1-RELEASE 2.0.3.RELEASE 2.1.1.RELEASE diff --git a/springboot-plugin-framework/pom.xml b/springboot-plugin-framework/pom.xml index 8b27d1e..0acd88d 100644 --- a/springboot-plugin-framework/pom.xml +++ b/springboot-plugin-framework/pom.xml @@ -13,7 +13,7 @@ com.gitee.starblues springboot-plugin-framework jar - 2.4.0-RELEASE + 2.4.1-RELEASE spring boot 插件式开发集成包 -- Gitee From c93df5a5affcbf0af216f9f8925662cc2ad58533 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sun, 7 Feb 2021 12:00:26 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + .../main/extract/MainExtractExample.java | 35 +++++++++++++++ .../example/main/rest/ExtractController.java | 11 ++++- .../example/plugin1/PluginInterceptorR.java | 1 - .../README.md | 17 +++++--- .../README.md | 11 +++-- .../process/pipe/extract/ExtractFactory.java | 43 +++++++++++++++++++ .../extract/PluginExtractPipeProcessor.java | 9 ++++ 8 files changed, 116 insertions(+), 13 deletions(-) create mode 100644 example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/MainExtractExample.java diff --git a/README.md b/README.md index dc5d2e9..0fe613b 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,12 @@ - 支持在插件中开发Rest接口。 - 支持在插件中单独定义持久层访问等需求。 - 可以遵循主程序提供的插件接口开发任意扩展功能。 +- 支持注解进行任意业务场景扩展, 并使用定义的坐标进行场景命中。 - 插件可以根据生产和开发环境自定义独立的配置文件。目前只支持yml文件。 - 支持自定义扩展开发接口, 使用者可以在预留接口上扩展额外功能。 - 支持插件之间的通信。 - 支持插件接口文档: `Swagger`、`SpringDoc`。 +- 插件支持`拦截器`的定制开发。 ### 扩展包功能 1. `SpringBoot-Mybatis`扩展包 diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/MainExtractExample.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/MainExtractExample.java new file mode 100644 index 0000000..5900c3c --- /dev/null +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/extract/MainExtractExample.java @@ -0,0 +1,35 @@ +package com.basic.example.main.extract; + +import com.gitee.starblues.annotation.Extract; +import org.springframework.stereotype.Component; + +/** + * @author starBlues + * @version 1.0 + */ +@Extract(bus = "main", scene = "1", useCase = "2") +@Component +public class MainExtractExample implements ExtractExample{ + + + @Override + public void exe() { + System.out.println("Main exe"); + } + + @Override + public void exe(String name) { + System.out.println("Main exe, name=" + name); + } + + @Override + public void exe(Info info) { + System.out.println("Main exe, info=" + info); + } + + @Override + public Info exeInfo(Info info) { + info.setName(info.getName() + "-main"); + return info; + } +} diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java index b03e1ca..1a3a28b 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/ExtractController.java @@ -46,6 +46,15 @@ public class ExtractController { return extractExample.exeInfo(info); } - + @GetMapping("/mainExtract") + public ExtractExample.Info getMainExtract(){ + ExtractExample extractExample = extractFactory.getExtractByCoordinateOfMain(ExtractCoordinate.build( + "main", "1", "2" + )); + ExtractExample.Info info = new ExtractExample.Info(); + info.setName("main info"); + info.setAge(Integer.MAX_VALUE); + return extractExample.exeInfo(info); + } } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java index b2e177e..088513b 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginInterceptorR.java @@ -18,7 +18,6 @@ public class PluginInterceptorR implements PluginInterceptorRegister { @Resource private PluginInterceptor1 pluginInterceptor1; - @Override public void registry(PluginInterceptorRegistry registry) { registry.addInterceptor(pluginInterceptor1, PluginInterceptorRegistry.Type.PLUGIN) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md index e08a042..ec5f526 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md @@ -15,7 +15,7 @@ com.gitee.starblues springboot-plugin-framework-extension-mybatis - 2.4.1-RELEASE + 2.4.0-RELEASE @@ -201,18 +201,22 @@ public void oneselfConfig(Config config){ ``` +#### 重新主程序配置 +1. 实现各个配置的 `reSetMainConfig` 方法进行重写 +2. 重写后不影响主程序的配置, 只在当前插件中起作用 + ### 集成Mybatis-Plus说明 - 集成mybatis-plus后,在插件中无法使用 `LambdaQueryWrapper` 条件构造器 ## 版本说明 -#### `2.4.1-RELEASE` 版本 -- 修复插件中使用`Mybatis-Plus`批量插入bug -- 针对`Mybatis`、`Mybatis-Plus`、`Tk-Mybatis` 新增使用主程序配置时,可重写主程序配置到本插件中 - ### `2.4.1-RELEASE` 版本 -- 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 +1. 新增`Mybatis`、`Mybatis-Plus`、`Tk-Mybatis`扩展新增可重写覆盖主程序的配置(重写后会当前插件私有, 不影响主程序) +2. 修复`Mybatis-Plus`批量插入的bug + +### `2.4.0-RELEASE` 版本 +1. 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 ### `2.2.5-RELEASE` 版本 全新升级该扩展 @@ -220,7 +224,6 @@ public void oneselfConfig(Config config){ 2. 支持动态卸载和安装 3. 支持插件可独立进行配置, 与主程序和其他插件进行环境隔离 - ### `2.1.3-RELEASE` 版本 跟随 springboot-plugin-framework 版本的部分类修改。升级到 2.1.3 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index 44f2dce..14eb258 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -15,7 +15,7 @@ com.gitee.starblues springboot-plugin-framework-extension-resources - 2.4.1-RELEASE + 2.4.0-RELEASE ``` @@ -104,9 +104,12 @@ public class ResourceConfig implements SpringBootThymeleafConfig { ## 版本说明 -#### `2.4.1-RELEASE` 版本 -- 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 -- 修复插件中的静态资源和主程序冲突的bug +### `2.4.1-RELEASE` 版本 +1. 修复静态资源无法访问的bug + +#### `2.4.0-RELEASE` 版本 +1. 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 +2. 修复插件中的静态资源和主程序冲突的bug #### `2.2.5-RELEASE` 版本 1. 新增`Thymeleaf`模板引擎 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java index b6847a6..2473930 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/ExtractFactory.java @@ -13,6 +13,8 @@ import java.util.concurrent.ConcurrentHashMap; */ public class ExtractFactory { + public static final String MAIN_EXTRACT_KEY = ExtractFactory.class.getName() + UUID.randomUUID().toString(); + private Map> extractMap = new ConcurrentHashMap<>(); private static ExtractFactory EXTRACT_FACTORY = new ExtractFactory(); @@ -27,6 +29,15 @@ public class ExtractFactory { return EXTRACT_FACTORY; } + /** + * 添加扩展 + * @param extractObject 扩展的bean + */ + void addOfMain(Object extractObject){ + add(MAIN_EXTRACT_KEY, extractObject); + } + + /** * 添加扩展 * @param pluginId 插件id @@ -89,6 +100,27 @@ public class ExtractFactory { return (T) extracts; } + + /** + * 根据坐标得到主程序的扩展 + * 主程序扩展必须使用 @Extract+@Component 进行定义 + * @param coordinate 扩展的坐标 + * @param 扩展的泛型 + * @return 扩展实例, 如果不存在则抛出 RuntimeException 异常 + */ + public T getExtractByCoordinateOfMain(ExtractCoordinate coordinate){ + Objects.requireNonNull(coordinate, "ExtractCoordinate can't be null"); + Map extractCoordinates = extractMap.get(MAIN_EXTRACT_KEY); + if(extractCoordinates == null){ + throw new RuntimeException("Not found " + coordinate + " from main"); + } + Object extracts = extractCoordinates.get(coordinate); + if(extracts == null){ + throw new RuntimeException("Not found " + coordinate + " from main"); + } + return (T) extracts; + } + /** * 根据接口类型获取扩展 * @param interfaceClass 接口类类型 @@ -136,6 +168,17 @@ public class ExtractFactory { return extracts; } + /** + * 根据接口类型获取主程序的扩展 + * 主程序扩展必须使用 @Extract+@Component 进行定义 + * @param interfaceClass 接口类类型 + * @param 接口类型泛型 + * @return 扩展实现集合 + */ + public List getExtractByInterClassOfMain(Class interfaceClass){ + return getExtractByInterClass(MAIN_EXTRACT_KEY, interfaceClass); + } + /** * 得到所有的扩展坐标 * @return 扩展坐标集合, key 为插件id, 值为所有扩展坐标集合 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java index f6c30e8..a7c3f81 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/extract/PluginExtractPipeProcessor.java @@ -16,10 +16,12 @@ import java.util.Map; */ public class PluginExtractPipeProcessor implements PluginPipeProcessor { + private final ApplicationContext mainApplicationContext; private final SpringBeanRegister springBeanRegister; private final ExtractFactory extractFactory; public PluginExtractPipeProcessor(ApplicationContext mainApplicationContext) { + this.mainApplicationContext = mainApplicationContext; this.springBeanRegister = new SpringBeanRegister((GenericApplicationContext) mainApplicationContext); this.extractFactory = ExtractFactory.getInstant(); } @@ -27,6 +29,13 @@ public class PluginExtractPipeProcessor implements PluginPipeProcessor { @Override public void initialize() throws Exception { springBeanRegister.registerSingleton(ExtractFactory.class.getName(), extractFactory); + // 获取主程序的扩展 + Map extractMap = mainApplicationContext.getBeansWithAnnotation(Extract.class); + if(!extractMap.isEmpty()){ + for (Object extract : extractMap.values()) { + extractFactory.addOfMain(extract); + } + } } @Override -- Gitee