From 77c7d6d3b81fba15a90c8622f7c511cf8ecf63c2 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Thu, 31 Oct 2019 11:31:11 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=96=B0=E5=A2=9Emybatis=E5=88=AB=E5=90=8D?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatis/main/rest/PluginResource.java | 31 +++- .../com/mybatis/plugin1/ExamplePlugin1.java | 8 ++ .../com/mybatis/plugin1/entity/Plugin1.java | 2 + .../mybatis/plugin1/mapper/Plugin1Mapper.java | 3 + .../plugin1/rest/Plugin1Controller.java | 7 + .../mybatis/plugin1/rest/UserController.java | 2 + .../main/resources/mapper/Plugin1Mapper.xml | 7 +- .../mybatis/PluginEntityAliasesGroup.java | 62 ++++++++ .../extension/mybatis/PluginMapperGroup.java | 6 + .../mybatis/PluginMybatisEntityProcessor.java | 136 ++++++++++++++++++ .../mybatis/PluginMybatisXmlProcessor.java | 15 +- .../mybatis/SpringBootMybatisExtension.java | 2 + .../SpringBootMybatisConfig.java | 23 ++- springboot-plugin-framework/pom.xml | 6 - .../pipe/PluginPipeProcessorFactory.java | 2 +- .../YamlConfigurationParser.java | 21 ++- .../process/pipe/classs/PluginClassGroup.java | 8 ++ .../pipe/classs/PluginClassProcess.java | 11 ++ .../pipe/classs/group/CallerGroup.java | 7 + .../pipe/classs/group/ComponentGroup.java | 6 + .../classs/group/ConfigDefinitionGroup.java | 7 + .../pipe/classs/group/ConfigurationGroup.java | 6 + .../pipe/classs/group/ControllerGroup.java | 6 + .../pipe/classs/group/RepositoryGroup.java | 6 + .../pipe/classs/group/SupplierGroup.java | 7 + .../operator/DefaultPluginOperator.java | 100 ++++++++----- .../integration/operator/PluginOperator.java | 7 + .../operator/module/PluginInfo.java | 6 +- .../operator/verify/PluginLegalVerify.java | 6 +- .../gitee/starblues/utils/CommonUtils.java | 5 +- .../gitee/starblues/utils/OrderPriority.java | 14 +- .../starblues/utils/PluginFileUtils.java | 13 +- 32 files changed, 472 insertions(+), 76 deletions(-) create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginEntityAliasesGroup.java create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java index 7b4e3f6..db90729 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java +++ b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java @@ -3,10 +3,15 @@ package com.mybatis.main.rest; import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.operator.PluginOperator; import com.gitee.starblues.integration.operator.module.PluginInfo; +import org.pf4j.ManifestPluginDescriptorFinder; +import org.pf4j.PluginDescriptor; +import org.pf4j.PluginDescriptorFinder; +import org.pf4j.PluginState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Set; @@ -22,6 +27,7 @@ public class PluginResource { private final PluginOperator pluginOperator; + private final PluginDescriptorFinder pluginDescriptorFinder = new ManifestPluginDescriptorFinder(); @Autowired public PluginResource(PluginApplication pluginApplication) { @@ -52,6 +58,29 @@ public class PluginResource { } + /** + * 获取插件jar文件名 + * @return 获取插件文件名。只在生产环境显示 + */ + @PostMapping("/test") + public String test(@RequestParam("path") String path) { + try { + Path pluginPath = Paths.get(path); + PluginDescriptor pluginDescriptor = pluginDescriptorFinder.find(pluginPath); + String pluginId = pluginDescriptor.getPluginId(); + PluginInfo pluginInfo = pluginOperator.getPluginInfo(pluginId); + if(pluginInfo.getPluginState() == PluginState.STARTED){ + pluginOperator.uninstall(pluginId, true); + } + pluginOperator.install(pluginPath); + return "ok"; + } catch (Exception e){ + e.printStackTrace(); + return e.getMessage(); + } + } + + /** * 根据插件id停止插件 * @param id 插件id @@ -99,7 +128,7 @@ public class PluginResource { @PostMapping("/uninstall/{id}") public String uninstall(@PathVariable("id") String id){ try { - if(pluginOperator.uninstall(id, true)){ + if(pluginOperator.uninstall(id, false)){ return "plugin '" + id +"' uninstall success"; } else { return "plugin '" + id +"' uninstall failure"; diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java index d541643..b800b00 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java @@ -16,11 +16,13 @@ import java.util.Set; public class ExamplePlugin1 extends BasePlugin implements SpringBootMybatisConfig { private final Set mybatisMapperXmlLocationsMatch = new HashSet<>(); + private final Set typeAliasesPackage = new HashSet<>(); public ExamplePlugin1(PluginWrapper wrapper) { super(wrapper); mybatisMapperXmlLocationsMatch.add("classpath:mapper/*Mapper.xml"); + typeAliasesPackage.add("com.mybatis.plugin1.entity"); } @Override @@ -42,4 +44,10 @@ public class ExamplePlugin1 extends BasePlugin implements SpringBootMybatisConfi public Set mybatisMapperXmlLocationsMatch() { return mybatisMapperXmlLocationsMatch; } + + + @Override + public Set typeAliasesPackage() { + return typeAliasesPackage; + } } diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java index 7320f72..cd59a83 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java @@ -1,5 +1,7 @@ package com.mybatis.plugin1.entity; +import org.apache.ibatis.type.Alias; + /** * description * diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java index 8972cf6..41f22d2 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java @@ -30,6 +30,9 @@ public interface Plugin1Mapper { */ Plugin1 getById(@Param("id") String id); + + Plugin1 getByIdOfBean(Plugin1 plugin1); + @Insert("INSERT INTO plugin1 VALUES (#{id}, #{name})") void insert(@Param("id") String id, @Param("name") String name); diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java index 45bb343..04ac1d4 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java @@ -43,6 +43,13 @@ public class Plugin1Controller { return pluginMapperl.getById(id); } + @GetMapping("/bean/{id}") + public Plugin1 getUserByIdBean(@PathVariable("id") String id){ + Plugin1 p = new Plugin1(); + p.setId(id); + return pluginMapperl.getByIdOfBean(p); + } + @GetMapping("/transactional") public void tran(){ testTransactional.transactional(); diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/UserController.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/UserController.java index caf38fe..35e12e4 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/UserController.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/UserController.java @@ -41,6 +41,8 @@ public class UserController { } + + @GetMapping("/transactional") public void testTestTransactional(){ testTestTransactional.transactional(); diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml index 488ef25..d47712e 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml @@ -3,7 +3,7 @@ - + @@ -22,4 +22,9 @@ where id = #{id} + + diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginEntityAliasesGroup.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginEntityAliasesGroup.java new file mode 100644 index 0000000..6261c07 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginEntityAliasesGroup.java @@ -0,0 +1,62 @@ +package com.gitee.starblues.extension.mybatis; + +import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; +import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroupExtend; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.utils.AnnotationsUtils; +import org.apache.ibatis.type.Alias; + +import java.util.Set; + +/** + * 插件中的实体类别名 + * + * @author zhangzhuo + * @version 1.0 + */ +public class PluginEntityAliasesGroup implements PluginClassGroupExtend { + + public static final String KEY = "plugin_mybatis_alias"; + + private Set typeAliasesPackage; + + public PluginEntityAliasesGroup() { + } + + @Override + public String groupId() { + return KEY; + } + + @Override + public void initialize(BasePlugin basePlugin) { + if(basePlugin instanceof SpringBootMybatisConfig){ + SpringBootMybatisConfig config = (SpringBootMybatisConfig) basePlugin; + typeAliasesPackage = config.typeAliasesPackage(); + } + } + + + @Override + public boolean filter(Class aClass) { + if(AnnotationsUtils.haveAnnotations(aClass, false, Alias.class)){ + return true; + } + if(typeAliasesPackage == null || typeAliasesPackage.isEmpty()){ + return false; + } + for (String packageName : typeAliasesPackage) { + if(aClass.getPackage().getName().equals(packageName)){ + return true; + } + } + return false; + } + + @Override + public String key() { + return "PluginEntityAliasesGroup"; + } + + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java index 84166c8..371ba5d 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java @@ -2,6 +2,7 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.mybatis.annotation.PluginMapper; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroupExtend; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; /** @@ -19,6 +20,11 @@ public class PluginMapperGroup implements PluginClassGroupExtend { return KEY; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, PluginMapper.class); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java new file mode 100644 index 0000000..db4616e --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java @@ -0,0 +1,136 @@ +package com.gitee.starblues.extension.mybatis; + +import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; +import com.gitee.starblues.extension.mybatis.utils.MybatisXmlProcess; +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.utils.OrderPriority; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.type.Alias; +import org.apache.ibatis.type.TypeAliasRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; + +import java.util.List; +import java.util.Map; + +/** + * 实体类别名处理者 + * + * @author zhangzhuo + * @version 1.0 + */ +public class PluginMybatisEntityProcessor implements PluginPipeProcessorExtend { + + private final static Logger LOG = LoggerFactory.getLogger(PluginMybatisEntityProcessor.class); + + private final static String KEY = "PluginMybatisEntityProcessor"; + + private final SqlSessionFactory sqlSessionFactory; + + PluginMybatisEntityProcessor(ApplicationContext mainApplicationContext){ + sqlSessionFactory = mainApplicationContext.getBean(SqlSessionFactory.class); + } + + @Override + public String key() { + return KEY; + } + + @Override + public OrderPriority order() { + return OrderPriority.getMiddlePriority(); + } + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + if(sqlSessionFactory == null){ + LOG.warn("Mybatis SqlSessionFactory is null, Cannot register alias"); + return; + } + Configuration configuration = sqlSessionFactory.getConfiguration(); + if(configuration == null){ + LOG.warn("Mybatis Configuration is null, Cannot register alias"); + return; + } + TypeAliasRegistry typeAliasRegistry = configuration.getTypeAliasRegistry(); + if(typeAliasRegistry == null){ + LOG.warn("Mybatis TypeAliasRegistry is null, Cannot register alias"); + return; + } + processEntityClass(pluginRegistryInfo, typeAliasRegistry); + processAliasMapping(pluginRegistryInfo, typeAliasRegistry); + } + + /** + * 处理别名的实体类 + * @param pluginRegistryInfo 注册的插件信息 + * @param typeAliasRegistry 别名注册器 + */ + private void processEntityClass(PluginRegistryInfo pluginRegistryInfo, + TypeAliasRegistry typeAliasRegistry){ + List> groupClasses = pluginRegistryInfo.getGroupClasses(PluginEntityAliasesGroup.KEY); + if(groupClasses == null || groupClasses.isEmpty()){ + return; + } + if(typeAliasRegistry == null){ + return; + } + for (Class groupClass : groupClasses) { + if(groupClass == null){ + continue; + } + Alias alias = groupClass.getAnnotation(Alias.class); + String aliasNam; + if(alias == null){ + aliasNam = lowerFirstChar(groupClass.getSimpleName()); + } else { + aliasNam = alias.value(); + } + typeAliasRegistry.registerAlias(aliasNam, groupClass); + } + } + + /** + * 注册自定义配置的 aliasMapping 的别名 + * @param pluginRegistryInfo 注册的插件信息 + * @param typeAliasRegistry 别名注册器 + */ + private void processAliasMapping(PluginRegistryInfo pluginRegistryInfo, + TypeAliasRegistry typeAliasRegistry){ + BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); + if(basePlugin instanceof SpringBootMybatisConfig){ + SpringBootMybatisConfig config = (SpringBootMybatisConfig) basePlugin; + Map aliasMapping = config.aliasMapping(); + if(aliasMapping == null || aliasMapping.isEmpty()){ + return; + } + aliasMapping.forEach((k, v)->{ + typeAliasRegistry.registerAlias(k, v); + }); + } + } + + + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + + } + + + /** + * 首字母小写 + * @param str 字符串 + * @return 首字母小写的字符串 + */ + private String lowerFirstChar(String str){ + char [] chars = str.toCharArray(); + chars[0] += 32; + return String.valueOf(chars); + } + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java index f6b237e..eb26cd0 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java @@ -1,10 +1,10 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.mybatis.utils.MybatisXmlProcess; -import com.gitee.starblues.loader.ResourceWrapper; -import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; +import com.gitee.starblues.loader.ResourceWrapper; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.OrderPriority; import org.apache.ibatis.session.SqlSessionFactory; import org.pf4j.PluginWrapper; @@ -22,9 +22,10 @@ import java.util.List; public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { private final MybatisXmlProcess mybatisXmlProcess; + private final SqlSessionFactory sqlSessionFactory; PluginMybatisXmlProcessor(ApplicationContext mainApplicationContext) { - SqlSessionFactory sqlSessionFactory = mainApplicationContext.getBean(SqlSessionFactory.class); + sqlSessionFactory = mainApplicationContext.getBean(SqlSessionFactory.class); if(sqlSessionFactory != null){ this.mybatisXmlProcess = MybatisXmlProcess.getInstance(sqlSessionFactory); } else { @@ -44,7 +45,7 @@ public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - if(mybatisXmlProcess == null){ + if(mybatisXmlProcess == null || sqlSessionFactory == null){ return; } BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); @@ -54,6 +55,7 @@ public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { if(resourceWrapper == null){ return; } + processAliases(pluginRegistryInfo); List pluginResources = resourceWrapper.getResources(); if(pluginResources == null || pluginResources.isEmpty()){ return; @@ -61,8 +63,13 @@ public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { mybatisXmlProcess.loadXmlResource(pluginResources, pluginWrapper.getPluginClassLoader()); } + private void processAliases(PluginRegistryInfo pluginRegistryInfo) { + + } + @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { // not thing } + } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java index 821b445..071a61b 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java @@ -36,6 +36,7 @@ public class SpringBootMybatisExtension extends AbstractExtension { public List getPluginClassGroup(ApplicationContext mainApplicationContext) { final List pluginClassGroups = new ArrayList<>(); pluginClassGroups.add(new PluginMapperGroup()); + pluginClassGroups.add(new PluginEntityAliasesGroup()); return pluginClassGroups; } @@ -44,6 +45,7 @@ public class SpringBootMybatisExtension extends AbstractExtension { final List pluginPipeProcessorExtends = new ArrayList<>(); pluginPipeProcessorExtends.add(new PluginMybatisMapperProcessor(applicationContext)); pluginPipeProcessorExtends.add(new PluginMybatisXmlProcessor(applicationContext)); + pluginPipeProcessorExtends.add(new PluginMybatisEntityProcessor(applicationContext)); return pluginPipeProcessorExtends; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java index 09cdb8f..abb7450 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java @@ -1,5 +1,6 @@ package com.gitee.starblues.extension.mybatis.configuration; +import java.util.Map; import java.util.Set; /** @@ -8,7 +9,7 @@ import java.util.Set; * @author zhangzhuo * @version 1.0 */ - public interface SpringBootMybatisConfig { +public interface SpringBootMybatisConfig { /** @@ -24,4 +25,24 @@ import java.util.Set; */ Set mybatisMapperXmlLocationsMatch(); + /** + * 别名自定义映射。 + * 如果同时配置了typeAliasesPackage, 则此处配置会覆盖typeAliasesPackage的默认配置。 + * 别名优先级别: aliasMapping > typeAliasesPackage > @Alias(''). 如果同时配置了三个地方, 则最终优先级别高的生效。 + * @return 映射Map + */ + default Map aliasMapping(){ + return null; + } + + /** + * 别名类型包集合。别名规则为包名首字母小写。 + * 如果bean中使用了别名注解@Alias. 则优先使用它。 + * @return 包集合 + */ + default Set typeAliasesPackage(){ + return null; + } + + } diff --git a/springboot-plugin-framework/pom.xml b/springboot-plugin-framework/pom.xml index 925111a..d2fc582 100644 --- a/springboot-plugin-framework/pom.xml +++ b/springboot-plugin-framework/pom.xml @@ -104,12 +104,6 @@ ${jackson.version} - - commons-io - commons-io - 2.4 - - javax.servlet javax.servlet-api 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 6b9dc56..ae6895f 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 @@ -53,7 +53,7 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { CommonUtils.order(pluginPipeProcessorExtends, (pluginPipeProcessorExtend -> { OrderPriority order = pluginPipeProcessorExtend.order(); if(order == null){ - order = OrderPriority.getMiddlePriority(); + order = OrderPriority.getLowPriority(); } return order.getPriority(); })); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/YamlConfigurationParser.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/YamlConfigurationParser.java index ad9fe65..6920e34 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/YamlConfigurationParser.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/YamlConfigurationParser.java @@ -33,13 +33,20 @@ public class YamlConfigurationParser extends AbstractConfigurationParser { @Override protected Object parse(Resource resource, Class pluginConfigClass) throws Exception{ - InputStream input = new FileInputStream(resource.getFile()); - YAMLParser yamlParser = yamlFactory.createParser(input); - final JsonNode node = objectMapper.readTree(yamlParser); - if(node == null){ - return pluginConfigClass.newInstance(); + InputStream inputStream = null; + try { + inputStream = new FileInputStream(resource.getFile()); + YAMLParser yamlParser = yamlFactory.createParser(inputStream); + final JsonNode node = objectMapper.readTree(yamlParser); + if(node == null){ + return pluginConfigClass.newInstance(); + } + TreeTraversingParser treeTraversingParser = new TreeTraversingParser(node); + return objectMapper.readValue(treeTraversingParser, pluginConfigClass); + } finally { + if(inputStream != null){ + inputStream.close(); + } } - TreeTraversingParser treeTraversingParser = new TreeTraversingParser(node); - return objectMapper.readValue(treeTraversingParser, pluginConfigClass); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassGroup.java index 669f9a4..d5839de 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassGroup.java @@ -1,5 +1,7 @@ package com.gitee.starblues.factory.process.pipe.classs; +import com.gitee.starblues.realize.BasePlugin; + /** * 插件类分组器 * @@ -14,6 +16,12 @@ public interface PluginClassGroup { */ String groupId(); + /** + * 初始化。每处理一个插件, 该方法调用一次。 + * @param basePlugin 当前插件信息 + */ + void initialize(BasePlugin basePlugin); + /** * 过滤类。 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java index ae2774c..c298c39 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java @@ -77,6 +77,14 @@ public class PluginClassProcess implements PluginPipeProcessor { if(pluginResources == null){ return; } + for (PluginClassGroup pluginClassGroup : pluginClassGroups) { + try { + pluginClassGroup.initialize(basePlugin); + } catch (Exception e){ + log.error("PluginClassGroup {} initialize exception. {}", pluginClassGroup.getClass(), + e.getMessage(), e); + } + } for (Resource pluginResource : pluginResources) { String path = pluginResource.getURL().getPath(); String packageName = path.substring(0, path.indexOf(".class")) @@ -84,6 +92,9 @@ public class PluginClassProcess implements PluginPipeProcessor { packageName = packageName.substring(packageName.indexOf(basePlugin.scanPackage())); Class aClass = Class.forName(packageName, false, basePlugin.getWrapper().getPluginClassLoader()); + if(aClass == null){ + continue; + } boolean findGroup = false; for (PluginClassGroup pluginClassGroup : pluginClassGroups) { if(pluginClassGroup == null || StringUtils.isEmpty(pluginClassGroup.groupId())){ diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java index c10c732..8326944 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java @@ -2,6 +2,7 @@ package com.gitee.starblues.factory.process.pipe.classs.group; import com.gitee.starblues.annotation.Caller; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; @@ -25,8 +26,14 @@ public class CallerGroup implements PluginClassGroup { return CALLER; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, Caller.class); } + } 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 e93abd6..66a18af 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,6 +1,7 @@ package com.gitee.starblues.factory.process.pipe.classs.group; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; @@ -24,6 +25,11 @@ public class ComponentGroup implements PluginClassGroup { return SPRING_COMPONENT; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, Component.class, Service.class); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java index 4ce7ff4..766c587 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java @@ -2,6 +2,7 @@ package com.gitee.starblues.factory.process.pipe.classs.group; import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; /** @@ -23,8 +24,14 @@ public class ConfigDefinitionGroup implements PluginClassGroup { return CONFIG_DEFINITION; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, ConfigDefinition.class); } + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java index e2b102a..6fe1592 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java @@ -1,6 +1,7 @@ package com.gitee.starblues.factory.process.pipe.classs.group; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; import org.springframework.context.annotation.Configuration; @@ -23,6 +24,11 @@ public class ConfigurationGroup implements PluginClassGroup { return SPRING_CONFIGURATION; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, Configuration.class); 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 8ff55e2..e1f1b2b 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 @@ -1,6 +1,7 @@ package com.gitee.starblues.factory.process.pipe.classs.group; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RestController; @@ -25,6 +26,11 @@ public class ControllerGroup implements PluginClassGroup { return SPRING_CONTROLLER; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, RestController.class, Controller.class); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java index b62a3f5..23bfefb 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java @@ -1,6 +1,7 @@ package com.gitee.starblues.factory.process.pipe.classs.group; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; import org.springframework.stereotype.Repository; @@ -23,6 +24,11 @@ public class RepositoryGroup implements PluginClassGroup { return SPRING_REPOSITORY; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, Repository.class); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java index 32fccbc..9ee9257 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java @@ -2,6 +2,7 @@ package com.gitee.starblues.factory.process.pipe.classs.group; import com.gitee.starblues.annotation.Supplier; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.AnnotationsUtils; @@ -24,8 +25,14 @@ public class SupplierGroup implements PluginClassGroup { return SUPPLIER; } + @Override + public void initialize(BasePlugin basePlugin) { + + } + @Override public boolean filter(Class aClass) { return AnnotationsUtils.haveAnnotations(aClass, false, Supplier.class); } + } 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 6070a4b..5d1737b 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 @@ -12,7 +12,6 @@ import com.gitee.starblues.factory.PluginFactory; import com.gitee.starblues.utils.GlobalRegistryInfo; import com.gitee.starblues.utils.PluginOperatorInfo; import com.gitee.starblues.utils.PluginFileUtils; -import org.apache.commons.io.FileUtils; import org.pf4j.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,6 +25,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -44,13 +44,12 @@ public class DefaultPluginOperator implements PluginOperator { private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); - private final IntegrationConfiguration integrationConfiguration; - private final PluginManager pluginManager; - private final PluginFactory pluginFactory; - private final PluginInitializerListenerFactory pluginInitializerListenerFactory; - - private final PluginDescriptorFinder pluginDescriptorFinder; - private final PluginLegalVerify uploadPluginVerify; + protected final IntegrationConfiguration integrationConfiguration; + protected final PluginManager pluginManager; + protected final PluginFactory pluginFactory; + protected final PluginInitializerListenerFactory pluginInitializerListenerFactory; + protected final PluginDescriptorFinder pluginDescriptorFinder; + protected final PluginLegalVerify uploadPluginVerify; public DefaultPluginOperator(ApplicationContext applicationContext, @@ -114,20 +113,22 @@ public class DefaultPluginOperator implements PluginOperator { if(!Files.exists(path)){ throw new FileNotFoundException("Not found this path " + path); } + // 校验插件文件 + uploadPluginVerify.verify(path); Path pluginsRoot = pluginManager.getPluginsRoot(); if(path.getParent().compareTo(pluginsRoot) == 0){ - // 说明该插件文件存在于插件root目录下。 + // 说明该插件文件存在于插件root目录下。直接加载该插件 pluginId = pluginManager.loadPlugin(path); } else { File sourceFile = path.toFile(); String targetPathString = pluginsRoot.toString() + File.separator + sourceFile.getName(); - Path targetPath = PluginFileUtils.getExistPath(Paths.get(targetPathString)); + Path targetPath = Paths.get(targetPathString); if(Files.exists(targetPath)){ - // 如果存在该文件, 则备份 - backup(targetPath, "install-backup", 2); + // 如果存在该文件, 则移动备份 + backup(targetPath, "install-backup", 1); } - FileUtils.copyFile(sourceFile, targetPath.toFile()); + Files.copy(path, targetPath, StandardCopyOption.REPLACE_EXISTING); pluginId = pluginManager.loadPlugin(targetPath); } if(StringUtils.isEmpty(pluginId)){ @@ -147,7 +148,9 @@ public class DefaultPluginOperator implements PluginOperator { log.error("Install plugin '{}' failure. {}", pluginId, e.getMessage()); log.info("Start uninstall plugin '{}' failure", pluginId); try { - uninstall(pluginId, false); + if(!StringUtils.isEmpty(pluginId)){ + uninstall(pluginId, false); + } } catch (Exception uninstallException){ log.error("Uninstall plugin '{}' failure. {}", pluginId, e.getMessage()); } @@ -161,9 +164,12 @@ public class DefaultPluginOperator implements PluginOperator { @Override public boolean uninstall(String pluginId, boolean isBackup) throws Exception { + if(StringUtils.isEmpty(pluginId)){ + throw new IllegalArgumentException("Method:uninstall param 'pluginId' can not be empty"); + } PluginWrapper pluginWrapper = pluginManager.getPlugin(pluginId); if(pluginWrapper == null){ - throw new Exception("Uninstall plugin failure, Not found plugin ''" + pluginId + "'"); + throw new Exception("Uninstall plugin failure, Not found plugin '" + pluginId + "'"); } Exception exception = null; try { @@ -174,11 +180,16 @@ public class DefaultPluginOperator implements PluginOperator { exception = e; } try { - if(isBackup){ - // 将插件文件移到备份文件中 - backup(pluginWrapper.getPluginPath(), "uninstall", 1); - } - if (pluginManager.deletePlugin(pluginId)) { + + if (pluginManager.unloadPlugin(pluginId)) { + Path pluginPath = pluginWrapper.getPluginPath(); + if(isBackup){ + // 将插件文件移到备份文件中 + backup(pluginPath, "uninstall", 1); + } else { + // 不备份的话。直接删除该文件 + Files.deleteIfExists(pluginPath); + } log.info("Uninstall plugin '{}' success", pluginId); return true; } else { @@ -280,11 +291,12 @@ public class DefaultPluginOperator implements PluginOperator { File sourceFile = path.toFile(); String configPath = integrationConfiguration.pluginConfigFilePath() + File.separator + sourceFile.getName(); - Path targetPath = PluginFileUtils.getExistPath(Paths.get(configPath)); + Path targetPath = PluginFileUtils.createExistFile(Paths.get(configPath)); if(Files.exists(targetPath)){ - backup(targetPath, "install-config-backup",2); + // 如果文件存在, 则移动备份 + backup(targetPath, "install-config-backup",1); } - FileUtils.copyFile(sourceFile, targetPath.toFile()); + Files.copy(path, targetPath, StandardCopyOption.REPLACE_EXISTING); return true; } @@ -296,10 +308,12 @@ public class DefaultPluginOperator implements PluginOperator { String fileName = configFile.getOriginalFilename(); String configPath = integrationConfiguration.pluginConfigFilePath() + File.separator + fileName; - Path targetPath = PluginFileUtils.getExistPath(Paths.get(configPath)); + Path targetPath = PluginFileUtils.createExistFile(Paths.get(configPath)); if(Files.exists(targetPath)){ + // 如果文件存在, 则拷贝备份 backup(targetPath, "upload-config-backup",2); } + // 然后写入数据到该文件 Files.write(targetPath, configFile.getBytes()); return true; } @@ -333,6 +347,16 @@ public class DefaultPluginOperator implements PluginOperator { .collect(Collectors.toList()); } + @Override + public PluginInfo getPluginInfo(String pluginId) { + PluginWrapper pluginWrapper = pluginManager.getPlugin(pluginId); + if(pluginWrapper == null){ + throw new RuntimeException("Not found plugin '" + pluginId + "'"); + } + return new PluginInfo(pluginWrapper.getDescriptor(), pluginWrapper.getPluginState(), + pluginWrapper.getPluginPath().toAbsolutePath().toString()); + } + @Override public Set getPluginFilePaths() throws Exception { @@ -375,24 +399,23 @@ public class DefaultPluginOperator implements PluginOperator { throw new IllegalArgumentException("Invalid file type, please select .jar or .zip file"); } String tempPathString = integrationConfiguration.uploadTempPath() + File.separator + fileName; - Path tempPath = PluginFileUtils.getExistPath(Paths.get(tempPathString)); - File tempFile = tempPath.toFile(); - FileUtils.writeByteArrayToFile(tempFile, pluginFile.getBytes()); + Path tempPath = PluginFileUtils.createExistFile(Paths.get(tempPathString)); + Files.write(tempPath, pluginFile.getBytes()); try { Path verifyPath = uploadPluginVerify.verify(tempPath); if(verifyPath != null){ - String pluginFilePathString = pluginManager.getPluginsRoot().toString() + + String targetPathString = pluginManager.getPluginsRoot().toString() + File.separator + fileName; - Path pluginFilePath = Paths.get(pluginFilePathString); - File target = pluginFilePath.toFile(); - if(target.exists()){ + Path targetPluginPath = Paths.get(targetPathString); + if(Files.exists(targetPluginPath)){ // 存在则拷贝一份 - backup(pluginFilePath, "upload", 2); + backup(targetPluginPath, "upload", 2); } - FileUtils.copyFile(verifyPath.toFile(), target); + // 拷贝校验的路径到插件路径下 + Files.copy(verifyPath, targetPluginPath, StandardCopyOption.REPLACE_EXISTING); // 删除临时文件 - tempFile.deleteOnExit(); - return pluginFilePath; + Files.deleteIfExists(tempPath); + return targetPluginPath; } else { Exception exception = new Exception(fileName + " verify failure, verifyPath is null"); @@ -467,16 +490,17 @@ public class DefaultPluginOperator implements PluginOperator { if(!Files.exists(target.getParent())){ Files.createDirectories(target.getParent()); } - File targetFile = target.toFile(); File sourceFile = sourcePath.toFile(); if(sourceFile.length() == 0){ // 源文件字节为0, 说明为删除的插件。不需要备份 return true; } - FileUtils.copyFile(sourceFile, targetFile); if(type == 1){ // 是移动的话, 则删除源文件 - FileUtils.deleteQuietly(sourceFile); + Files.move(sourcePath, target, StandardCopyOption.REPLACE_EXISTING); + } else { + // 拷贝 + Files.copy(sourcePath, target, StandardCopyOption.REPLACE_EXISTING); } return true; } catch (IOException e) { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java index 6e52150..0781548 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java @@ -115,6 +115,13 @@ public interface PluginOperator { */ List getPluginInfo(); + /** + * 根据插件id获取插件信息 [适用于生产环境、开发环境] + * @param pluginId 插件id + * @return 插件信息 + */ + PluginInfo getPluginInfo(String pluginId); + /** * 得到插件文件的路径 [适用于生产环境] diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/module/PluginInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/module/PluginInfo.java index 9b39cde..ae08b02 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/module/PluginInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/module/PluginInfo.java @@ -36,7 +36,11 @@ public class PluginInfo { return pluginDescriptor; } - public String getPluginState() { + public PluginState getPluginState() { + return pluginState; + } + + public String getPluginStateString() { return pluginState.toString(); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java index f7fa541..d175cc4 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java @@ -32,13 +32,13 @@ public class PluginLegalVerify implements PluginVerify{ } PluginDescriptor pluginDescriptor = pluginDescriptorFinder.find(path); if(pluginDescriptor == null){ - throw new Exception(path.toString() + " : Not found Plugin Descriptor"); + throw new Exception(path.toString() + " : Not found plugin Descriptor"); } if(StringUtils.isEmpty(pluginDescriptor.getPluginId())){ - throw new Exception(path.toString() + " : Not found Plugin Id"); + throw new Exception(path.toString() + " : Plugin id can't be empty"); } if(StringUtils.isEmpty(pluginDescriptor.getPluginClass())){ - throw new Exception(path.toString() + " : Not found Plugin Class"); + throw new Exception(path.toString() + " : Not found plugin Class"); } return postVerify(path, pluginDescriptor); } 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 2ce16ca..bc63629 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,6 @@ package com.gitee.starblues.utils; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.function.Function; @@ -15,7 +16,7 @@ public class CommonUtils { private CommonUtils(){} /** - * list按照int排序 + * list按照int排序. 数字越大, 越排在前面 * @param list list集合 * @param orderImpl 排序实现 * @param T @@ -25,7 +26,7 @@ public class CommonUtils { if(list == null){ return list; } - list.sort(Comparator.comparing(orderImpl, Comparator.nullsLast(Comparator.naturalOrder()))); + Collections.sort(list, Comparator.comparing(orderImpl, Comparator.nullsLast(Comparator.reverseOrder()))); return list; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/OrderPriority.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/OrderPriority.java index 38de011..27b48b9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/OrderPriority.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/OrderPriority.java @@ -8,10 +8,13 @@ package com.gitee.starblues.utils; */ public class OrderPriority { + + /** - * 低优先级 + * 高优先级 */ - private static final Integer LOW_PRIORITY = -1000; + private static final Integer HIGH_PRIORITY = 1000; + /** @@ -19,11 +22,12 @@ public class OrderPriority { */ private static final Integer MIDDLE_PRIORITY = 0; - /** - * 高优先级 + * 低优先级 */ - private static final Integer HIGH_PRIORITY = 1000; + private static final Integer LOW_PRIORITY = -1000; + + private Integer priority; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java index 865a735..145f460 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginFileUtils.java @@ -1,8 +1,5 @@ package com.gitee.starblues.utils; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.IOFileFilter; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -65,7 +62,11 @@ public final class PluginFileUtils { } long length = file.length(); if(length == 0){ - FileUtils.deleteQuietly(file); + try { + Files.deleteIfExists(subPath); + } catch (IOException e) { + e.printStackTrace(); + } } }); } catch (IOException e) { @@ -77,12 +78,12 @@ public final class PluginFileUtils { /** - * 得到存在的文件 + * 如果文件不存在, 则会创建 * @param path 插件路径 * @return 插件路径 * @throws IOException 没有发现文件异常 */ - public static Path getExistPath(Path path) throws IOException { + public static Path createExistFile(Path path) throws IOException { Path parent = path.getParent(); if(!Files.exists(parent)){ Files.createDirectories(parent); -- Gitee From 729bbffb787f00b8d43f763ff02a446ea1d5fb21 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Thu, 31 Oct 2019 13:29:19 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=96=B0=E5=A2=9Emybatis-where=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 2 ++ .../mybatis/plugin1/mapper/Plugin1Mapper.java | 2 +- .../plugin1/rest/Plugin1Controller.java | 20 +++++++++++-------- .../main/resources/mapper/Plugin1Mapper.xml | 11 ++++++++-- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml b/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml index df5d62b..900ab17 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml +++ b/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml @@ -11,6 +11,8 @@ spring: mybatis: typeAliasesPackage: com.mybatis.main.entity mapperLocations: classpath:mapper/*.xml + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl plugin: diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java index 41f22d2..ed30329 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/mapper/Plugin1Mapper.java @@ -31,7 +31,7 @@ public interface Plugin1Mapper { Plugin1 getById(@Param("id") String id); - Plugin1 getByIdOfBean(Plugin1 plugin1); + List getByCondition(Plugin1 plugin1); @Insert("INSERT INTO plugin1 VALUES (#{id}, #{name})") void insert(@Param("id") String id, @Param("name") String name); diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java index 04ac1d4..168da3c 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/rest/Plugin1Controller.java @@ -4,10 +4,8 @@ import com.mybatis.plugin1.entity.Plugin1; import com.mybatis.plugin1.mapper.Plugin1Mapper; import com.mybatis.plugin1.service.TranServiec; import org.springframework.beans.factory.annotation.Autowired; -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 org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -43,11 +41,17 @@ public class Plugin1Controller { return pluginMapperl.getById(id); } - @GetMapping("/bean/{id}") - public Plugin1 getUserByIdBean(@PathVariable("id") String id){ + @PostMapping("/bean") + public List getUserByIdBean(@RequestParam(value = "id", required = false) String id, + @RequestParam(value = "name", required = false) String name){ Plugin1 p = new Plugin1(); - p.setId(id); - return pluginMapperl.getByIdOfBean(p); + if(!StringUtils.isEmpty(id)){ + p.setId(id); + } + if(!StringUtils.isEmpty(name)){ + p.setName(name); + } + return pluginMapperl.getByCondition(p); } @GetMapping("/transactional") diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml index d47712e..256c887 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/mapper/Plugin1Mapper.xml @@ -22,9 +22,16 @@ where id = #{id} - select from plugin1 - where id = #{id, jdbcType=VARCHAR} + + + id=#{id} + + + and name=#{name} + + -- Gitee From 6c44d47638b77b5a17634d49fd63ab773c2cebe8 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Thu, 31 Oct 2019 14:41:02 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E5=BC=82=E5=B8=B8=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/PluginMybatisEntityProcessor.java | 12 ++++------ .../SpringBootMybatisConfig.java | 7 +++--- .../operator/DefaultPluginOperator.java | 24 ++++++++++++++----- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java index db4616e..c416ae0 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java @@ -1,7 +1,6 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; -import com.gitee.starblues.extension.mybatis.utils.MybatisXmlProcess; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.realize.BasePlugin; @@ -13,6 +12,7 @@ import org.apache.ibatis.type.TypeAliasRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; +import org.springframework.util.StringUtils; import java.util.List; import java.util.Map; @@ -83,14 +83,12 @@ public class PluginMybatisEntityProcessor implements PluginPipeProcessorExtend { if(groupClass == null){ continue; } + String aliasName = lowerFirstChar(groupClass.getSimpleName()); Alias alias = groupClass.getAnnotation(Alias.class); - String aliasNam; - if(alias == null){ - aliasNam = lowerFirstChar(groupClass.getSimpleName()); - } else { - aliasNam = alias.value(); + if(alias != null && !StringUtils.isEmpty(alias.value())){ + aliasName = alias.value(); } - typeAliasRegistry.registerAlias(aliasNam, groupClass); + typeAliasRegistry.registerAlias(aliasName, groupClass); } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java index abb7450..36787e2 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java @@ -28,7 +28,8 @@ public interface SpringBootMybatisConfig { /** * 别名自定义映射。 * 如果同时配置了typeAliasesPackage, 则此处配置会覆盖typeAliasesPackage的默认配置。 - * 别名优先级别: aliasMapping > typeAliasesPackage > @Alias(''). 如果同时配置了三个地方, 则最终优先级别高的生效。 + * 别名优先级别: aliasMapping > @Alias('') > typeAliasesPackage + * 如果同时配置了三个地方, 并且key一样, 则最终优先级别高的生效。 * @return 映射Map */ default Map aliasMapping(){ @@ -36,8 +37,8 @@ public interface SpringBootMybatisConfig { } /** - * 别名类型包集合。别名规则为包名首字母小写。 - * 如果bean中使用了别名注解@Alias. 则优先使用它。 + * 别名类型包集合。别名规则为包名首字母小写。只支持当前包下的类, 不支持包递归。 + * 如果从该包下的类使用了别名注解@Alias. 则优先使用@Alias中定义的别名。 * @return 包集合 */ default Set typeAliasesPackage(){ 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 5d1737b..643ad0d 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 @@ -86,16 +86,28 @@ public class DefaultPluginOperator implements PluginOperator { log.warn("Not found plugin!"); return false; } + boolean isFoundException = false; for (PluginWrapper pluginWrapper : pluginWrappers) { - GlobalRegistryInfo.addOperatorPluginInfo(pluginWrapper.getPluginId(), + String pluginId = pluginWrapper.getPluginId(); + GlobalRegistryInfo.addOperatorPluginInfo(pluginId, PluginOperatorInfo.OperatorType.INSTALL, false); - pluginFactory.registry(pluginWrapper); + try { + pluginFactory.registry(pluginWrapper); + } catch (Exception e){ + log.error("Registry plugin '{}' failure. Reason : {}", pluginId, e.getMessage(), e); + isFoundException = true; + } } pluginFactory.build(); - log.info("Initialize plugins success"); - pluginInitializerListenerFactory.complete(); - isInit = true; - return true; + if(isFoundException){ + log.error("Initialize plugins failure"); + return false; + } else { + log.info("Initialize plugins success"); + pluginInitializerListenerFactory.complete(); + isInit = true; + return true; + } } catch (Exception e){ pluginInitializerListenerFactory.failure(e); throw e; -- Gitee From 71ec32d9b2a73b9d35b2014ab0875bb93cc034e4 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Mon, 4 Nov 2019 17:39:04 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=9D=99=E6=80=81?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E6=89=A9=E5=B1=95=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springboot-plugin-framework-extension/pom.xml | 1 + .../mybatis/PluginMybatisEntityProcessor.java | 103 ++++++- .../mybatis/PluginMybatisMapperProcessor.java | 5 + .../mybatis/PluginMybatisXmlProcessor.java | 5 + .../mybatis/SpringBootMybatisExtension.java | 3 + .../SpringBootMybatisConfig.java | 5 +- .../pom.xml | 208 ++++++++++++++ .../PluginHandlerMappingProcess.java | 54 ++++ .../resources/StaticResourceConfig.java | 23 ++ .../resources/StaticResourceExtension.java | 45 +++ .../resolver/PluginResourceResolver.java | 260 ++++++++++++++++++ .../resolver/ResourceWebMvcConfigurer.java | 37 +++ .../extension/AbstractExtension.java | 16 ++ .../starblues/extension/ExtensionFactory.java | 63 +---- .../extension/ExtensionInitializer.java | 147 ++++++++++ .../factory/DefaultPluginFactory.java | 13 +- .../starblues/factory/PluginFactory.java | 7 + .../starblues/factory/PluginRegistryInfo.java | 11 + .../process/pipe/PluginPipeProcessor.java | 7 + .../pipe/PluginPipeProcessorFactory.java | 51 ++-- .../process/pipe/bean/BasicBeanProcessor.java | 5 + .../pipe/bean/ConfigBeanProcessor.java | 5 + .../pipe/classs/PluginClassProcess.java | 27 +- .../process/post/PluginPostProcessor.java | 6 + .../post/PluginPostProcessorFactory.java | 49 +--- .../PluginConfigurationPostProcessor.java | 5 + .../bean/PluginControllerPostProcessor.java | 5 + .../post/bean/PluginInvokePostProcessor.java | 5 + .../integration/ConfigurationBuilder.java | 1 + .../integration/IntegrationConfiguration.java | 17 ++ .../AbstractPluginApplication.java | 7 +- .../listener/DefaultInitializerListener.java | 37 +++ .../listener/PluginInitializerListener.java | 1 - .../PluginInitializerListenerFactory.java | 8 +- .../operator/DefaultPluginOperator.java | 67 +++-- .../integration/operator/PluginOperator.java | 9 +- .../loader/PluginResourceLoadFactory.java | 20 +- 37 files changed, 1132 insertions(+), 206 deletions(-) create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginHandlerMappingProcess.java create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java create mode 100644 springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/DefaultInitializerListener.java diff --git a/springboot-plugin-framework-extension/pom.xml b/springboot-plugin-framework-extension/pom.xml index 898bede..bf68e00 100644 --- a/springboot-plugin-framework-extension/pom.xml +++ b/springboot-plugin-framework-extension/pom.xml @@ -14,6 +14,7 @@ spring boot 插件式开发集成包--扩展模块 springboot-plugin-framework-extension-mybatis + springboot-plugin-framework-extension-resources \ No newline at end of file diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java index c416ae0..a278a5b 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisEntityProcessor.java @@ -14,8 +14,11 @@ import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.util.StringUtils; +import java.lang.reflect.Field; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** * 实体类别名处理者 @@ -28,6 +31,7 @@ public class PluginMybatisEntityProcessor implements PluginPipeProcessorExtend { private final static Logger LOG = LoggerFactory.getLogger(PluginMybatisEntityProcessor.class); private final static String KEY = "PluginMybatisEntityProcessor"; + private final static String ALIAS_NAME_KEY = "mybatisAliasName"; private final SqlSessionFactory sqlSessionFactory; @@ -45,33 +49,68 @@ public class PluginMybatisEntityProcessor implements PluginPipeProcessorExtend { return OrderPriority.getMiddlePriority(); } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { if(sqlSessionFactory == null){ LOG.warn("Mybatis SqlSessionFactory is null, Cannot register alias"); return; } + TypeAliasRegistry typeAliasRegistry = getTypeAliasRegistry(); + if (typeAliasRegistry == null){ + return; + } + Set mybatisAliasNames = pluginRegistryInfo.getExtension(ALIAS_NAME_KEY); + if(mybatisAliasNames == null){ + mybatisAliasNames = new HashSet<>(); + pluginRegistryInfo.addExtension(ALIAS_NAME_KEY, mybatisAliasNames); + } + processEntityClass(pluginRegistryInfo, typeAliasRegistry, mybatisAliasNames); + processAliasMapping(pluginRegistryInfo, typeAliasRegistry, mybatisAliasNames); + } + + private TypeAliasRegistry getTypeAliasRegistry() { Configuration configuration = sqlSessionFactory.getConfiguration(); if(configuration == null){ LOG.warn("Mybatis Configuration is null, Cannot register alias"); - return; + return null; } TypeAliasRegistry typeAliasRegistry = configuration.getTypeAliasRegistry(); if(typeAliasRegistry == null){ LOG.warn("Mybatis TypeAliasRegistry is null, Cannot register alias"); + return null; + } + return typeAliasRegistry; + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + TypeAliasRegistry typeAliasRegistry = getTypeAliasRegistry(); + if(typeAliasRegistry == null){ return; } - processEntityClass(pluginRegistryInfo, typeAliasRegistry); - processAliasMapping(pluginRegistryInfo, typeAliasRegistry); + Set mybatisAliasNames = pluginRegistryInfo.getExtension(ALIAS_NAME_KEY); + if(mybatisAliasNames != null && !mybatisAliasNames.isEmpty()){ + for (String mybatisAliasName : mybatisAliasNames) { + Map> typeAliases = getTypeAliases(typeAliasRegistry); + typeAliases.remove(mybatisAliasName); + } + } } + /** * 处理别名的实体类 * @param pluginRegistryInfo 注册的插件信息 * @param typeAliasRegistry 别名注册器 */ private void processEntityClass(PluginRegistryInfo pluginRegistryInfo, - TypeAliasRegistry typeAliasRegistry){ + TypeAliasRegistry typeAliasRegistry, + Set mybatisAliasNames){ List> groupClasses = pluginRegistryInfo.getGroupClasses(PluginEntityAliasesGroup.KEY); if(groupClasses == null || groupClasses.isEmpty()){ return; @@ -88,7 +127,11 @@ public class PluginMybatisEntityProcessor implements PluginPipeProcessorExtend { if(alias != null && !StringUtils.isEmpty(alias.value())){ aliasName = alias.value(); } - typeAliasRegistry.registerAlias(aliasName, groupClass); + if(StringUtils.isEmpty(aliasName)){ + continue; + } + registerAlias(typeAliasRegistry, aliasName, groupClass); + mybatisAliasNames.add(aliasName); } } @@ -98,7 +141,8 @@ public class PluginMybatisEntityProcessor implements PluginPipeProcessorExtend { * @param typeAliasRegistry 别名注册器 */ private void processAliasMapping(PluginRegistryInfo pluginRegistryInfo, - TypeAliasRegistry typeAliasRegistry){ + TypeAliasRegistry typeAliasRegistry, + Set mybatisAliasNames){ BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); if(basePlugin instanceof SpringBootMybatisConfig){ SpringBootMybatisConfig config = (SpringBootMybatisConfig) basePlugin; @@ -107,18 +151,55 @@ public class PluginMybatisEntityProcessor implements PluginPipeProcessorExtend { return; } aliasMapping.forEach((k, v)->{ - typeAliasRegistry.registerAlias(k, v); + registerAlias(typeAliasRegistry, k, v); + mybatisAliasNames.add(k); }); } } - - @Override - public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - + /** + * 注册别名。 + * @param typeAliasRegistry 别名注册器 + * @param alias 别名名称 + * @param value 别名对应的class类 + */ + private void registerAlias(TypeAliasRegistry typeAliasRegistry, + String alias, + Class value){ + if(StringUtils.isEmpty(alias)){ + return; + } + Map> typeAliases = getTypeAliases(typeAliasRegistry); + typeAliases.put(alias, value); } + /** + * + * 通过反射获取别名注册器 TypeAliasRegistry 中存储别名的 typeAliases Map集合。 + * @param typeAliasRegistry 别名注册器 + * @return typeAliases Map集合。 + */ + private Map> getTypeAliases(TypeAliasRegistry typeAliasRegistry) { + if(typeAliasRegistry == null){ + return null; + } + try { + Field field = typeAliasRegistry.getClass().getDeclaredField("typeAliases"); + //设置对象的访问权限,保证对private的属性的访问 + field.setAccessible(true); + Object fieldObject = field.get(typeAliasRegistry); + if(fieldObject instanceof Map){ + return (Map>)fieldObject; + } else { + LOG.warn("Not found TypeAliasRegistry typeAliases"); + return null; + } + } catch (Exception e) { + LOG.error("Found TypeAliasRegistry typeAliases exception. {}", e.getMessage(), e); + return null; + } + } /** * 首字母小写 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java index bd87cb0..a35324a 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java @@ -68,6 +68,11 @@ public class PluginMybatisMapperProcessor implements PluginPipeProcessorExtend { } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { if(!mybatisExist()){ diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java index eb26cd0..a77c15e 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java @@ -43,6 +43,11 @@ public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { return OrderPriority.getLowPriority(); } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { if(mybatisXmlProcess == null || sqlSessionFactory == null){ diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java index 071a61b..ebfc3ae 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/SpringBootMybatisExtension.java @@ -1,6 +1,7 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.AbstractExtension; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.loader.PluginResourceLoader; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroupExtend; @@ -25,6 +26,8 @@ public class SpringBootMybatisExtension extends AbstractExtension { return KEY; } + + @Override public List getPluginResourceLoader() { final List pluginResourceLoaders = new ArrayList<>(); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java index 36787e2..c8dcc44 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java @@ -27,9 +27,8 @@ public interface SpringBootMybatisConfig { /** * 别名自定义映射。 - * 如果同时配置了typeAliasesPackage, 则此处配置会覆盖typeAliasesPackage的默认配置。 - * 别名优先级别: aliasMapping > @Alias('') > typeAliasesPackage - * 如果同时配置了三个地方, 并且key一样, 则最终优先级别高的生效。 + * 如果同时配置了typeAliasesPackage, 则此处配置会覆盖typeAliasesPackage、或者注解@Alias('') 的配置。 + * 别名生效优先级别: aliasMapping > @Alias('') > typeAliasesPackage。如果同时配置了三个地方, 并且key一样, 则最终优先级别高的生效。 * @return 映射Map */ default Map aliasMapping(){ 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 new file mode 100644 index 0000000..03d4de0 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/pom.xml @@ -0,0 +1,208 @@ + + + 4.0.0 + + + org.sonatype.oss + oss-parent + 7 + + + + com.gitee.starblues + springboot-plugin-framework-extension-resources + 2.2.0-RELEASE + jar + + 插件扩展-通过url读取加载插件中的静态资源 + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + https://gitee.com/starblues/springboot-plugin-framework-parent + scm:https://gitee.com/starblues/springboot-plugin-framework-parent.git + scm:https://gitee.com/starblues/springboot-plugin-framework-parent.git + 1.0 + + + + + sonatype-nexus-snapshots + oss Snapshots Repository + https://oss.sonatype.org/content/repositories/snapshots + + + sonatype-nexus-staging + oss Staging Repository + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + StarBlues + starblues@foxmail.com + https://gitee.com/starblues/ + + + + + + + 1.8 + UTF-8 + + 3.8.1 + 3.1.0 + 3.1.0 + 3.1.0 + 1.6 + + 2.2.0-RELEASE + 2.1.1.RELEASE + + + + + + + com.gitee.starblues + springboot-plugin-framework + ${springboot-plugin-framework.version} + provided + + + + org.springframework.boot + spring-boot-starter-web + 2.1.1.RELEASE + provided + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven-assembly-plugin.version} + + + jar-with-dependencies + + ${project.artifactId}-${project.version} + false + false + + + true + true + + + + + + make-assembly + package + + single + + + + + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + package + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${plugin.skip} + + + + package + + jar + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven-gpg-plugin.version} + + ${plugin.skip} + + + + sign-artifacts + verify + + sign + + + + + + + + + + + + + dev + + true + + + true + + + + + release + + false + + + + + + \ 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/PluginHandlerMappingProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginHandlerMappingProcess.java new file mode 100644 index 0000000..36ff467 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginHandlerMappingProcess.java @@ -0,0 +1,54 @@ +package com.gitee.starblues.extension.resources; + +import com.gitee.starblues.extension.resources.resolver.PluginResourceResolver; +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.post.PluginPostProcessorExtend; +import com.gitee.starblues.utils.OrderPriority; + +import java.util.List; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class PluginHandlerMappingProcess implements PluginPostProcessorExtend { + + private static final String KEY = "PluginHandlerMappingProcess"; + + + PluginHandlerMappingProcess() { + } + + @Override + public String key() { + return KEY; + } + + @Override + public OrderPriority order() { + return OrderPriority.getMiddlePriority(); + } + + @Override + public void initialize() throws Exception { + + } + + @Override + public synchronized void registry(List pluginRegistryInfos) throws Exception { + + for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { + PluginResourceResolver.parse(pluginRegistryInfo.getBasePlugin()); + } + + } + + @Override + public void unRegistry(List pluginRegistryInfos) throws Exception { + for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { + PluginResourceResolver.remove(pluginRegistryInfo.getPluginWrapper().getPluginId()); + } + } +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java new file mode 100644 index 0000000..67346ba --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java @@ -0,0 +1,23 @@ +package com.gitee.starblues.extension.resources; + +import java.util.Set; + +/** + * 插件静态资源的配置 + * + * @author zhangzhuo + * @version 1.0 + */ +public interface StaticResourceConfig { + + /** + * 静态文件路径 + * classpath: /static/ + * file: D://path/test + * @return 路径集合 + */ + Set locations(); + + + +} 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 new file mode 100644 index 0000000..a6ed316 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceExtension.java @@ -0,0 +1,45 @@ +package com.gitee.starblues.extension.resources; + +import com.gitee.starblues.extension.AbstractExtension; +import com.gitee.starblues.extension.resources.resolver.ResourceWebMvcConfigurer; +import com.gitee.starblues.factory.process.post.PluginPostProcessorExtend; +import org.springframework.context.ApplicationContext; +import org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.ArrayList; +import java.util.List; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class StaticResourceExtension extends AbstractExtension { + + private final static String KEY = "StaticResourceExtension"; + + @Override + public String key() { + return KEY; + } + + @Override + public void initialize(ApplicationContext applicationContext) throws Exception{ + WebMvcConfigurer webMvcConfigurer = new ResourceWebMvcConfigurer(applicationContext); + List webMvcConfigurers = new ArrayList<>(); + webMvcConfigurers.add(webMvcConfigurer); + DelegatingWebMvcConfiguration support = + applicationContext.getBean(DelegatingWebMvcConfiguration.class); + support.setConfigurers(webMvcConfigurers); + } + + + @Override + public List getPluginPostProcessor(ApplicationContext applicationContext) { + final List pluginPostProcessorExtends = new ArrayList<>(); + pluginPostProcessorExtends.add(new PluginHandlerMappingProcess()); + return pluginPostProcessorExtends; + } +} 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 new file mode 100644 index 0000000..d508d50 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java @@ -0,0 +1,260 @@ +package com.gitee.starblues.extension.resources.resolver; + +import com.gitee.starblues.extension.resources.StaticResourceConfig; +import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.integration.application.PluginApplication; +import com.gitee.starblues.integration.operator.PluginOperator; +import com.gitee.starblues.realize.BasePlugin; +import org.pf4j.PluginWrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.FileUrlResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.resource.AbstractResourceResolver; +import org.springframework.web.servlet.resource.ResourceResolverChain; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.net.MalformedURLException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class PluginResourceResolver extends AbstractResourceResolver { + + private final static Logger logger = LoggerFactory.getLogger(PluginResourceConfig.class); + + + private final static Map pluginResourceConfigMap = new ConcurrentHashMap<>(); + + PluginResourceResolver() { + } + + + @Override + protected Resource resolveResourceInternal(HttpServletRequest request, + String requestPath, List locations, + ResourceResolverChain chain) { + int startOffset = (requestPath.startsWith("/") ? 1 : 0); + int endOffset = requestPath.indexOf('/', 1); + if (endOffset != -1) { + String pluginId = requestPath.substring(startOffset, endOffset); + String partialPath = requestPath.substring(endOffset + 1); + + PluginResourceConfig pluginResourceConfig = pluginResourceConfigMap.get(pluginId); + + if(pluginResourceConfig == null){ + return null; + } + + Resource resource = resolveClassPath(pluginResourceConfig, partialPath); + if(resource != null){ + pluginResourceConfig.add(resource); + return resource; + } + + resource = resolveFilePath(pluginResourceConfig, partialPath); + if(resource != null){ + pluginResourceConfig.add(resource); + return resource; + } + return null; + + } + return chain.resolveResource(request, requestPath, locations); + } + + private Resource resolveClassPath(PluginResourceConfig pluginResourceConfig, + String partialPath){ + Set classPaths = pluginResourceConfig.getClassPaths(); + if(classPaths == null || classPaths.isEmpty()){ + return null; + } + + PluginWrapper pluginWrapper = pluginResourceConfig.getPluginWrapper(); + if(pluginWrapper == null){ + return null; + } + + ResourcePatternResolver resourcePatternResolver = + new PathMatchingResourcePatternResolver(pluginWrapper.getPluginClassLoader()); + + for (String classPath : classPaths) { + try { + Resource resource = resourcePatternResolver.getResource(classPath + partialPath); + if(resource != null && resource.exists()){ + return resource; + } + } catch (Exception e){ + e.printStackTrace(); + logger.debug(e.getMessage(), e); + } + } + return null; + } + + private Resource resolveFilePath(PluginResourceConfig pluginResourceConfig, String partialPath) { + Set filePaths = pluginResourceConfig.getFilePaths(); + if(filePaths == null || filePaths.isEmpty()){ + return null; + } + + for (String filePath : filePaths) { + Path path = Paths.get(filePath + partialPath); + if(Files.exists(path)){ + try { + FileUrlResource fileUrlResource = new FileUrlResource(path.toString()); + return fileUrlResource; + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + } + + return null; + + } + + + + + @Override + protected String resolveUrlPathInternal(String resourceUrlPath, + List locations, + ResourceResolverChain chain) { + return null; + } + + public static synchronized void remove(String pluginId){ + PluginResourceConfig pluginResourceConfig = pluginResourceConfigMap.get(pluginId); + if(pluginResourceConfig == null){ + return; + } + pluginResourceConfigMap.remove(pluginId); + List resources = pluginResourceConfig.getResources(); + if(resources != null && !resources.isEmpty()){ + for (Resource resource : resources) { + try { + resource.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static synchronized void parse(BasePlugin basePlugin){ + if(basePlugin == null){ + return; + } + + if(!(basePlugin instanceof StaticResourceConfig)){ + return; + } + + StaticResourceConfig staticResourceConfig = (StaticResourceConfig) basePlugin; + String pluginId = basePlugin.getWrapper().getPluginId(); + + Set locations = staticResourceConfig.locations(); + if(locations == null || locations.isEmpty()){ + return; + } + + Set classPaths = new HashSet<>(); + Set filePaths = new HashSet<>(); + + for (String location : locations) { + if(StringUtils.isEmpty(location)){ + continue; + } + final int first = location.indexOf(":"); + if(first == -1){ + logger.warn("This plugin '{}' location config '{}' cannot be resolved", pluginId, location); + continue; + } + String type = location.substring(0, first); + String path = location.substring(first+1); + + + if("classpath".equalsIgnoreCase(type)){ + if(!path.startsWith("/")){ + path = "/" + path; + } + if(!path.endsWith("/")){ + path = path + "/"; + } + classPaths.add(path); + } else if("file".equalsIgnoreCase(type)){ + filePaths.add(path); + } else { + logger.warn("The plugin '{}' type '{}' cannot be resolved", pluginId, type); + } + } + + PluginResourceConfig pluginResourceConfig = new PluginResourceConfig(); + pluginResourceConfig.setClassPaths(classPaths); + pluginResourceConfig.setFilePaths(filePaths); + pluginResourceConfig.setPluginWrapper(basePlugin.getWrapper()); + pluginResourceConfigMap.put(pluginId, pluginResourceConfig); + } + + + private static class PluginResourceConfig { + + + + private PluginWrapper pluginWrapper; + private Set classPaths; + private Set filePaths; + private List resources = new ArrayList<>(); + + + PluginWrapper getPluginWrapper() { + return pluginWrapper; + } + + void setPluginWrapper(PluginWrapper pluginWrapper) { + this.pluginWrapper = pluginWrapper; + } + + Set getClassPaths() { + return classPaths; + } + + void setClassPaths(Set classPaths) { + this.classPaths = classPaths; + } + + Set getFilePaths() { + return filePaths; + } + + void setFilePaths(Set filePaths) { + this.filePaths = filePaths; + } + + void add(Resource resource){ + if(resource != null){ + resources.add(resource); + } + } + + List getResources() { + return resources; + } + } + + +} diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java new file mode 100644 index 0000000..c4a4693 --- /dev/null +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java @@ -0,0 +1,37 @@ +package com.gitee.starblues.extension.resources.resolver; + +import com.gitee.starblues.integration.IntegrationConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class ResourceWebMvcConfigurer implements WebMvcConfigurer { + + private final static Logger logger = LoggerFactory.getLogger(ResourceWebMvcConfigurer.class); + + + private final IntegrationConfiguration configuration; + + public ResourceWebMvcConfigurer(ApplicationContext applicationContext) { + this.configuration = applicationContext.getBean(IntegrationConfiguration.class); + } + + + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/" + configuration.pluginStaticResourcePathPrefix() + "/**") + .resourceChain(configuration.isCachePluginStaticResources()) + .addResolver(new PluginResourceResolver()); + } + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/AbstractExtension.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/AbstractExtension.java index 88cdde8..781bf32 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/AbstractExtension.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/AbstractExtension.java @@ -1,5 +1,6 @@ package com.gitee.starblues.extension; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.loader.PluginResourceLoader; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroupExtend; @@ -16,12 +17,27 @@ import java.util.List; */ public abstract class AbstractExtension { + protected PluginApplication pluginApplication; + + + public void setPluginApplication(PluginApplication pluginApplication) { + this.pluginApplication = pluginApplication; + } + /** * 扩展key * @return String */ public abstract String key(); + /** + * 该扩展初始化的操作 + * @throws Exception 初始化异常 + */ + public void initialize(ApplicationContext applicationContext) throws Exception{ + } + + /** * 得到插件的资源加载者 * @return List PluginResourceLoader diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionFactory.java index 49d1f4e..f30ad5c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionFactory.java @@ -2,16 +2,15 @@ package com.gitee.starblues.extension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; import org.springframework.util.StringUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; /** - * 扩展工厂 + * 静态的扩展工厂 * * @author zhangzhuo * @version 2.1.0 @@ -20,17 +19,16 @@ public class ExtensionFactory { private static final Logger LOG = LoggerFactory.getLogger(ExtensionFactory.class); - private static final ExtensionFactory EXTENSION_FACTORY = new ExtensionFactory(); - - private final Map> pluginExtensionMap = new HashMap<>(); + /** + * 扩展工厂。key 扩展的key. 值为扩展的实现 + */ + private final static Map PLUGIN_EXTENSION_MAP = new ConcurrentHashMap<>(); private ExtensionFactory(){} - public static ExtensionFactory getSingleton(){ - return EXTENSION_FACTORY; - } - public void addExtension(AbstractExtension abstractExtension){ + + public static void addExtension(AbstractExtension abstractExtension){ if(abstractExtension == null){ LOG.warn("add failure, abstractExtension is null"); return; @@ -39,50 +37,15 @@ public class ExtensionFactory { if(StringUtils.isEmpty(key)){ LOG.error("add failure, key is empty"); } - List abstractExtensions = pluginExtensionMap.get(key); - if(abstractExtensions == null){ - abstractExtensions = new ArrayList<>(); - pluginExtensionMap.put(key, abstractExtensions); - } - abstractExtensions.add(abstractExtension); + PLUGIN_EXTENSION_MAP.put(key, abstractExtension); } - public Map> getPluginExtension() { - return pluginExtensionMap; + static Map getPluginExtension() { + return Collections.unmodifiableMap(PLUGIN_EXTENSION_MAP); } - /** - * 迭代器 - * @param consumer 消费者 - */ - public void iteration(Consumer consumer){ - pluginExtensionMap.forEach((k, abstractExtensions)->{ - for (AbstractExtension abstractExtension : abstractExtensions) { - consumer.accept(abstractExtension); - } - }); - } - - /** - * list 迭代器 - * @param list list 集合 - * @param consumer list数据项消费者 - * @param 泛型 - */ - public void iteration(List list, Consumer consumer){ - if(list == null || list.isEmpty()){ - return; - } - for (T t : list) { - if(t == null){ - continue; - } - consumer.accept(t); - } - } - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java new file mode 100644 index 0000000..1325697 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java @@ -0,0 +1,147 @@ +package com.gitee.starblues.extension; + +import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; +import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroupExtend; +import com.gitee.starblues.factory.process.post.PluginPostProcessorExtend; +import com.gitee.starblues.loader.PluginResourceLoader; +import com.gitee.starblues.utils.CommonUtils; +import com.gitee.starblues.utils.OrderPriority; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Stream; + +/** + * 静态的扩展初始化器 + * + * @author zhangzhuo + * @version 1.0 + */ +public class ExtensionInitializer { + + + private static final Logger LOG = LoggerFactory.getLogger(ExtensionInitializer.class); + + private static final AtomicBoolean IS_INIT = new AtomicBoolean(false); + + private static final List RESOURCE_LOADERS_EXTENDS = new ArrayList<>(); + private static final List PIPE_PROCESSOR_EXTENDS = new ArrayList<>(); + private static final List CLASS_GROUP_EXTENDS = new ArrayList<>(); + private static final List POST_PROCESSOR_EXTENDS = new ArrayList<>(); + + private ExtensionInitializer(){ + + } + + + public static synchronized void initialize(ApplicationContext applicationContext){ + if(applicationContext == null){ + LOG.error("ApplicationContext is null, cannot initialize"); + return; + } + if(IS_INIT.get()){ + throw new RuntimeException("The extension has been initialized"); + } + Map pluginExtension = ExtensionFactory.getPluginExtension(); + for (Map.Entry entry : pluginExtension.entrySet()){ + AbstractExtension abstractExtension = entry.getValue(); + if(abstractExtension == null){ + continue; + } + try { + abstractExtension.initialize(applicationContext); + initialize(abstractExtension, applicationContext); + } catch (Exception e) { + LOG.error("Plugin extension '{}' initialize exception. {}", abstractExtension.key(), e.getMessage(), e); + } + } + IS_INIT.set(true); + } + + private static void initialize(AbstractExtension abstractExtension, ApplicationContext applicationContext){ + StringBuilder debug = new StringBuilder(); + debug.append("Plugin extension '").append(abstractExtension.key()).append("'") + .append(" are ["); + iteration(abstractExtension.getPluginResourceLoader(), pluginResourceLoader->{ + RESOURCE_LOADERS_EXTENDS.add(pluginResourceLoader); + debug.append(pluginResourceLoader.key()).append("、"); + }, bean -> bean.order()); + + iteration(abstractExtension.getPluginPipeProcessor(applicationContext), pluginResourceLoader->{ + PIPE_PROCESSOR_EXTENDS.add(pluginResourceLoader); + debug.append(pluginResourceLoader.key()).append("、"); + }, bean -> bean.order()); + + iteration(abstractExtension.getPluginClassGroup(applicationContext), pluginResourceLoader->{ + CLASS_GROUP_EXTENDS.add(pluginResourceLoader); + debug.append(pluginResourceLoader.key()).append("、"); + }, null); + + iteration(abstractExtension.getPluginPostProcessor(applicationContext), pluginResourceLoader->{ + POST_PROCESSOR_EXTENDS.add(pluginResourceLoader); + debug.append(pluginResourceLoader.key()); + }, bean -> bean.order()); + + debug.append("] is registered"); + LOG.info("Plugin extension '{}' is registered", abstractExtension.key()); + LOG.debug(debug.toString()); + } + + + public static List getResourceLoadersExtends() { + return RESOURCE_LOADERS_EXTENDS; + } + + public static List getPipeProcessorExtends() { + return PIPE_PROCESSOR_EXTENDS; + } + + public static List getClassGroupExtends() { + return CLASS_GROUP_EXTENDS; + } + + public static List getPostProcessorExtends() { + return POST_PROCESSOR_EXTENDS; + } + + /** + * 迭代器 + * @param list 当前处理的集合 + * @param consumer 消费集合中的数据项 + * @param order 排序集合。传入 null 表示不需要排序 + */ + private static void iteration(List list, Consumer consumer, final Function order){ + if(list == null || list.isEmpty()){ + return; + } + if(order != null){ + list.stream() + .filter(t -> t != null) + .sorted(Comparator.comparing(t -> { + OrderPriority orderPriority = order.apply(t); + if(orderPriority == null){ + orderPriority = OrderPriority.getLowPriority(); + } + return orderPriority.getPriority(); + }, Comparator.nullsLast(Comparator.reverseOrder()))) + .forEach(consumer); + ; + } else { + for (T t : list) { + if(t != null){ + consumer.accept(t); + } + } + } + } + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/DefaultPluginFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/DefaultPluginFactory.java index 7dc8313..ac46f81 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/DefaultPluginFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/DefaultPluginFactory.java @@ -30,7 +30,7 @@ public class DefaultPluginFactory implements PluginFactory { */ private final Map registerPluginInfoMap = new HashMap<>(); private final GenericApplicationContext applicationContext; - private final PluginPipeProcessor pluginProcessor; + private final PluginPipeProcessor pluginPipeProcessor; private final PluginPostProcessor pluginPostProcessor; private final PluginListenerFactory pluginListenerFactory; @@ -47,7 +47,7 @@ public class DefaultPluginFactory implements PluginFactory { public DefaultPluginFactory(ApplicationContext applicationContext, PluginListenerFactory pluginListenerFactory) { - this.pluginProcessor = new PluginPipeProcessorFactory(applicationContext); + this.pluginPipeProcessor = new PluginPipeProcessorFactory(applicationContext); this.pluginPostProcessor = new PluginPostProcessorFactory(applicationContext); this.applicationContext = (GenericApplicationContext) applicationContext; if(pluginListenerFactory == null){ @@ -59,6 +59,11 @@ public class DefaultPluginFactory implements PluginFactory { } + @Override + public void initialize() throws Exception{ + pluginPipeProcessor.initialize(); + pluginPostProcessor.initialize(); + } @Override public synchronized PluginFactory registry(PluginWrapper pluginWrapper) throws Exception { @@ -75,7 +80,7 @@ public class DefaultPluginFactory implements PluginFactory { PluginRegistryInfo registerPluginInfo = new PluginRegistryInfo(pluginWrapper); AopUtils.resolveAop(pluginWrapper); try { - pluginProcessor.registry(registerPluginInfo); + pluginPipeProcessor.registry(registerPluginInfo); registerPluginInfoMap.put(pluginWrapper.getPluginId(), registerPluginInfo); buildContainer.add(registerPluginInfo); return this; @@ -98,7 +103,7 @@ public class DefaultPluginFactory implements PluginFactory { throw new Exception("Unable to UnRegistry operate. Because there's no build"); } try { - pluginProcessor.unRegistry(registerPluginInfo); + pluginPipeProcessor.unRegistry(registerPluginInfo); buildContainer.add(registerPluginInfo); return this; } catch (Exception e) { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginFactory.java index 40e2c9f..619b0cb 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginFactory.java @@ -12,6 +12,13 @@ import org.pf4j.PluginWrapper; */ public interface PluginFactory extends PluginListenerContext { + /** + * 工厂初始化 + * @throws Exception 初始化异常 + */ + void initialize() throws Exception; + + /** * 注册插件。 * @param pluginWrapper 插件 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 23ecdd1..4e11ab7 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 @@ -136,9 +136,20 @@ public class PluginRegistryInfo { * @param value 扩展值 */ public void addExtension(String key, Object value){ + if(extensionMap.containsKey(key)){ + throw new RuntimeException("The extension key ' " + key + " 'already exists"); + } extensionMap.put(key, value); } + /** + * 移除扩展数据 + * @param key 扩展的key + */ + public void removeExtension(String key){ + extensionMap.remove(key); + } + /** * 获取扩展值 * @param key 扩展的key diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessor.java index d71cedb..5893eec 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeProcessor.java @@ -11,6 +11,13 @@ import com.gitee.starblues.factory.PluginRegistryInfo; public interface PluginPipeProcessor { + /** + * 初始化 + * @throws Exception 初始化异常 + */ + void initialize() throws Exception; + + /** * 处理该插件的注册 * @param pluginRegistryInfo 插件注册的信息 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 ae6895f..6255401 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 @@ -1,12 +1,10 @@ package com.gitee.starblues.factory.process.pipe; -import com.gitee.starblues.extension.ExtensionFactory; +import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.BasicBeanProcessor; import com.gitee.starblues.factory.process.pipe.bean.ConfigBeanProcessor; import com.gitee.starblues.factory.process.pipe.classs.PluginClassProcess; -import com.gitee.starblues.utils.CommonUtils; -import com.gitee.starblues.utils.OrderPriority; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; @@ -24,46 +22,29 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { private final Logger log = LoggerFactory.getLogger(this.getClass()); - private List pluginPipeProcessors = new ArrayList<>(); + private final ApplicationContext applicationContext; + private final List pluginPipeProcessors = new ArrayList<>(); public PluginPipeProcessorFactory(ApplicationContext applicationContext){ - pluginPipeProcessors.add(new PluginClassProcess(applicationContext)); + this.applicationContext = applicationContext; + } + + + + @Override + public void initialize() throws Exception{ + pluginPipeProcessors.add(new PluginClassProcess()); pluginPipeProcessors.add(new BasicBeanProcessor(applicationContext)); pluginPipeProcessors.add(new ConfigBeanProcessor(applicationContext)); - addExtension(applicationContext); - } + // 添加扩展 + pluginPipeProcessors.addAll(ExtensionInitializer.getPipeProcessorExtends()); - /** - * 添加扩展 - * @param applicationContext applicationContext - */ - private void addExtension(ApplicationContext applicationContext) { - ExtensionFactory extensionFactory = ExtensionFactory.getSingleton(); - List pluginPipeProcessorExtends = new ArrayList<>(); - extensionFactory.iteration(abstractExtension -> { - List pluginPipeProcessors = - abstractExtension.getPluginPipeProcessor(applicationContext); - extensionFactory.iteration(pluginPipeProcessors, pluginPipeProcessorExtend->{ - pluginPipeProcessorExtends.add(pluginPipeProcessorExtend); - }); - }); - if(pluginPipeProcessorExtends.isEmpty()){ - return; - } - CommonUtils.order(pluginPipeProcessorExtends, (pluginPipeProcessorExtend -> { - OrderPriority order = pluginPipeProcessorExtend.order(); - if(order == null){ - order = OrderPriority.getLowPriority(); - } - return order.getPriority(); - })); - for (PluginPipeProcessorExtend pluginPipeProcessorExtend : pluginPipeProcessorExtends) { - pluginPipeProcessors.add(pluginPipeProcessorExtend); - log.info("Register Extension PluginPipeProcessor : {}", pluginPipeProcessorExtend.key()); + // 进行初始化 + for (PluginPipeProcessor pluginPipeProcessor : pluginPipeProcessors) { + pluginPipeProcessor.initialize(); } } - @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { for (PluginPipeProcessor pluginPipeProcessor : pluginPipeProcessors) { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java index 5def94a..3749486 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java @@ -43,6 +43,11 @@ public class BasicBeanProcessor implements PluginPipeProcessor { (ConfigurableListableBeanFactory)applicationContext.getAutowireCapableBeanFactory()); } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { Set beanNames = new HashSet<>(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java index cf904bf..b11885c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java @@ -40,6 +40,11 @@ public class ConfigBeanProcessor implements PluginPipeProcessor { } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { List> configDefinitions = diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java index c298c39..28b4540 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java @@ -1,6 +1,7 @@ package com.gitee.starblues.factory.process.pipe.classs; import com.gitee.starblues.extension.ExtensionFactory; +import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessor; import com.gitee.starblues.factory.process.pipe.classs.group.*; @@ -38,7 +39,11 @@ public class PluginClassProcess implements PluginPipeProcessor { private final List pluginClassGroups = new ArrayList<>(); - public PluginClassProcess(ApplicationContext applicationContext){ + public PluginClassProcess(){} + + + @Override + public void initialize() { pluginClassGroups.add(new ComponentGroup()); pluginClassGroups.add(new ControllerGroup()); pluginClassGroups.add(new RepositoryGroup()); @@ -46,25 +51,13 @@ public class PluginClassProcess implements PluginPipeProcessor { pluginClassGroups.add(new ConfigDefinitionGroup()); pluginClassGroups.add(new SupplierGroup()); pluginClassGroups.add(new CallerGroup()); - addExtension(applicationContext); - } + // 添加扩展 + pluginClassGroups.addAll(ExtensionInitializer.getClassGroupExtends()); - /** - * 添加扩展 - * @param applicationContext applicationContext - */ - private void addExtension(ApplicationContext applicationContext) { - ExtensionFactory extensionFactory = ExtensionFactory.getSingleton(); - extensionFactory.iteration(abstractExtension -> { - List pluginClassGroups = abstractExtension.getPluginClassGroup(applicationContext); - extensionFactory.iteration(pluginClassGroups, pluginClassGroup -> { - this.pluginClassGroups.add(pluginClassGroup); - log.info("Register Extension PluginClassGroup : {}", pluginClassGroup.key()); - }); - }); - } + } + @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessor.java index baf0c71..c34852f 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessor.java @@ -12,6 +12,12 @@ import java.util.List; */ public interface PluginPostProcessor { + /** + * 初始化 + * @throws Exception 初始化异常 + */ + void initialize() throws Exception; + /** * 处理该插件的注册 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java index 54fdf49..2ae3982 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java @@ -1,13 +1,10 @@ package com.gitee.starblues.factory.process.post; -import com.gitee.starblues.extension.ExtensionFactory; +import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.post.bean.PluginConfigurationPostProcessor; import com.gitee.starblues.factory.process.post.bean.PluginControllerPostProcessor; import com.gitee.starblues.factory.process.post.bean.PluginInvokePostProcessor; -import com.gitee.starblues.utils.AopUtils; -import com.gitee.starblues.utils.CommonUtils; -import com.gitee.starblues.utils.OrderPriority; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; @@ -25,45 +22,29 @@ public class PluginPostProcessorFactory implements PluginPostProcessor { private final Logger log = LoggerFactory.getLogger(this.getClass()); - private List pluginPostProcessors = new ArrayList<>(); + private final List pluginPostProcessors = new ArrayList<>(); + private final ApplicationContext applicationContext; public PluginPostProcessorFactory(ApplicationContext applicationContext){ + this.applicationContext = applicationContext; + } + + @Override + public void initialize() throws Exception{ pluginPostProcessors.add(new PluginConfigurationPostProcessor(applicationContext)); pluginPostProcessors.add(new PluginInvokePostProcessor(applicationContext)); pluginPostProcessors.add(new PluginControllerPostProcessor(applicationContext)); - addExtension(applicationContext); - } + // 添加扩展 + pluginPostProcessors.addAll(ExtensionInitializer.getPostProcessorExtends()); - /** - * 添加扩展 - * @param mainApplicationContext mainApplicationContext - */ - private void addExtension(ApplicationContext mainApplicationContext) { - ExtensionFactory extensionFactory = ExtensionFactory.getSingleton(); - List pluginPostProcessorExtends = new ArrayList<>(); - extensionFactory.iteration(abstractExtension -> { - List pluginPostProcessors = - abstractExtension.getPluginPostProcessor(mainApplicationContext); - extensionFactory.iteration(pluginPostProcessors, pluginPipeProcessorExtend->{ - pluginPostProcessorExtends.add(pluginPipeProcessorExtend); - }); - }); - if(pluginPostProcessorExtends.isEmpty()){ - return; - } - CommonUtils.order(pluginPostProcessorExtends, (pluginPipeProcessorExtend -> { - OrderPriority order = pluginPipeProcessorExtend.order(); - if(order == null){ - order = OrderPriority.getMiddlePriority(); - } - return order.getPriority(); - })); - for (PluginPostProcessorExtend pluginPostProcessorExtend : pluginPostProcessorExtends) { - pluginPostProcessors.add(pluginPostProcessorExtend); - log.info("Register Extension PluginPostProcessor : {}", pluginPostProcessorExtend.getClass()); + + // 进行初始化 + for (PluginPostProcessor pluginPostProcessor : pluginPostProcessors) { + pluginPostProcessor.initialize(); } } + @Override public void registry(List pluginRegistryInfos) throws Exception{ for (PluginPostProcessor pluginPostProcessor : pluginPostProcessors) { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginConfigurationPostProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginConfigurationPostProcessor.java index 11cacec..eef229e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginConfigurationPostProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginConfigurationPostProcessor.java @@ -29,6 +29,11 @@ public class PluginConfigurationPostProcessor implements PluginPostProcessor { } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(List pluginRegistryInfos) throws Exception { ConfigurationClassPostProcessor configurationClassPostProcessor = 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 1dd7d5b..14f73e4 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 @@ -50,6 +50,11 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(List pluginRegistryInfos) throws Exception { for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java index 481ec13..ca7542c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java @@ -49,6 +49,11 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { } + @Override + public void initialize() throws Exception { + + } + @Override public void registry(List pluginRegistryInfos) throws Exception { for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { 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 ab23f57..c7bbab5 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 @@ -142,4 +142,5 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ return enablePluginIdRestControllerPathPrefix; } } + } 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 76475ea..153bc90 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 @@ -56,4 +56,21 @@ public interface IntegrationConfiguration { */ boolean enablePluginIdRestControllerPathPrefix(); + + /** + * 访问插件静态资源前缀。默认为: static-plugin。不允许出现 '/' '\' 符号 + * @return 插件静态资源访问前缀 + */ + default String pluginStaticResourcePathPrefix(){ + return "static-plugin"; + } + + /** + * 是否缓存插件访问的静态资源。默认不缓存 + * @return true缓存。false不缓存 + */ + default boolean isCachePluginStaticResources(){ + return false; + } + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java index ab1fb9c..66581a9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java @@ -19,12 +19,15 @@ import java.util.List; public abstract class AbstractPluginApplication implements PluginApplication { protected final PluginListenerFactory listenerFactory = new PluginListenerFactory(); - protected final ExtensionFactory extensionFactory = ExtensionFactory.getSingleton(); @Override public void addExtension(AbstractExtension extension) { - extensionFactory.addExtension(extension); + if(extension == null){ + return; + } + extension.setPluginApplication(this); + ExtensionFactory.addExtension(extension); } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/DefaultInitializerListener.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/DefaultInitializerListener.java new file mode 100644 index 0000000..9c529a4 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/DefaultInitializerListener.java @@ -0,0 +1,37 @@ +package com.gitee.starblues.integration.listener; + +import com.gitee.starblues.extension.ExtensionFactory; +import com.gitee.starblues.extension.ExtensionInitializer; +import org.springframework.context.ApplicationContext; + +/** + * 默认的初始化监听者。内置注册 + * + * @author zhangzhuo + * @version 1.0 + */ +public class DefaultInitializerListener implements PluginInitializerListener{ + + public final ApplicationContext applicationContext; + + public DefaultInitializerListener(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + + @Override + public void before() { + // 初始化扩展注册信息 + ExtensionInitializer.initialize(applicationContext); + } + + @Override + public void complete() { + + } + + @Override + public void failure(Throwable throwable) { + + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListener.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListener.java index f2fa2de..e645e57 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListener.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListener.java @@ -1,6 +1,5 @@ package com.gitee.starblues.integration.listener; -import org.pf4j.Plugin; /** * 插件初始化监听者 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListenerFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListenerFactory.java index abdc23a..bef44c7 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListenerFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginInitializerListenerFactory.java @@ -15,10 +15,12 @@ public class PluginInitializerListenerFactory implements PluginInitializerListen private final List pluginInitializerListeners = new ArrayList<>(); - public final ApplicationContext mainApplicationContext; + public final ApplicationContext applicationContext; - public PluginInitializerListenerFactory(ApplicationContext mainApplicationContext) { - this.mainApplicationContext = mainApplicationContext; + public PluginInitializerListenerFactory(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + // 添加默认的初始化监听者 + pluginInitializerListeners.add(new DefaultInitializerListener(applicationContext)); } @Override 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 643ad0d..3b71042 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 @@ -41,7 +41,7 @@ public class DefaultPluginOperator implements PluginOperator { private boolean isInit = false; private final Logger log = LoggerFactory.getLogger(this.getClass()); - private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + private final static DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); protected final IntegrationConfiguration integrationConfiguration; @@ -74,11 +74,16 @@ public class DefaultPluginOperator implements PluginOperator { throw new RuntimeException("Plugins Already initialized. Cannot be initialized again"); } try { - pluginInitializerListenerFactory.addPluginInitializerListeners(pluginInitializerListener); - log.info("Start initialize plugins of root path '{}'", pluginManager.getPluginsRoot().toString()); - pluginInitializerListenerFactory.before(); // 启动前, 清除空文件 PluginFileUtils.cleanEmptyFile(pluginManager.getPluginsRoot()); + + pluginInitializerListenerFactory.addPluginInitializerListeners(pluginInitializerListener); + log.info("Plugins start initialize of root path '{}'", pluginManager.getPluginsRoot().toString()); + // 触发插件初始化监听器 + pluginInitializerListenerFactory.before(); + // 开始初始化插件工厂 + pluginFactory.initialize(); + // 开始加载插件 pluginManager.loadPlugins(); pluginManager.startPlugins(); List pluginWrappers = pluginManager.getStartedPlugins(); @@ -92,18 +97,19 @@ public class DefaultPluginOperator implements PluginOperator { GlobalRegistryInfo.addOperatorPluginInfo(pluginId, PluginOperatorInfo.OperatorType.INSTALL, false); try { + // 依次注册插件信息到Spring boot pluginFactory.registry(pluginWrapper); } catch (Exception e){ - log.error("Registry plugin '{}' failure. Reason : {}", pluginId, e.getMessage(), e); + log.error("Plugin '{}' registry failure. Reason : {}", pluginId, e.getMessage(), e); isFoundException = true; } } pluginFactory.build(); if(isFoundException){ - log.error("Initialize plugins failure"); + log.error("Plugins initialize failure"); return false; } else { - log.info("Initialize plugins success"); + log.info("Plugins initialize success"); pluginInitializerListenerFactory.complete(); isInit = true; return true; @@ -144,27 +150,27 @@ public class DefaultPluginOperator implements PluginOperator { pluginId = pluginManager.loadPlugin(targetPath); } if(StringUtils.isEmpty(pluginId)){ - log.error("Install plugin '{}' failure, this plugin id is empty.", pluginId); + log.error("Plugin '{}' install failure, this plugin id is empty.", pluginId); return false; } GlobalRegistryInfo.addOperatorPluginInfo(pluginId, PluginOperatorInfo.OperatorType.INSTALL, true); if(start(pluginId)){ - log.info("Install plugin '{}' success", pluginId); + log.info("Plugin '{}' install success", pluginId); return true; } else { - log.error("Install plugin '{}' failure", pluginId); + log.error("Plugin '{}' install failure", pluginId); return false; } } catch (Exception e){ // 说明load成功, 但是没有启动成功, 则卸载该插件 - log.error("Install plugin '{}' failure. {}", pluginId, e.getMessage()); + log.error("Plugin '{}' install failure. {}", pluginId, e.getMessage()); log.info("Start uninstall plugin '{}' failure", pluginId); try { if(!StringUtils.isEmpty(pluginId)){ uninstall(pluginId, false); } } catch (Exception uninstallException){ - log.error("Uninstall plugin '{}' failure. {}", pluginId, e.getMessage()); + log.error("Plugin '{}' uninstall failure. {}", pluginId, e.getMessage()); } throw e; } finally { @@ -181,14 +187,14 @@ public class DefaultPluginOperator implements PluginOperator { } PluginWrapper pluginWrapper = pluginManager.getPlugin(pluginId); if(pluginWrapper == null){ - throw new Exception("Uninstall plugin failure, Not found plugin '" + pluginId + "'"); + throw new Exception("Plugin uninstall failure, Not found plugin '" + pluginId + "'"); } Exception exception = null; try { pluginFactory.unRegistry(pluginId); pluginFactory.build(); } catch (Exception e){ - log.error("Uninstall plugin '{}' failure, {}", pluginId, e.getMessage()); + log.error("Plugin '{}' uninstall failure, {}", pluginId, e.getMessage()); exception = e; } try { @@ -202,17 +208,17 @@ public class DefaultPluginOperator implements PluginOperator { // 不备份的话。直接删除该文件 Files.deleteIfExists(pluginPath); } - log.info("Uninstall plugin '{}' success", pluginId); + log.info("Plugin '{}' uninstall success", pluginId); return true; } else { - log.error("Uninstall plugin '{}' failure", pluginId); + log.error("Plugin '{}' uninstall failure", pluginId); return false; } } catch (Exception e){ if(exception != null){ exception.printStackTrace(); } - log.error("Uninstall plugin '{}' failure. {}", pluginId, e.getMessage()); + log.error("Plugin '{}' uninstall failure. {}", pluginId, e.getMessage()); throw e; } } @@ -234,18 +240,18 @@ public class DefaultPluginOperator implements PluginOperator { GlobalRegistryInfo.addOperatorPluginInfo(pluginId, PluginOperatorInfo.OperatorType.START, false); pluginFactory.registry(pluginWrapper); pluginFactory.build(); - log.info("Start plugin '{}' success", pluginId); + log.info("Plugin '{}' start success", pluginId); return true; } - log.error("Start plugin '{}' failure, plugin state is not start. Current plugin state is '{}'", + log.error("Plugin '{}' start failure, plugin state is not start. Current plugin state is '{}'", pluginId, pluginState.toString()); } catch (Exception e){ - log.error("Start plugin '{}' failure. {}", pluginId, e.getMessage()); + log.error("Plugin '{}' start failure. {}", pluginId, e.getMessage()); log.info("Start stop plugin {}", pluginId); try { stop(pluginId); } catch (Exception stopException){ - log.error("Stop plugin '{}' failure. {}", pluginId, e.getMessage()); + log.error("Plugin '{}' stop failure. {}", pluginId, e.getMessage()); } throw e; } @@ -266,15 +272,15 @@ public class DefaultPluginOperator implements PluginOperator { pluginFactory.unRegistry(pluginId); pluginFactory.build(); } catch (Exception e){ - log.error("Stop plugin '{}' failure. {}", pluginId, e.getMessage()); + log.error("Plugin '{}' stop failure. {}", pluginId, e.getMessage()); e.printStackTrace(); } try { pluginManager.stopPlugin(pluginId); - log.info("Stop plugin '{}' success", pluginId); + log.info("Plugin '{}' stop success", pluginId); return true; } catch (Exception e){ - log.error("Stop plugin '{}' failure. {}", pluginId, e.getMessage()); + log.error("Plugin '{}' stop failure. {}", pluginId, e.getMessage()); throw e; } } @@ -287,10 +293,10 @@ public class DefaultPluginOperator implements PluginOperator { } Path path = uploadPlugin(pluginFile); if(this.install(path)){ - log.info("Upload And Start plugin Success"); + log.info("Plugin upload and start success"); return true; } else { - log.error("Upload And Start plugin failure"); + log.error("Plugin upload and start failure"); return false; } } @@ -390,6 +396,11 @@ public class DefaultPluginOperator implements PluginOperator { return pluginManager.getPlugins(); } + @Override + public PluginWrapper getPluginWrapper(String pluginId) { + return pluginManager.getPlugin(pluginId); + } + /** * 上传插件 * @param pluginFile 插件文件 @@ -489,7 +500,7 @@ public class DefaultPluginOperator implements PluginOperator { return false; } if(!Files.exists(sourcePath)){ - log.error("path '{}' does not exist", sourcePath.toString()); + log.error("Path '{}' does not exist", sourcePath.toString()); return false; } String fileName = sourcePath.getFileName().toString(); @@ -527,7 +538,7 @@ public class DefaultPluginOperator implements PluginOperator { */ private String getNowTimeByFormat(){ LocalDateTime localDateTime = LocalDateTime.now(); - return dateTimeFormatter.format(localDateTime); + return FORMAT.format(localDateTime); } /** diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java index 0781548..7593742 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java @@ -131,10 +131,17 @@ public interface PluginOperator { Set getPluginFilePaths() throws Exception; /** - * 得到插件的包装类 [适用于生产环境、开发环境] + * 得到所有插件的包装类 [适用于生产环境、开发环境] * @return 返回插件包装类集合 */ List getPluginWrapper(); + /** + * 通过插件id得到插件的包装类 [适用于生产环境、开发环境] + * @param pluginId 插件id + * @return 返回插件包装类集合 + */ + PluginWrapper getPluginWrapper(String pluginId); + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java index b7f7fe2..692d13a 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java @@ -1,6 +1,6 @@ package com.gitee.starblues.loader; -import com.gitee.starblues.extension.ExtensionFactory; +import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.loader.load.PluginClassLoader; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.CommonUtils; @@ -30,7 +30,8 @@ public class PluginResourceLoadFactory { public PluginResourceLoadFactory() { this.pluginResourceLoaders.add(new PluginClassLoader()); - addExtension(); + // 添加扩展 + this.pluginResourceLoaders.addAll(ExtensionInitializer.getResourceLoadersExtends()); CommonUtils.order(pluginResourceLoaders, (pluginResourceLoader -> { OrderPriority order = pluginResourceLoader.order(); if (order == null) { @@ -40,21 +41,6 @@ public class PluginResourceLoadFactory { })); } - - /** - * 添加扩展 - */ - private void addExtension() { - ExtensionFactory extensionFactory = ExtensionFactory.getSingleton(); - extensionFactory.iteration(abstractExtension -> { - List pluginResourceLoaders = abstractExtension.getPluginResourceLoader(); - extensionFactory.iteration(pluginResourceLoaders, pluginResourceLoader -> { - this.pluginResourceLoaders.add(pluginResourceLoader); - LOG.info("Register Extension PluginResourceLoader : {}", pluginResourceLoader.key()); - }); - }); - } - /** * 加载插件类 * @param basePlugin 当前插件信息 -- Gitee From 0d60c3541fe5f174c281ac0b1814e12765b6110e Mon Sep 17 00:00:00 2001 From: StarBlues Date: Wed, 6 Nov 2019 15:55:59 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=9D=99=E6=80=81?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E6=89=A9=E5=B1=95=E6=A8=A1=E5=9D=97=E5=90=8E?= =?UTF-8?q?,=20=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E5=8D=B8=E8=BD=BD?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integration-mybatis-main/pom.xml | 9 +- .../mybatis/main/config/PluginBeanConfig.java | 9 + .../mybatis/main/config/Swagger2Config.java | 5 + .../com/mybatis/plugin1/ExamplePlugin1.java | 24 ++- .../com/mybatis/plugin1/entity/Plugin1.java | 1 + .../src/main/resources/static/css/all.css | 104 ++++++++++ .../src/main/resources/static/image/image.png | Bin 0 -> 5719 bytes .../src/main/resources/static/index.html | 22 ++ .../mybatis/PluginMybatisMapperProcessor.java | 4 - .../mybatis/PluginMybatisXmlProcessor.java | 7 +- .../mybatis/utils/MybatisXmlProcess.java | 4 +- .../pom.xml | 16 +- ...ava => PluginResourceResolverProcess.java} | 12 +- .../resources/StaticResourceConfig.java | 3 +- .../resources/StaticResourceExtension.java | 54 ++++- .../resolver/PluginResourceResolver.java | 193 ++++++++++++------ .../resolver/ResourceWebMvcConfigurer.java | 27 +-- springboot-plugin-framework/pom.xml | 28 +-- .../pipe/classs/PluginClassProcess.java | 3 +- .../integration/IntegrationConfiguration.java | 19 +- .../starblues/loader/PluginResource.java | 183 +++++++++++++++++ .../gitee/starblues/realize/BasePlugin.java | 21 +- .../starblues/realize/BasePluginExtend.java | 65 ++++++ 23 files changed, 665 insertions(+), 148 deletions(-) create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/css/all.css create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/image/image.png create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/index.html rename springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/{PluginHandlerMappingProcess.java => PluginResourceResolverProcess.java} (83%) create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResource.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePluginExtend.java diff --git a/example/integration-mybatis/integration-mybatis-main/pom.xml b/example/integration-mybatis/integration-mybatis-main/pom.xml index 1c62e7d..b8f8ee7 100644 --- a/example/integration-mybatis/integration-mybatis-main/pom.xml +++ b/example/integration-mybatis/integration-mybatis-main/pom.xml @@ -8,7 +8,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.1.RELEASE + 2.0.3.RELEASE @@ -41,6 +41,12 @@ ${extension-mybatis.version} + + com.gitee.starblues + springboot-plugin-framework-extension-resources + ${extension-mybatis.version} + + org.springframework.boot spring-boot @@ -72,6 +78,7 @@ ${mybatis-spring-boot-starter.version} + io.springfox springfox-swagger2 diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java index 853f2ec..eeb69c3 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java +++ b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java @@ -1,6 +1,7 @@ package com.mybatis.main.config; import com.gitee.starblues.extension.mybatis.SpringBootMybatisExtension; +import com.gitee.starblues.extension.resources.StaticResourceExtension; import com.gitee.starblues.integration.*; import com.gitee.starblues.integration.application.AutoPluginApplication; import com.gitee.starblues.integration.application.PluginApplication; @@ -8,8 +9,11 @@ import org.pf4j.RuntimeMode; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.http.CacheControl; import org.springframework.stereotype.Component; +import java.util.concurrent.TimeUnit; + /** * @Description: 插件集成配置 * @Author: zhangzhuo @@ -67,6 +71,11 @@ public class PluginBeanConfig { // 实例化自动初始化插件的PluginApplication PluginApplication pluginApplication = new AutoPluginApplication(); pluginApplication.addExtension(new SpringBootMybatisExtension()); + // 新增静态资源扩展 + StaticResourceExtension staticResourceExtension = new StaticResourceExtension(); + staticResourceExtension.setPathPrefix("static"); + staticResourceExtension.setCacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic()); + pluginApplication.addExtension(staticResourceExtension); return pluginApplication; } diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/Swagger2Config.java b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/Swagger2Config.java index b4eafe4..9de4e67 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/Swagger2Config.java +++ b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/Swagger2Config.java @@ -31,6 +31,11 @@ public class Swagger2Config { .build(); } + + + + + private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Integration Mybatis Plugin Example RESTful APIs") diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java index b800b00..b578dae 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java @@ -1,10 +1,14 @@ package com.mybatis.plugin1; import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; +import com.gitee.starblues.extension.resources.StaticResourceConfig; import com.gitee.starblues.realize.BasePlugin; +import com.mybatis.plugin1.entity.Plugin1; import org.pf4j.PluginWrapper; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; /** @@ -13,16 +17,24 @@ import java.util.Set; * @author zhangzhuo * @version 1.0 */ -public class ExamplePlugin1 extends BasePlugin implements SpringBootMybatisConfig { +public class ExamplePlugin1 extends BasePlugin + implements SpringBootMybatisConfig, StaticResourceConfig { private final Set mybatisMapperXmlLocationsMatch = new HashSet<>(); private final Set typeAliasesPackage = new HashSet<>(); + private final Map typeAliasesClass = new HashMap<>(); + + private final Set locations = new HashSet<>(); public ExamplePlugin1(PluginWrapper wrapper) { super(wrapper); mybatisMapperXmlLocationsMatch.add("classpath:mapper/*Mapper.xml"); typeAliasesPackage.add("com.mybatis.plugin1.entity"); + + typeAliasesClass.put("plugin1", Plugin1.class); + locations.add("classpath:static"); + locations.add("file:D:\\aa"); } @Override @@ -45,9 +57,19 @@ public class ExamplePlugin1 extends BasePlugin implements SpringBootMybatisConfi return mybatisMapperXmlLocationsMatch; } + @Override + public Map aliasMapping() { + return null; + } @Override public Set typeAliasesPackage() { return typeAliasesPackage; } + + @Override + public Set locations() { + return locations; + } + } diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java index cd59a83..b4d48bd 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/entity/Plugin1.java @@ -8,6 +8,7 @@ import org.apache.ibatis.type.Alias; * @author zhangzhuo * @version 1.0 */ +@Alias("plugin1") public class Plugin1 { private String id; diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/css/all.css b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/css/all.css new file mode 100644 index 0000000..3315976 --- /dev/null +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/css/all.css @@ -0,0 +1,104 @@ +body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, textarea, select, optgroup, option, fieldset, legend, p, blockquote, th, td { + margin:0; + padding:0 +} +fieldset, img { + border:0 +} +ul, li, ol { + list-style:none +} +h1, h2, h3, h4, h5, h6 { + font-size:100% +} +legend { + color:#000 +} +input, button, textarea, select, optgroup, option { + font-family:inherit; + font-size:inherit; + font-style:inherit; + font-weight:inherit +} +input, button, select { + margin:0; +*font-size:100%; + line-height:1.2 +} +a img, img { + -ms-interpolation-mode:bicubic +} +body { + background:#FFF +} +a { + color:#06c; + text-decoration:none +} +a:hover, a:active, a:focus { + color:#06c; + text-decoration:underline +} +table { + border-collapse:collapse; + border-spacing:0 +} +header, aside, section { + display:block +} +body, button, input, select, textarea { + font:12px/1.5 tahoma, arial, "隶书"; + color:#666 +} +.center { + text-align:center +} +.clear:after, .clearfix:after { + content:"."; + display:block; + clear:both; + visibility:hidden; + font-size:0; + height:0; + line-height:0 +} +.clear, .clearfix { + zoom:1 +} +.b-panel { + position:absolute +} +.b-fr { + float:right +} +.b-fl { + float:left +} +.error-404 { + background-color:#EDEDF0 +} +.module-error { + margin-top:182px +} +.module-error .error-main { + margin:0 auto; + width:420px +} +.module-error .label { + float:left; + width:160px; + height:151px; + background:url('../image/image.png') 0 0 no-repeat +} +.module-error .info { + margin-left:182px; + line-height:1.8 +} +.module-error .title { + color:#666; + font-size:14px +} +.module-error .reason { + margin:8px 0 18px 0; + color:#666 +} diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/image/image.png b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/resources/static/image/image.png new file mode 100644 index 0000000000000000000000000000000000000000..bebc1e79986616fa484d186b40d80c77cf9385e0 GIT binary patch literal 5719 zcmds5)mIb_u-*lvQ@RxC4oT^jl@94nX=Le^7C|JWyFpTxuEk{mk*=jXq?d-JuD|;q z+}Atjd^6{p`5tCo=A4<&S{iQ&aA|M>0003vkx4vq1NYlX0*v z$5er2%8#DoQN}?J=G)P%&6At11>|6w_*6}azpl*A+VV8ivnp81MfO!qieFxk$^KGg zUybAS66C86<7F9Wekda^P_A@%|L-JtXL+b|{$ym+4E!|snU?HDaYn`F(g!hI;wrM%!zHG-DGDvXlKN2q$}B0>{YO#;Oa;KVr;l9 zG4hj{O5NmPN%Y&5rG@G*pzg}d+w-QI$URpAArz9cZ0;;^SciQL0 z-kN9hr#0kfcIJr!;S;%kT2a>HEv+aY~+bR#V;eW}uq_h(>Lq3KxR)v@Rgl8kk!Mi;BD zGw{-E_->Ttn_Y-}cWvn^%(f?lySXGg!Gfc+#OAWb;A*>|B+m07M;Y9-^4-sA6)~0I zD1I`|-I1xD;;G=O$Y(A5Vz|k=BwA;<E@&~|D$-YnZoI; zN=bxOdvQora#VVt&OqbWX(Lz_^z$l-Ank&X_OVH7`8m(_NqETdu7n` zx+iG73yc`qBKH8~n;;^Rbg07h`)mL3rSu=xOTZoLjNTZXLh@-zdHRFd(GsnoCnt?{w zrtdnp!)bN#fon5Gs1sO4lviW4Oi!s{q$&SZqxDZ4#`2MagA}3bHuv-1&dYWGi8r%6 z000o+rK6$yuciNQ2Kc`WglS3j^WU1l@lY`W0|0o>{{wJxIpqFdlEO>L&`ZJ7&dSTt z-Hk!d(bWzhAi&2j!Y3d&;Xmd2PeJ#eLf75i%h$@&4j^aiZf(b)?C5Fd>+b0cW>C-- z{@AoB0sxR?fE4BQ{BpW-h)i{N+Xhx)f6e9zz7lj=Hs~1C6B~0{w~mtP$EI)>MfT7u z6;6Cz)PI~ySmG&zQpWwU3l{0kSe*9mG%LDRdHo(xOUB$ zcY;se+~$Kd&hk>AC+FH{yHdMB=aMJqonv=-qQK~92pavGUP*2KA6NW8cJPR9h60;h zviKy|vI<1!ge?4^@8zn4I+0;R1=s&eVRCXV8-D9RUyNr`mJ>niKm=yP*=acXET-JD zoO{n&SRgi(UaGF3*}?-VAx9B>1Nb~C8Wv2mRVF3p!$GnD#uD;z=5=gW+F|ST>>(>D zez)4VUek2hCv^@G)2@9M2`M!3eGci8U7X!LtyqBhoYOZG{XXXYP43}jUDak>Qxi)y z48U@a#TUet!>qWngiAOd1(g!k)p_em`^{jfvOYV%V%#{!_X;C8a0NhM6-P){B~MEX zNcQMd&4yxE+&81I#SorAhhc{{byLGEu6Upd!YO5F&rz4#!t9FnaXmnMp?aY0EsAQ~ zL!W>r22T@7SoW(Y6RNagua$tqTnW zufSu05--NHCa{=5#Xi(>&Gf_1L#x_La!Hrnh~_pWV-Fjc^NAd5{?c3iCiqUnE=w;* z0j%=S0ePbpWO053Q(ZXzI07Zwx%kVzWH$$ja88r6Iq1@A5S#w;St=_etb~YvI&EEO zYW}QSBMiw@CglUvAt7e=#R<5eKkJ03x)f>#w!FP@;n}!x>1KYofG;%DQ;y|W`3IqQ z*a{#zg2)85n3o5mP%QJub%17$lKxpbmAhpA{wYTl^7iE8Uyndz98tk->e?`aA@WLZ zGjeh>Zyv1I)Fi4zO%cu1V-68}*_B%x*z7vM0>by?NKAm3z(N05=@aWW6tz_DG5JpK zSEjXDo@%hg33Gle+JMP!!6oI`f*vwUyy&n)KX)2YvoUykQ5d zB@FYNj+que4*rfPERqD_FSHR95AR3Y8?bH|XL`vTsXQ$L?uesIVSRt|ykRaSqQ-4h z1_yU3A%t-Mil88BtT6&qGc*=zs&(wIuQWJ6Z3i^;!nm#V$)~DvX!>Bh_ zN4Aaei@eXhzenv|@U0kDx?TkB>;|FzEtg_Y_V$=;`=dLvkok*NwMQJCRWkQY_rbL^ zUALrcX|JlyKglZPa}*Yjxd~vBYdn&g-)Q5lbNx^-7&zg zutV^!rq6v9NuyOFE)c!H1|B8dPAyI3%D~apsDqW~d-G1T0#Km0@K} zU~rZ+yZSjFqJ*nr-o6Y)_r@;6%`@}15z9r{7rD>>M}WnOCV}-;_nT}{KoVa8L7xN5l4J-qX?Aa5> z#N*@jNOp^4VhYUjk+K7?n(f}IDq_Z9P_WhyYf$iQ>^YTArot?TaELALpU0*9{oT|0 zO~(y9y_dvZCr|ee`l{zTDmODelixL~bG-Mt)EyVi^nDD`Si{iu(DkcwWV|=uoNdpC zSN0!%3MW!&A9%bRxI)MNbrG)`&8E>l+)}pPlHP8b#KMpZB-(EEgReO>uWK!*Dj>6TSIr-=E4qGTMJQ z!?nE0@_wSH0c8HM|1zr@FveMdNmtJb;S$X1mtT<`-T&T*kGN(oHO)I!bq6HGiN^tT zM|9~nfq01TaNZiEc*2@#>64=ck$<@r%y@j zoQ5#9lxm6{TAu$lY;5#^zD{#pkH=DAc5QJ^wt6OpZqI>9R~7yKoz17Xa0B6NO8@=o zN}B;zEF#+?bq$N;)yLQkE0M4eTqo+r?NEQonRJTX<^}T?Qr;(fPeGZ}559@r)Hk3n zyRDgNe|*bzDPI}_qJ6Z7G7zFBmne#uZpz!8hjfd_W%w8O;Fxg}%BQFNe8T&!Ff6G0 zS&?8Wl|4EYW?Cx^QUGtsrsk``^A~~X{L3b*EqfA_J^r`L1fNKb2{L@79w=7;B3u=A zzbGp75vswiKF377k3?ibtD-Ut`A>(9feLN}8NSgpj4l8y&hedn$F$MiYKJtLt*Z)0 z|D|KEb~uYIl#2n)mD4u?*Y7D%#=j57=KRk2CU!LJZVh z?&m#yiUD`&!6$A29_{!})<*G|skhL|%(-T+CpiC?nix;$2S;&r>_#B>OT}~K#e~CX zeow%vOUIAhRsXn&fReMowa}rm7>)9$w2)kSa{gz1Me5N}h&*ZcDT%wKU5X-9Or(0! zCx=NhJh`;69p2cVrjVPx6QkR!2iw~-$#-Ta%wlk7*DCfb7l(z3a9lqTbnmXCQfJy( z(teX3_tmF|^=z3SOk>Fm{-+u5gJY*mH;E#&Gfpkwsb(FIMbBg9<%wxms4L7Nzw6fF zy5_Ud*^kh`Ztek9StSxw@@+Y78lT1Ej=+sOY(i7Y$HY21eN`9dultuGv{3-XH61dY z;$@fehmSP!dY9iK{m{p_pt+X#GcbD`oI+t1putGEn>)ar{aXh^-p~e^n3E+q9&a=N zy|oE=Sv&Z%Ry-}to^&H3cLiWxOBLanKj~34zPdWzn>L1)f$`x);T2l+b5e~`&v|7l zyUFB<`Qf3V!if@2vH6N2wW{IxLAtou50$is`&lE0$QurJMwl&mo?J)kSM0g@jp=7m zpl==@(w3UWUyEfJr_&^X!V{Dz8g>M;>&fbhF9jG2d?+}S_3?lD^1EGrWWg?Odrf1B zE88yIx#1UGUc(7t+@ux`L~z`^#Y@6Q7zXl{$G3MPwR`RlzZg) z)yf(1bS1USFsR#M8x9Q2ITHf!>CZA9LfN_Y>c7(O!oca0y1ooNTd>Yp1-xgN`7 z9MYF$Pm?V39j&;!-|8p5VkEPjLJ<>YBw4; zEAm*1mXh+ID-iTvnEiPMZ#=Fa(^6-?S|wdd`NJE}v%=Qa%}izac6Vuy{lp)8!UM~aYqKE(^=}PW%y1yen-6 zXL^3Q@P&^a7yvo0y&R1#CSMQ7`MZ=lsvPm85--iXU>ipWntetTNbn&;%c7oC11v`t zB1yd>p%kfH)ZIxMk*tEUdw6&*9W?k-6t2Z?1dPMfa3KRL>v8gJJ&UF!7IpCgciePz z|8NcLwXj_tV?RUexnJ5C_HZOgFnFnUFuf8l(qdon^L?Fj&-2N0YNabQE~K!vgN~i7 zaNlV_k7;uI_!sJuu!G;o&Ers4jFfTdg)V2gRpVw-II=k#iO<*B<;z#XG>sY1m`&?T zK`G$?OL`Ok(iJScC{=Bg%f=gP*5{}Cdl+-?3~lDk2poxAZ@GTtXq&6%cGb{m*={&j ziY~srx77%H1kZ)WM6Y_YM0Wc`L4JM~?N^d-4}JQ9v56S?dv!cRX)+^1%*O+f^hroq zH?3aDmn!($!_{voiMNohMdF%D?7Dy&N-lapYud+btJnw_^@G!R>wl!+gWgAq zZzZVQFu4HL=jd)hq?nL98%Gj)?{!|G+yd7jE6H<&Sp#|%F7^=3Icb)AE)n9~`w+0p z@7%+Wfgcvw!Vx@Cme8O?tTEzTrhg{V&CT&!L;-;{@?7aOVji&a%ZqSK2;GU8%80Dv z7u==67wdWzkLZN^!)VbHZ})@~)Tu*&+KFbORWXvV!goXP{!w(1;$b_32Hy+`_<=uw|TnzWInmlftUTWK$oiXog?yN5yBEEGA7#Z6$+?SK}of6{Zw-eH#tXN{y<&}$}^hzyM$tBASwvz@83Yt`F2Je{|_`+I&fw0u4mWvk6Jy>N5wgZeiAUms^w$XFX#WGKMNRMmNHH+JR3QZ|W% zA|U=u1vh)aAGGTyMFb49udRZrpVHc7KYsh5_!2(A%vz2x8u=1)&=9cC4l{1^2oSSQ z?mg3ZE$#3+ig+l2X7!nBH|m>ZdOvr%w521(b^vaS@4%juFy-x^>SAYWH5Iq6Y74X( znHS%GASP~eFGV3KEQX=jxzulCUF`6rSwG9)BwLCgHj!LFCUAZ6@ZQ@)lFd52N;YxL zqF1diJGL>kF=X;SFSm{ywMZ+gZPsI*vb>&eRbzcM3p%)@;EmO)D|S$c-?0I^-0@#q z9G)UrVlq6zV0BamN%;k-;MddQWHVHX3gvR*sruo7DqqNXtkL7E&Azzvn!j7NxfKr+%H2x3k$$tC0Gh!ZALq{e4EE + + integration-mybatis-plugin1 + + + + +
+ +
+
+
+
+
+

hello. 显示插件静态资源正常

+
+
+
+
+
+ + diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java index a35324a..a49f488 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java @@ -22,8 +22,6 @@ import org.springframework.context.annotation.AnnotationScopeMetadataResolver; import org.springframework.context.annotation.ScopeMetadata; import org.springframework.context.annotation.ScopeMetadataResolver; import org.springframework.context.support.GenericApplicationContext; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RestController; import java.util.HashSet; import java.util.List; @@ -32,8 +30,6 @@ import java.util.Set; /** * 插件 mybatis mapper 注册者 * @author zhangzhuo - * @see Controller - * @see RestController * @version 1.0 */ public class PluginMybatisMapperProcessor implements PluginPipeProcessorExtend { diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java index a77c15e..0f43209 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java @@ -3,6 +3,7 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.mybatis.utils.MybatisXmlProcess; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; +import com.gitee.starblues.loader.PluginResourceLoadFactory; import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.OrderPriority; @@ -55,8 +56,10 @@ public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { } BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - ResourceWrapper resourceWrapper = - basePlugin.getPluginResourceLoadFactory().getPluginResources(PluginMybatisXmlLoader.KEY); + PluginResourceLoadFactory pluginResourceLoadFactory = basePlugin.getBasePluginExtend().getPluginResourceLoadFactory(); + + + ResourceWrapper resourceWrapper = pluginResourceLoadFactory.getPluginResources(PluginMybatisXmlLoader.KEY); if(resourceWrapper == null){ return; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java index 5ed3265..6664a33 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java @@ -67,10 +67,10 @@ public class MybatisXmlProcess { ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); try { Resources.setDefaultClassLoader(pluginClassLoader); - for (Resource resource :resources) { + for (Resource resource : resources) { InputStream inputStream = resource.getInputStream(); try { - PluginMybatisXmlMapperBuilder xmlMapperBuilder = new PluginMybatisXmlMapperBuilder( + PluginMybatisXmlMapperBuilder xmlMapperBuilder = new PluginMybatisXmlMapperBuilder( inputStream, configuration, resource.toString(), configuration.getSqlFragments(), 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 03d4de0..3130e80 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 @@ -66,6 +66,9 @@ 3.1.0 1.6 + 5.0.7.RELEASE + 4.0.1 + 2.2.0-RELEASE 2.1.1.RELEASE @@ -81,12 +84,19 @@
- org.springframework.boot - spring-boot-starter-web - 2.1.1.RELEASE + org.springframework + spring-webmvc + ${spring-version} provided + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + provided + true + diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginHandlerMappingProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java similarity index 83% rename from springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginHandlerMappingProcess.java rename to springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java index 36ff467..e8dfdd8 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginHandlerMappingProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java @@ -8,17 +8,17 @@ import com.gitee.starblues.utils.OrderPriority; import java.util.List; /** - * description + * 插件资源处理器 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.1 */ -public class PluginHandlerMappingProcess implements PluginPostProcessorExtend { +public class PluginResourceResolverProcess implements PluginPostProcessorExtend { - private static final String KEY = "PluginHandlerMappingProcess"; + private static final String KEY = "PluginResourceResolverProcess"; - PluginHandlerMappingProcess() { + PluginResourceResolverProcess() { } @Override @@ -38,11 +38,9 @@ public class PluginHandlerMappingProcess implements PluginPostProcessorExtend { @Override public synchronized void registry(List pluginRegistryInfos) throws Exception { - for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { PluginResourceResolver.parse(pluginRegistryInfo.getBasePlugin()); } - } @Override diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java index 67346ba..bd2520d 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/StaticResourceConfig.java @@ -6,10 +6,11 @@ import java.util.Set; * 插件静态资源的配置 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.1 */ public interface StaticResourceConfig { + /** * 静态文件路径 * classpath: /static/ 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 a6ed316..1c1b891 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 @@ -4,22 +4,37 @@ import com.gitee.starblues.extension.AbstractExtension; import com.gitee.starblues.extension.resources.resolver.ResourceWebMvcConfigurer; import com.gitee.starblues.factory.process.post.PluginPostProcessorExtend; import org.springframework.context.ApplicationContext; +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.concurrent.TimeUnit; /** - * description + * 插件静态资源访问的扩展插件 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.1 */ public class StaticResourceExtension extends AbstractExtension { private final static String KEY = "StaticResourceExtension"; + /** + * 访问插件静态资源前缀。默认为: static-plugin。 + */ + private static String pluginStaticResourcePathPrefix = "static-plugin"; + + /** + * 访问静态资源的缓存控制。默认最大1小时。主要针对http协议的缓存。 + */ + private static CacheControl pluginStaticResourcesCacheControl = + CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic();; + + + @Override public String key() { return KEY; @@ -27,7 +42,7 @@ public class StaticResourceExtension extends AbstractExtension { @Override public void initialize(ApplicationContext applicationContext) throws Exception{ - WebMvcConfigurer webMvcConfigurer = new ResourceWebMvcConfigurer(applicationContext); + WebMvcConfigurer webMvcConfigurer = new ResourceWebMvcConfigurer(); List webMvcConfigurers = new ArrayList<>(); webMvcConfigurers.add(webMvcConfigurer); DelegatingWebMvcConfiguration support = @@ -39,7 +54,38 @@ public class StaticResourceExtension extends AbstractExtension { @Override public List getPluginPostProcessor(ApplicationContext applicationContext) { final List pluginPostProcessorExtends = new ArrayList<>(); - pluginPostProcessorExtends.add(new PluginHandlerMappingProcess()); + pluginPostProcessorExtends.add(new PluginResourceResolverProcess()); return pluginPostProcessorExtends; } + + /** + * 设置访问插件静态资源前缀 + * @param pluginStaticResourcePathPrefix 静态资源前缀。默认为: static-plugin。 + */ + public void setPathPrefix(String pluginStaticResourcePathPrefix){ + if(pluginStaticResourcePathPrefix != null && !"".equals(pluginStaticResourcePathPrefix)){ + StaticResourceExtension.pluginStaticResourcePathPrefix = pluginStaticResourcePathPrefix; + } + } + + /** + * 设置缓存控制 + * @param pluginStaticResourcesCacheControl 访问静态资源的缓存控制。默认最大1小时。主要针对http协议的缓存。 + */ + public void setCacheControl(CacheControl pluginStaticResourcesCacheControl){ + if(pluginStaticResourcesCacheControl == null){ + StaticResourceExtension.pluginStaticResourcesCacheControl = null; + } else { + StaticResourceExtension.pluginStaticResourcesCacheControl = pluginStaticResourcesCacheControl; + } + } + + public static String getPluginStaticResourcePathPrefix() { + return pluginStaticResourcePathPrefix; + } + + public static CacheControl getPluginStaticResourcesCacheControl() { + return pluginStaticResourcesCacheControl; + } + } 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 d508d50..eeeca15 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 @@ -1,43 +1,41 @@ package com.gitee.starblues.extension.resources.resolver; import com.gitee.starblues.extension.resources.StaticResourceConfig; -import com.gitee.starblues.integration.IntegrationConfiguration; -import com.gitee.starblues.integration.application.PluginApplication; -import com.gitee.starblues.integration.operator.PluginOperator; +import com.gitee.starblues.loader.PluginResource; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.PluginWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.core.io.FileUrlResource; import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.servlet.resource.AbstractResourceResolver; import org.springframework.web.servlet.resource.ResourceResolverChain; import javax.servlet.http.HttpServletRequest; -import java.io.IOException; +import java.io.File; import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; /** - * description + * 插件资源发现者 * * @author zhangzhuo * @version 1.0 */ public class PluginResourceResolver extends AbstractResourceResolver { - private final static Logger logger = LoggerFactory.getLogger(PluginResourceConfig.class); + private final static Logger logger = LoggerFactory.getLogger(PluginResourceResolver.class); + public static final String RESOLVED_RESOURCE_CACHE_KEY_PREFIX = "resolvedResource:"; - - private final static Map pluginResourceConfigMap = new ConcurrentHashMap<>(); + private final static Map PLUGIN_RESOURCE_MAP = new ConcurrentHashMap<>(); PluginResourceResolver() { } @@ -47,27 +45,34 @@ public class PluginResourceResolver extends AbstractResourceResolver { protected Resource resolveResourceInternal(HttpServletRequest request, String requestPath, List locations, ResourceResolverChain chain) { + int startOffset = (requestPath.startsWith("/") ? 1 : 0); int endOffset = requestPath.indexOf('/', 1); if (endOffset != -1) { String pluginId = requestPath.substring(startOffset, endOffset); String partialPath = requestPath.substring(endOffset + 1); - PluginResourceConfig pluginResourceConfig = pluginResourceConfigMap.get(pluginId); + PluginStaticResource pluginResource = PLUGIN_RESOURCE_MAP.get(pluginId); - if(pluginResourceConfig == null){ + if(pluginResource == null){ return null; } - Resource resource = resolveClassPath(pluginResourceConfig, partialPath); + String key = computeKey(request, requestPath); + Resource resource = pluginResource.getCacheResource(key); if(resource != null){ - pluginResourceConfig.add(resource); return resource; } - resource = resolveFilePath(pluginResourceConfig, partialPath); + resource = resolveClassPath(pluginResource, partialPath); if(resource != null){ - pluginResourceConfig.add(resource); + pluginResource.putCacheResource(key, resource); + return resource; + } + + resource = resolveFilePath(pluginResource, partialPath); + if(resource != null){ + pluginResource.putCacheResource(key, resource); return resource; } return null; @@ -76,25 +81,29 @@ public class PluginResourceResolver extends AbstractResourceResolver { return chain.resolveResource(request, requestPath, locations); } - private Resource resolveClassPath(PluginResourceConfig pluginResourceConfig, + /** + * 解决 ClassPath 的资源文件。也就是插件中定义的 classpath:/xx/xx/ 配置 + * @param pluginResource 插件资源配置Bean + * @param partialPath 部分路径 + * @return 资源。没有发现则返回null + */ + private Resource resolveClassPath(PluginStaticResource pluginResource, String partialPath){ - Set classPaths = pluginResourceConfig.getClassPaths(); + Set classPaths = pluginResource.getClassPaths(); if(classPaths == null || classPaths.isEmpty()){ return null; } - PluginWrapper pluginWrapper = pluginResourceConfig.getPluginWrapper(); - if(pluginWrapper == null){ + BasePlugin basePlugin = pluginResource.getBasePlugin(); + if(basePlugin == null){ return null; } - ResourcePatternResolver resourcePatternResolver = - new PathMatchingResourcePatternResolver(pluginWrapper.getPluginClassLoader()); for (String classPath : classPaths) { try { - Resource resource = resourcePatternResolver.getResource(classPath + partialPath); - if(resource != null && resource.exists()){ + Resource resource = new PluginResource(classPath + partialPath, basePlugin); + if(resource.exists()){ return resource; } } catch (Exception e){ @@ -105,21 +114,32 @@ public class PluginResourceResolver extends AbstractResourceResolver { return null; } - private Resource resolveFilePath(PluginResourceConfig pluginResourceConfig, String partialPath) { - Set filePaths = pluginResourceConfig.getFilePaths(); + /** + * 解决插件中配置的绝对文件路径的文件资源。也就是插件中定义的 file:D://xx/xx/ 配置 + * @param pluginResource 插件资源配置Bean + * @param partialPath 部分路径 + * @return 资源。没有发现则返回null + */ + private Resource resolveFilePath(PluginStaticResource pluginResource, String partialPath) { + Set filePaths = pluginResource.getFilePaths(); if(filePaths == null || filePaths.isEmpty()){ return null; } for (String filePath : filePaths) { Path path = Paths.get(filePath + partialPath); - if(Files.exists(path)){ - try { - FileUrlResource fileUrlResource = new FileUrlResource(path.toString()); + if(!Files.exists(path)){ + continue; + } + try { + FileUrlResource fileUrlResource = new FileUrlResource(path.toString()); + if(fileUrlResource.exists()){ return fileUrlResource; - } catch (MalformedURLException e) { - e.printStackTrace(); + } else { + return null; } + } catch (MalformedURLException e) { + e.printStackTrace(); } } @@ -137,24 +157,50 @@ public class PluginResourceResolver extends AbstractResourceResolver { return null; } + protected String computeKey(@Nullable HttpServletRequest request, String requestPath) { + StringBuilder key = new StringBuilder(RESOLVED_RESOURCE_CACHE_KEY_PREFIX); + key.append(requestPath); + if (request != null) { + String codingKey = getContentCodingKey(request); + if (StringUtils.hasText(codingKey)) { + key.append("+encoding=").append(codingKey); + } + } + return key.toString(); + } + + private String getContentCodingKey(HttpServletRequest request) { + String header = request.getHeader(HttpHeaders.ACCEPT_ENCODING); + if (!StringUtils.hasText(header)) { + return null; + } + return Arrays.stream(StringUtils.tokenizeToStringArray(header, ",")) + .map(token -> { + int index = token.indexOf(';'); + return (index >= 0 ? token.substring(0, index) : token).trim().toLowerCase(); + }) + .sorted() + .collect(Collectors.joining(",")); + } + + + /** + * 全局移除插件时调用。主要删除 + * @param pluginId 插件id + */ public static synchronized void remove(String pluginId){ - PluginResourceConfig pluginResourceConfig = pluginResourceConfigMap.get(pluginId); - if(pluginResourceConfig == null){ + PluginStaticResource pluginResource = PLUGIN_RESOURCE_MAP.get(pluginId); + if(pluginResource == null){ return; } - pluginResourceConfigMap.remove(pluginId); - List resources = pluginResourceConfig.getResources(); - if(resources != null && !resources.isEmpty()){ - for (Resource resource : resources) { - try { - resource.getInputStream().close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + PLUGIN_RESOURCE_MAP.remove(pluginId); } + + /** + * 新增插件时,解析该插件的 StaticResourceConfig 配置。并将其保存到 StaticResourceConfig bean 中。 + * @param basePlugin 插件信息 + */ public static synchronized void parse(BasePlugin basePlugin){ if(basePlugin == null){ return; @@ -187,46 +233,54 @@ public class PluginResourceResolver extends AbstractResourceResolver { String type = location.substring(0, first); String path = location.substring(first+1); - if("classpath".equalsIgnoreCase(type)){ - if(!path.startsWith("/")){ - path = "/" + path; + if(path.startsWith("/")){ + path = path.substring(1); } if(!path.endsWith("/")){ path = path + "/"; } classPaths.add(path); } else if("file".equalsIgnoreCase(type)){ + if(!path.endsWith(File.separator)){ + path = path + File.separator; + } filePaths.add(path); } else { logger.warn("The plugin '{}' type '{}' cannot be resolved", pluginId, type); } } - PluginResourceConfig pluginResourceConfig = new PluginResourceConfig(); - pluginResourceConfig.setClassPaths(classPaths); - pluginResourceConfig.setFilePaths(filePaths); - pluginResourceConfig.setPluginWrapper(basePlugin.getWrapper()); - pluginResourceConfigMap.put(pluginId, pluginResourceConfig); - } + PluginStaticResource pluginResource = new PluginStaticResource(); + pluginResource.setClassPaths(classPaths); + pluginResource.setFilePaths(filePaths); + pluginResource.setBasePlugin(basePlugin); - - private static class PluginResourceConfig { + if(PLUGIN_RESOURCE_MAP.containsKey(pluginId)){ + // 如果存在该插件id的插件资源信息, 则先移除它 + remove(pluginId); + } + PLUGIN_RESOURCE_MAP.put(pluginId, pluginResource); + } + /** + * 插件资源解析后的信息 + */ + private static class PluginStaticResource { - private PluginWrapper pluginWrapper; + private BasePlugin basePlugin; private Set classPaths; private Set filePaths; - private List resources = new ArrayList<>(); + private Map cacheResourceMaps = new ConcurrentHashMap<>(); - PluginWrapper getPluginWrapper() { - return pluginWrapper; + BasePlugin getBasePlugin() { + return basePlugin; } - void setPluginWrapper(PluginWrapper pluginWrapper) { - this.pluginWrapper = pluginWrapper; + void setBasePlugin(BasePlugin basePlugin) { + this.basePlugin = basePlugin; } Set getClassPaths() { @@ -245,15 +299,18 @@ public class PluginResourceResolver extends AbstractResourceResolver { this.filePaths = filePaths; } - void add(Resource resource){ - if(resource != null){ - resources.add(resource); - } + + Resource getCacheResource(String key){ + return cacheResourceMaps.get(key); } - List getResources() { - return resources; + void putCacheResource(String key, Resource resource){ + if(StringUtils.isEmpty(key) || resource == null){ + return; + } + cacheResourceMaps.put(key, resource); } + } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java index c4a4693..d781993 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java @@ -1,35 +1,36 @@ package com.gitee.starblues.extension.resources.resolver; +import com.gitee.starblues.extension.resources.StaticResourceExtension; import com.gitee.starblues.integration.IntegrationConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** - * description + * 注册插件的WebMvc的配置 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.1 */ public class ResourceWebMvcConfigurer implements WebMvcConfigurer { - private final static Logger logger = LoggerFactory.getLogger(ResourceWebMvcConfigurer.class); - - private final IntegrationConfiguration configuration; - - public ResourceWebMvcConfigurer(ApplicationContext applicationContext) { - this.configuration = applicationContext.getBean(IntegrationConfiguration.class); + public ResourceWebMvcConfigurer() { } - @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/" + configuration.pluginStaticResourcePathPrefix() + "/**") - .resourceChain(configuration.isCachePluginStaticResources()) + String pathPattern = "/" + StaticResourceExtension.getPluginStaticResourcePathPrefix() + "/**"; + ResourceHandlerRegistration resourceHandlerRegistration = registry.addResourceHandler(pathPattern); + CacheControl cacheControl = StaticResourceExtension.getPluginStaticResourcesCacheControl(); + if(cacheControl != null){ + resourceHandlerRegistration.setCacheControl(cacheControl); + } + resourceHandlerRegistration + .resourceChain(false) .addResolver(new PluginResourceResolver()); } diff --git a/springboot-plugin-framework/pom.xml b/springboot-plugin-framework/pom.xml index d2fc582..28455c7 100644 --- a/springboot-plugin-framework/pom.xml +++ b/springboot-plugin-framework/pom.xml @@ -65,9 +65,9 @@ 1.6 3.1.0 - 5.1.7.RELEASE 2.9.9 + 5.0.7.RELEASE 4.0.1 4.11 @@ -80,18 +80,6 @@ ${pf4j-version} - - org.springframework - spring-context - ${spring-version} - - - - org.springframework - spring-webmvc - ${spring-version} - - com.fasterxml.jackson.core jackson-databind @@ -104,6 +92,20 @@ ${jackson.version} + + org.springframework + spring-context + ${spring-version} + provided + + + + org.springframework + spring-webmvc + ${spring-version} + provided + + javax.servlet javax.servlet-api diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java index 28b4540..3516d65 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java @@ -61,7 +61,8 @@ public class PluginClassProcess implements PluginPipeProcessor { @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); - PluginResourceLoadFactory pluginResourceLoadFactory = basePlugin.getPluginResourceLoadFactory(); + PluginResourceLoadFactory pluginResourceLoadFactory = basePlugin.getBasePluginExtend() + .getPluginResourceLoadFactory(); ResourceWrapper resourceWrapper = pluginResourceLoadFactory.getPluginResources(PluginClassLoader.KEY); if(resourceWrapper == null){ return; 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 153bc90..802ae92 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 @@ -1,6 +1,9 @@ package com.gitee.starblues.integration; import org.pf4j.RuntimeMode; +import org.springframework.http.CacheControl; + +import java.util.concurrent.TimeUnit; /** @@ -57,20 +60,4 @@ public interface IntegrationConfiguration { boolean enablePluginIdRestControllerPathPrefix(); - /** - * 访问插件静态资源前缀。默认为: static-plugin。不允许出现 '/' '\' 符号 - * @return 插件静态资源访问前缀 - */ - default String pluginStaticResourcePathPrefix(){ - return "static-plugin"; - } - - /** - * 是否缓存插件访问的静态资源。默认不缓存 - * @return true缓存。false不缓存 - */ - default boolean isCachePluginStaticResources(){ - return false; - } - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResource.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResource.java new file mode 100644 index 0000000..6cb516b --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResource.java @@ -0,0 +1,183 @@ +package com.gitee.starblues.loader; + +import com.gitee.starblues.realize.BasePlugin; +import org.pf4j.PluginWrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.NestedIOException; +import org.springframework.core.io.Resource; +import org.springframework.util.ResourceUtils; +import org.springframework.util.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.channels.ReadableByteChannel; + +/** + * 插件资源实现类.主要是对Spring中的抽象的Resource实现. + * 功能: 主要是获取插件包中的文件资源。 + * @author zhangzhuo + * @version 2.2.1 + */ +public class PluginResource implements Resource { + + private final static Logger log = LoggerFactory.getLogger(PluginResource.class); + + private final ClassLoader classLoader; + private final PluginWrapper pluginWrapper; + + private final long lastModified; + private final String path; + + + /** + * 相对Classpath 路径 + * @param path 路径 + * @param basePlugin basePlugin bean + */ + public PluginResource(String path, BasePlugin basePlugin) { + String pathToUse = StringUtils.cleanPath(path); + if (pathToUse.startsWith("/")) { + pathToUse = pathToUse.substring(1); + } + this.path = pathToUse; + + PluginWrapper pluginWrapper = basePlugin.getWrapper(); + this.classLoader = pluginWrapper.getPluginClassLoader(); + this.pluginWrapper = pluginWrapper; + + this.lastModified = basePlugin.getBasePluginExtend().getStartTimestamp(); + } + + + @Override + public InputStream getInputStream() throws IOException { + return classLoader.getResourceAsStream(path); + } + + + @Override + public ReadableByteChannel readableChannel() throws IOException { + throw new RuntimeException("This method is not supported"); + } + + @Override + public long contentLength() throws IOException { + URL url = getURL(); + if (ResourceUtils.isFileURL(url)) { + return getFile().length(); + } + if(ResourceUtils.isJarURL(url)){ + URLConnection con = getURL().openConnection(); + return con.getContentLength(); + } + return 0L; + } + + @Override + public long lastModified() throws IOException { + return lastModified; + } + + + @Override + public Resource createRelative(String relativePath) { + throw new RuntimeException("This method is not supported"); + } + + @Override + public String getFilename() { + return StringUtils.getFilename(this.path); + } + + @Override + public String getDescription() { + return pluginWrapper.getDescriptor().getPluginDescription(); + } + + @Override + public boolean exists() { + try { + URL url = getURL(); + if(url == null){ + return false; + } + if (ResourceUtils.isFileURL(url)) { + return getFile().exists(); + } + if (contentLength() >= 0) { + return true; + } + InputStream is = getInputStream(); + is.close(); + return true; + } catch (Exception e){ + log.debug(e.getMessage(), e); + return false; + } + } + + @Override + public boolean isReadable() { + try { + URL url = getURL(); + if (ResourceUtils.isFileURL(url)) { + File file = getFile(); + return (file.canRead() && !file.isDirectory()); + } else { + return true; + } + } catch (Exception e) { + log.debug(e.getMessage(), e); + return false; + } + } + + @Override + public boolean isOpen() { + return false; + } + + @Override + public boolean isFile() { + try { + URL url = getURL(); + return ResourceUtils.URL_PROTOCOL_FILE.equals(url.getProtocol()); + } catch (IOException e) { + log.debug(e.getMessage(), e); + return false; + } + } + + @Override + public File getFile() throws IOException { + URL url = getURL(); + if (ResourceUtils.isJarURL(url)) { + URL actualUrl = ResourceUtils.extractArchiveURL(url); + return ResourceUtils.getFile(actualUrl, "Jar URL"); + } else { + return ResourceUtils.getFile(url, getDescription()); + } + } + + @Override + public URL getURL() throws IOException { + return classLoader.getResource(path); + } + + @Override + public URI getURI() throws IOException { + URL url = getURL(); + try { + return ResourceUtils.toURI(url); + } catch (URISyntaxException ex) { + throw new NestedIOException("Invalid URI [" + url + "]", ex); + } + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java index 40683ba..80990a6 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java @@ -1,6 +1,5 @@ package com.gitee.starblues.realize; -import com.gitee.starblues.loader.PluginResourceLoadFactory; import org.pf4j.Plugin; import org.pf4j.PluginWrapper; @@ -11,11 +10,11 @@ import org.pf4j.PluginWrapper; */ public abstract class BasePlugin extends Plugin { - private final PluginResourceLoadFactory pluginResourceLoadFactory; + private final BasePluginExtend basePluginExtend; public BasePlugin(PluginWrapper wrapper) { super(wrapper); - this.pluginResourceLoadFactory = new PluginResourceLoadFactory(); + this.basePluginExtend = new BasePluginExtend(this); } @@ -26,7 +25,7 @@ public abstract class BasePlugin extends Plugin { } catch (Exception e) { e.printStackTrace(); } finally { - pluginResourceLoadFactory.load(this); + basePluginExtend.startEvent(); } } @@ -38,7 +37,7 @@ public abstract class BasePlugin extends Plugin { } catch (Exception e){ e.printStackTrace(); } finally { - pluginResourceLoadFactory.unload(this); + basePluginExtend.deleteEvent(); } } @@ -50,7 +49,7 @@ public abstract class BasePlugin extends Plugin { } catch (Exception e){ e.printStackTrace(); } finally { - pluginResourceLoadFactory.unload(this); + basePluginExtend.startEvent(); } } @@ -63,16 +62,14 @@ public abstract class BasePlugin extends Plugin { return this.getClass().getPackage().getName(); } - /** - * 插件资源加载者。 - * @return PluginResourceLoadFactory + * 得到插件扩展的信息 + * @return BasePluginExtend */ - public final PluginResourceLoadFactory getPluginResourceLoadFactory() { - return pluginResourceLoadFactory; + public final BasePluginExtend getBasePluginExtend() { + return basePluginExtend; } - /** * 启动事件. Spring 容器都没有准备。无法使用注入。 */ diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePluginExtend.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePluginExtend.java new file mode 100644 index 0000000..0bc83b6 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePluginExtend.java @@ -0,0 +1,65 @@ +package com.gitee.starblues.realize; + +import com.gitee.starblues.loader.PluginResourceLoadFactory; + +/** + * 扩展的BasePlugin信息 + * + * @author zhangzhuo + * @version 1.0 + */ +public final class BasePluginExtend { + + private final BasePlugin basePlugin; + private final PluginResourceLoadFactory pluginResourceLoadFactory; + private Long startTimestamp; + private Long stopTimestamp; + + BasePluginExtend(BasePlugin basePlugin){ + this.basePlugin = basePlugin; + this.pluginResourceLoadFactory = new PluginResourceLoadFactory(); + } + + + public long getStartTimestamp() { + return startTimestamp; + } + + public Long getStopTimestamp() { + return stopTimestamp; + } + + public PluginResourceLoadFactory getPluginResourceLoadFactory() { + return pluginResourceLoadFactory; + } + + void startEvent(){ + try { + pluginResourceLoadFactory.load(basePlugin); + } catch (Exception e){ + e.printStackTrace(); + } finally { + startTimestamp = System.currentTimeMillis(); + } + } + + void deleteEvent(){ + try { + pluginResourceLoadFactory.unload(basePlugin); + }catch (Exception e){ + e.printStackTrace(); + } + } + + void stopEvent(){ + try { + pluginResourceLoadFactory.unload(basePlugin); + }catch (Exception e){ + e.printStackTrace(); + } finally { + stopTimestamp = System.currentTimeMillis(); + } + } + + +} -- Gitee From de6ff1c1887bd9aa97f1d4a226cf9c4c94280635 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Sat, 9 Nov 2019 13:27:42 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=88=B0v2.2.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic-example/basic-example-main/pom.xml | 4 +- .../main/config/ExamplePluginListener.java | 2 +- .../example/main/config/PluginBeanConfig.java | 11 ++- .../basic-example-runner/pom.xml | 2 +- .../basic-example-plugin1/plugin.properties | 2 +- .../plugins/basic-example-plugin1/pom.xml | 4 +- .../example/plugin1/PluginListener1.java | 43 +++++++++ .../example/plugin1/PluginListener2.java | 44 ++++++++++ .../basic-example-plugin2/plugin.properties | 2 +- .../plugins/basic-example-plugin2/pom.xml | 4 +- example/basic-example/plugins/pom.xml | 2 +- example/basic-example/pom.xml | 2 +- .../integration-mybatis-main/pom.xml | 11 +-- .../com/mybatis/main/rest/PluginResource.java | 2 +- .../src/test/java/A.java | 30 +++++++ .../integration-mybatis-plugin-parent/pom.xml | 2 +- .../integration-mybatis-runner/pom.xml | 2 +- .../plugin.properties | 2 +- .../integration-mybatis-plugin1/pom.xml | 4 +- .../com/mybatis/plugin1/ExamplePlugin1.java | 1 - .../com/mybatis/plugin1/Plugin1Listener.java | 43 +++++++++ .../plugin.properties | 2 +- .../integration-mybatis-plugin2/pom.xml | 4 +- .../com/mybatis/plugin2/ExamplePlugin2.java | 12 ++- .../com/mybatis/plugin2/Plugin2Listener.java | 42 +++++++++ .../src/main/resources/static/plugin2.html | 10 +++ example/integration-mybatis/pom.xml | 2 +- .../integration-mybatisplus-main/pom.xml | 6 +- .../plugin.properties | 2 +- .../integration-mybatisplus-plugin/pom.xml | 2 +- example/integration-mybatisplus/pom.xml | 2 +- example/pom.xml | 2 +- pom.xml | 2 +- springboot-plugin-framework-extension/pom.xml | 2 +- .../pom.xml | 4 +- .../extension/mybatis/PluginMapperGroup.java | 4 +- .../mybatis/PluginMybatisMapperProcessor.java | 2 +- .../mybatis/PluginMybatisXmlLoader.java | 5 +- .../mybatis/utils/MybatisInjectWrapper.java | 8 +- .../pom.xml | 4 +- .../resolver/PluginResourceResolver.java | 87 ++++++++++++------- .../resolver/ResourceWebMvcConfigurer.java | 2 - springboot-plugin-framework/pom.xml | 2 +- .../extension/ExtensionInitializer.java | 22 ++--- .../starblues/factory/SpringBeanRegister.java | 2 - .../pipe/PluginPipeProcessorFactory.java | 3 + .../process/pipe/bean/BasicBeanProcessor.java | 12 ++- .../pipe/bean/ConfigBeanProcessor.java | 5 +- .../OneselfListenerStopEventProcessor.java | 62 +++++++++++++ .../pipe/classs/PluginClassProcess.java | 4 +- .../pipe/classs/group/CallerGroup.java | 4 +- .../pipe/classs/group/ComponentGroup.java | 4 +- .../classs/group/ConfigDefinitionGroup.java | 4 +- .../pipe/classs/group/ConfigurationGroup.java | 4 +- .../pipe/classs/group/ControllerGroup.java | 4 +- .../classs/group/OneselfListenerGroup.java | 38 ++++++++ .../pipe/classs/group/RepositoryGroup.java | 4 +- .../pipe/classs/group/SupplierGroup.java | 4 +- .../post/PluginPostProcessorFactory.java | 11 ++- .../bean/PluginControllerPostProcessor.java | 2 +- .../post/bean/PluginInvokePostProcessor.java | 4 +- .../PluginOneselfStartEventProcessor.java | 77 ++++++++++++++++ .../gitee/starblues/realize/BasePlugin.java | 15 +++- .../starblues/realize/OneselfListener.java | 33 +++++++ .../gitee/starblues/utils/CommonUtils.java | 19 +++- 65 files changed, 624 insertions(+), 140 deletions(-) create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener1.java create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener2.java create mode 100644 example/integration-mybatis/integration-mybatis-main/src/test/java/A.java create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/Plugin2Listener.java create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/resources/static/plugin2.html create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerStopEventProcessor.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/OneselfListenerGroup.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/OneselfListener.java diff --git a/example/basic-example/basic-example-main/pom.xml b/example/basic-example/basic-example-main/pom.xml index 2a61c25..917f4e8 100644 --- a/example/basic-example/basic-example-main/pom.xml +++ b/example/basic-example/basic-example-main/pom.xml @@ -13,13 +13,13 @@ com.gitee.starblues basic-example-main - 2.2.0-RELEASE + 2.2.1-RELEASE jar 2.7.0 1.6 - 2.2.0-RELEASE + 2.2.1-RELEASE diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java index 9ee0a9a..4bcef65 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java @@ -5,6 +5,7 @@ import com.gitee.starblues.integration.listener.PluginListener; import com.gitee.starblues.integration.user.PluginUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; /** @@ -13,7 +14,6 @@ import org.slf4j.LoggerFactory; * @author zhangzhuo * @version 1.0 */ - public class ExamplePluginListener implements PluginListener { private final Logger logger = LoggerFactory.getLogger(this.getClass()); diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java index f3f238f..ab802c0 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginBeanConfig.java @@ -1,7 +1,9 @@ package com.basic.example.main.config; +import com.gitee.starblues.integration.application.DefaultPluginApplication; import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.application.AutoPluginApplication; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -20,8 +22,11 @@ public class PluginBeanConfig { * @return PluginApplication */ @Bean - public PluginApplication pluginApplication(){ - // 实例化自动初始化插件的PluginApplication - return new AutoPluginApplication(); + public PluginApplication pluginApplication(PluginListener pluginListener){ + AutoPluginApplication autoPluginApplication = new AutoPluginApplication(); + autoPluginApplication.setPluginInitializerListener(pluginListener); + autoPluginApplication.addListener(ExamplePluginListener.class); + return autoPluginApplication; } + } diff --git a/example/basic-example/basic-example-runner/pom.xml b/example/basic-example/basic-example-runner/pom.xml index 0ac04aa..7935a97 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.2.0-RELEASE + 2.2.1-RELEASE pom diff --git a/example/basic-example/plugins/basic-example-plugin1/plugin.properties b/example/basic-example/plugins/basic-example-plugin1/plugin.properties index 5090ae7..48af354 100644 --- a/example/basic-example/plugins/basic-example-plugin1/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin1/plugin.properties @@ -1,4 +1,4 @@ plugin.id=basic-example-plugin1 plugin.class=com.basic.example.plugin1.DefinePlugin -plugin.version=2.2.0-RELEASE +plugin.version=2.2.1-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/basic-example/plugins/basic-example-plugin1/pom.xml b/example/basic-example/plugins/basic-example-plugin1/pom.xml index b4c1ba2..01a085b 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.2.0-RELEASE + 2.2.1-RELEASE ../pom.xml basic-example-plugin1 - 2.2.0-RELEASE + 2.2.1-RELEASE jar diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener1.java new file mode 100644 index 0000000..1751c98 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener1.java @@ -0,0 +1,43 @@ +package com.basic.example.plugin1; + +import com.basic.example.plugin1.service.HelloService; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.utils.OrderPriority; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class PluginListener1 implements OneselfListener { + + private static final Logger logger = LoggerFactory.getLogger(PluginListener1.class); + + private final HelloService helloService; + + public PluginListener1(HelloService helloService) { + this.helloService = helloService; + } + + + @Override + public OrderPriority order() { + return OrderPriority.getMiddlePriority(); + } + + @Override + public void startEvent(BasePlugin basePlugin) { + logger.info("PluginListener1 {} start. helloService : {} .", basePlugin.getWrapper().getPluginId(), + helloService.sayService2()); + } + + @Override + public void stopEvent(BasePlugin basePlugin) { + logger.info("PluginListener1 {} stop. helloService : {} .", basePlugin.getWrapper().getPluginId(), + helloService.sayService2()); + } +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener2.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener2.java new file mode 100644 index 0000000..fea5a46 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/PluginListener2.java @@ -0,0 +1,44 @@ +package com.basic.example.plugin1; + +import com.basic.example.plugin1.config.PluginConfig1; +import com.basic.example.plugin1.service.HelloService; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.utils.OrderPriority; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class PluginListener2 implements OneselfListener { + + private static final Logger logger = LoggerFactory.getLogger(PluginListener2.class); + + private final PluginConfig1 pluginConfig1; + + public PluginListener2(PluginConfig1 pluginConfig1) { + this.pluginConfig1 = pluginConfig1; + } + + + @Override + public OrderPriority order() { + return OrderPriority.getMiddlePriority(); + } + + @Override + public void startEvent(BasePlugin basePlugin) { + logger.info("PluginListener2 {} start. pluginConfig1 : {} .", basePlugin.getWrapper().getPluginId(), + pluginConfig1.getName()); + } + + @Override + public void stopEvent(BasePlugin basePlugin) { + logger.info("PluginListener2 {} stop. pluginConfig1 : {} .", basePlugin.getWrapper().getPluginId(), + pluginConfig1.getName()); + } +} diff --git a/example/basic-example/plugins/basic-example-plugin2/plugin.properties b/example/basic-example/plugins/basic-example-plugin2/plugin.properties index 43de2a7..7f10c4b 100644 --- a/example/basic-example/plugins/basic-example-plugin2/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin2/plugin.properties @@ -1,4 +1,4 @@ plugin.id=basic-example-plugin2 plugin.class=com.basic.example.plugin2.DefinePlugin -plugin.version=2.2.0-RELEASE +plugin.version=2.2.1-RELEASE plugin.provider=StarBlues \ 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 becb8e7..4bc0a1a 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.2.0-RELEASE + 2.2.1-RELEASE ../pom.xml basic-example-plugin2 - 2.2.0-RELEASE + 2.2.1-RELEASE jar diff --git a/example/basic-example/plugins/pom.xml b/example/basic-example/plugins/pom.xml index 25320c5..87e6f5f 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.2.0-RELEASE + 2.2.1-RELEASE pom diff --git a/example/basic-example/pom.xml b/example/basic-example/pom.xml index 7dfaf47..a9322ad 100644 --- a/example/basic-example/pom.xml +++ b/example/basic-example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues basic-example - 2.2.0-RELEASE + 2.2.1-RELEASE pom 基本案例 diff --git a/example/integration-mybatis/integration-mybatis-main/pom.xml b/example/integration-mybatis/integration-mybatis-main/pom.xml index b8f8ee7..7522e6e 100644 --- a/example/integration-mybatis/integration-mybatis-main/pom.xml +++ b/example/integration-mybatis/integration-mybatis-main/pom.xml @@ -8,19 +8,20 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.7.RELEASE com.gitee.starblues integration-mybatis-main - 2.2.0-RELEASE + 2.2.1-RELEASE jar 主程序模块 - 2.2.0-RELEASE - 2.2.0-RELEASE + 2.2.1-RELEASE + 2.2.1-RELEASE + 2.2.1-RELEASE 2.0.1 2.7.0 1.6 @@ -44,7 +45,7 @@ com.gitee.starblues springboot-plugin-framework-extension-resources - ${extension-mybatis.version} + ${extension-resources.version} diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java index db90729..6b179c4 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java +++ b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java @@ -128,7 +128,7 @@ public class PluginResource { @PostMapping("/uninstall/{id}") public String uninstall(@PathVariable("id") String id){ try { - if(pluginOperator.uninstall(id, false)){ + if(pluginOperator.uninstall(id, true)){ return "plugin '" + id +"' uninstall success"; } else { return "plugin '" + id +"' uninstall failure"; diff --git a/example/integration-mybatis/integration-mybatis-main/src/test/java/A.java b/example/integration-mybatis/integration-mybatis-main/src/test/java/A.java new file mode 100644 index 0000000..d6fdfc0 --- /dev/null +++ b/example/integration-mybatis/integration-mybatis-main/src/test/java/A.java @@ -0,0 +1,30 @@ +import org.junit.Test; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class A { + + @Test + public void aa(){ + String path = "//instances/8b08af850fd9/details"; + int startOffset = (path.startsWith("/") ? 1 : 0); + int endOffset = path.indexOf('/', 1); + if (endOffset != -1) { + String webjar = path.substring(startOffset, endOffset); + String partialPath = path.substring(endOffset + 1); + System.out.println(webjar); + System.out.println(partialPath); + } + + System.out.println(path.startsWith("/")); + + } + + +} diff --git a/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml b/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml index a8bceb6..43e83ac 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.2.0-RELEASE + 2.2.1-RELEASE pom diff --git a/example/integration-mybatis/integration-mybatis-runner/pom.xml b/example/integration-mybatis/integration-mybatis-runner/pom.xml index 66423b6..5ce2529 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.2.0-RELEASE + 2.2.1-RELEASE jar 启动程序模块。将启动类配置到该模块下 diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties index c909a8d..e212961 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatis-plugin1 plugin.class=com.mybatis.plugin1.ExamplePlugin1 -plugin.version=2.2.0-RELEASE +plugin.version=2.2.1-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml index a4bf654..f4f6752 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.2.0-RELEASE + 2.2.1-RELEASE ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin1 - 2.2.0-RELEASE + 2.2.1-RELEASE jar diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java index b578dae..1d460f6 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java @@ -39,7 +39,6 @@ public class ExamplePlugin1 extends BasePlugin @Override protected void startEvent() { - } @Override diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java new file mode 100644 index 0000000..2adf5a2 --- /dev/null +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java @@ -0,0 +1,43 @@ +package com.mybatis.plugin1; + +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.utils.OrderPriority; +import com.mybatis.plugin1.mapper.Plugin1Mapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class Plugin1Listener implements OneselfListener { + + private final Logger logger = LoggerFactory.getLogger(Plugin1Listener.class); + + private final Plugin1Mapper plugin1Mapper; + + public Plugin1Listener(Plugin1Mapper plugin1Mapper) { + this.plugin1Mapper = plugin1Mapper; + } + + + @Override + public OrderPriority order() { + return OrderPriority.getMiddlePriority(); + } + + @Override + public void startEvent(BasePlugin basePlugin) { + logger.info("Plugin1Listener {} start Event", basePlugin.getWrapper().getPluginId()); + logger.info("plugin1Mapper getList : {}", plugin1Mapper.getList()); + } + + @Override + public void stopEvent(BasePlugin basePlugin) { + logger.info("Plugin1Listener {} stop Event", basePlugin.getWrapper().getPluginId()); + logger.info("plugin1Mapper getList : {}", plugin1Mapper.getList()); + } +} diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties index e1aa830..f6564bc 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.2.0-RELEASE +plugin.version=2.2.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 9389e18..b935610 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.2.0-RELEASE + 2.2.1-RELEASE ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin2 - 2.2.0-RELEASE + 2.2.1-RELEASE jar diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java index da63749..95da2f5 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java @@ -1,6 +1,7 @@ package com.mybatis.plugin2; import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; +import com.gitee.starblues.extension.resources.StaticResourceConfig; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.PluginWrapper; @@ -13,14 +14,16 @@ import java.util.Set; * @author zhangzhuo * @version 1.0 */ -public class ExamplePlugin2 extends BasePlugin implements SpringBootMybatisConfig { +public class ExamplePlugin2 extends BasePlugin + implements SpringBootMybatisConfig, StaticResourceConfig { private final Set mybatisMapperXmlLocationsMatch = new HashSet<>(); - + private final Set locations = new HashSet<>(); public ExamplePlugin2(PluginWrapper wrapper) { super(wrapper); mybatisMapperXmlLocationsMatch.add("classpath:mapper/*Mapper.xml"); + locations.add("classpath:/static"); } @Override @@ -42,4 +45,9 @@ public class ExamplePlugin2 extends BasePlugin implements SpringBootMybatisConfi public Set mybatisMapperXmlLocationsMatch() { return mybatisMapperXmlLocationsMatch; } + + @Override + public Set locations() { + return locations; + } } diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/Plugin2Listener.java b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/Plugin2Listener.java new file mode 100644 index 0000000..0576058 --- /dev/null +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/Plugin2Listener.java @@ -0,0 +1,42 @@ +package com.mybatis.plugin2; + +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.utils.OrderPriority; +import com.mybatis.main.mapper.RoleMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class Plugin2Listener implements OneselfListener { + + private final Logger logger = LoggerFactory.getLogger(Plugin2Listener.class); + + private final RoleMapper roleMapper; + + public Plugin2Listener(RoleMapper roleMapper) { + this.roleMapper = roleMapper; + } + + @Override + public OrderPriority order() { + return OrderPriority.getMiddlePriority(); + } + + @Override + public void startEvent(BasePlugin basePlugin) { + logger.info("Plugin2Listener {} start Event", basePlugin.getWrapper().getPluginId()); + logger.info("RoleMapper getList : {}", roleMapper.getList()); + } + + @Override + public void stopEvent(BasePlugin basePlugin) { + logger.info("Plugin2Listener {} stop Event", basePlugin.getWrapper().getPluginId()); + logger.info("RoleMapper getList : {}", roleMapper.getList()); + } +} diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/resources/static/plugin2.html b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/resources/static/plugin2.html new file mode 100644 index 0000000..18bd979 --- /dev/null +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/resources/static/plugin2.html @@ -0,0 +1,10 @@ + + + + + Title + + +这是插件2的界面 + + \ No newline at end of file diff --git a/example/integration-mybatis/pom.xml b/example/integration-mybatis/pom.xml index 3f80dab..28407e3 100644 --- a/example/integration-mybatis/pom.xml +++ b/example/integration-mybatis/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues integration-mybatis - 2.2.0-RELEASE + 2.2.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 a9f100e..62a75eb 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.2.0-RELEASE + 2.2.1-RELEASE integration-mybatisplus-main jar 集成mybatis-plus 案例--主程序 @@ -27,8 +27,8 @@ 2.0.1 3.2.0 - 2.2.0-RELEASE - 2.2.0-RELEASE + 2.2.1-RELEASE + 2.2.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 3c62bc0..8641d68 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.2.0-RELEASE +plugin.version=2.2.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 1eeb886..1aa6ef8 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.2.0-RELEASE + 2.2.1-RELEASE jar diff --git a/example/integration-mybatisplus/pom.xml b/example/integration-mybatisplus/pom.xml index cc45b57..a22d035 100644 --- a/example/integration-mybatisplus/pom.xml +++ b/example/integration-mybatisplus/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-mybatisplus - 2.2.0-RELEASE + 2.2.1-RELEASE pom 集成mybatis-plus案例 diff --git a/example/pom.xml b/example/pom.xml index d2fdd98..0df8b75 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues springboot-plugin-framework-example - 2.2.0-RELEASE + 2.2.1-RELEASE pom diff --git a/pom.xml b/pom.xml index a279886..8d0eb10 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues springboot-plugin-framework-parent pom - 2.2.0-RELEASE + 2.2.1-RELEASE spring boot 插件开发集成包 diff --git a/springboot-plugin-framework-extension/pom.xml b/springboot-plugin-framework-extension/pom.xml index bf68e00..20a47ff 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.2.0-RELEASE + 2.2.1-RELEASE spring boot 插件式开发集成包--扩展模块 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 064ddad..5e62543 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.2.0-RELEASE + 2.2.1-RELEASE jar 插件扩展-spring boot mybatis 集成扩展 @@ -64,7 +64,7 @@ 3.1.0 1.6 - 2.2.0-RELEASE + 2.2.1-RELEASE 2.0.1 3.2.0 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java index 371ba5d..9fe3c53 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMapperGroup.java @@ -13,11 +13,11 @@ import com.gitee.starblues.utils.AnnotationsUtils; */ public class PluginMapperGroup implements PluginClassGroupExtend { - public static final String KEY = "plugin_mybatis_mapper"; + public static final String GROUP_ID = "plugin_mybatis_mapper"; @Override public String groupId() { - return KEY; + return GROUP_ID; } @Override diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java index a49f488..527a055 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisMapperProcessor.java @@ -74,7 +74,7 @@ public class PluginMybatisMapperProcessor implements PluginPipeProcessorExtend { if(!mybatisExist()){ return; } - List> groupClasses = pluginRegistryInfo.getGroupClasses(PluginMapperGroup.KEY); + List> groupClasses = pluginRegistryInfo.getGroupClasses(PluginMapperGroup.GROUP_ID); if(groupClasses == null || groupClasses.isEmpty()){ return; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java index ba805ff..18177aa 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java @@ -4,7 +4,6 @@ import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConf import com.gitee.starblues.loader.PluginResourceLoader; import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; -import com.gitee.starblues.utils.OrderExecution; import com.gitee.starblues.utils.OrderPriority; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,8 +44,8 @@ public class PluginMybatisXmlLoader implements PluginResourceLoader { @Override public ResourceWrapper load(BasePlugin basePlugin) throws Exception { if(!(basePlugin instanceof SpringBootMybatisConfig)){ - LOG.warn("Plugin <{}> not implements SpringBootMybatisConfig, If you need to use mybatis in the plugin," + - "Please implements SpringBootMybatisConfig interface", basePlugin.getClass().getName()); + LOG.warn("Plugin '{}' not implements SpringBootMybatisConfig, If you need to use mybatis in the plugin," + + "Please implements SpringBootMybatisConfig interface", basePlugin.getWrapper().getPluginId()); return null; } SpringBootMybatisConfig springBootMybatisConfig = (SpringBootMybatisConfig) basePlugin; diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisInjectWrapper.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisInjectWrapper.java index cee723b..ee0fc2d 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisInjectWrapper.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisInjectWrapper.java @@ -1,10 +1,10 @@ package com.gitee.starblues.extension.mybatis.utils; import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.logging.Logger; -import org.mybatis.logging.LoggerFactory; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.mapper.MapperFactoryBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; @@ -84,7 +84,7 @@ public class MybatisInjectWrapper { public void processBeanDefinitions(BeanDefinitionHolder holder, Class a) { GenericBeanDefinition definition = (GenericBeanDefinition) holder.getBeanDefinition(); String beanClassName = definition.getBeanClassName(); - LOGGER.debug(() -> "Creating MapperFactoryBean with name '" + holder.getBeanName() + LOGGER.debug("Creating MapperFactoryBean with name '" + holder.getBeanName() + "' and '" + beanClassName + "' mapperInterface"); definition.getConstructorArgumentValues().addGenericArgumentValue(a); @@ -114,7 +114,7 @@ public class MybatisInjectWrapper { } if (!explicitFactoryUsed) { - LOGGER.debug(() -> "Enabling autowire by type for MapperFactoryBean with name '" + + LOGGER.debug("Enabling autowire by type for MapperFactoryBean with name '" + holder.getBeanName() + "'."); definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); } 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 3130e80..90a4f08 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.2.0-RELEASE + 2.2.1-RELEASE jar 插件扩展-通过url读取加载插件中的静态资源 @@ -69,7 +69,7 @@ 5.0.7.RELEASE 4.0.1 - 2.2.0-RELEASE + 2.2.1-RELEASE 2.1.1.RELEASE 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 eeeca15..8f17599 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 @@ -3,20 +3,17 @@ package com.gitee.starblues.extension.resources.resolver; import com.gitee.starblues.extension.resources.StaticResourceConfig; import com.gitee.starblues.loader.PluginResource; import com.gitee.starblues.realize.BasePlugin; -import org.pf4j.PluginWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.FileUrlResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; -import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.servlet.resource.AbstractResourceResolver; import org.springframework.web.servlet.resource.ResourceResolverChain; import javax.servlet.http.HttpServletRequest; import java.io.File; -import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -28,12 +25,13 @@ import java.util.stream.Collectors; * 插件资源发现者 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.1 */ public class PluginResourceResolver extends AbstractResourceResolver { private final static Logger logger = LoggerFactory.getLogger(PluginResourceResolver.class); - public static final String RESOLVED_RESOURCE_CACHE_KEY_PREFIX = "resolvedResource:"; + + private final static String RESOLVED_RESOURCE_CACHE_KEY_PREFIX = "resolvedPluginResource:"; private final static Map PLUGIN_RESOURCE_MAP = new ConcurrentHashMap<>(); @@ -59,17 +57,20 @@ public class PluginResourceResolver extends AbstractResourceResolver { } String key = computeKey(request, requestPath); + // 先判断缓存中是否存在。 Resource resource = pluginResource.getCacheResource(key); if(resource != null){ return resource; } + // 从classpath 获取资源 resource = resolveClassPath(pluginResource, partialPath); if(resource != null){ pluginResource.putCacheResource(key, resource); return resource; } + // 从外置文件路径获取资源 resource = resolveFilePath(pluginResource, partialPath); if(resource != null){ pluginResource.putCacheResource(key, resource); @@ -107,8 +108,7 @@ public class PluginResourceResolver extends AbstractResourceResolver { return resource; } } catch (Exception e){ - e.printStackTrace(); - logger.debug(e.getMessage(), e); + logger.debug("Get static resources of classpath '{}' error.", classPath, e); } } return null; @@ -127,29 +127,23 @@ public class PluginResourceResolver extends AbstractResourceResolver { } for (String filePath : filePaths) { - Path path = Paths.get(filePath + partialPath); - if(!Files.exists(path)){ + Path fullPath = Paths.get(filePath + partialPath); + if(!Files.exists(fullPath)){ continue; } try { - FileUrlResource fileUrlResource = new FileUrlResource(path.toString()); + FileUrlResource fileUrlResource = new FileUrlResource(fullPath.toString()); if(fileUrlResource.exists()){ return fileUrlResource; - } else { - return null; } - } catch (MalformedURLException e) { - e.printStackTrace(); + } catch (Exception e) { + logger.debug("Get static resources of path '{}' error.", fullPath, e); } } - return null; - } - - @Override protected String resolveUrlPathInternal(String resourceUrlPath, List locations, @@ -157,7 +151,13 @@ public class PluginResourceResolver extends AbstractResourceResolver { return null; } - protected String computeKey(@Nullable HttpServletRequest request, String requestPath) { + /** + * 计算key + * @param request request + * @param requestPath 请求路径 + * @return 返回key + */ + protected String computeKey(HttpServletRequest request, String requestPath) { StringBuilder key = new StringBuilder(RESOLVED_RESOURCE_CACHE_KEY_PREFIX); key.append(requestPath); if (request != null) { @@ -169,6 +169,11 @@ public class PluginResourceResolver extends AbstractResourceResolver { return key.toString(); } + /** + * 根据请求获取内容code key + * @param request request + * @return key + */ private String getContentCodingKey(HttpServletRequest request) { String header = request.getHeader(HttpHeaders.ACCEPT_ENCODING); if (!StringUtils.hasText(header)) { @@ -184,21 +189,9 @@ public class PluginResourceResolver extends AbstractResourceResolver { } - /** - * 全局移除插件时调用。主要删除 - * @param pluginId 插件id - */ - public static synchronized void remove(String pluginId){ - PluginStaticResource pluginResource = PLUGIN_RESOURCE_MAP.get(pluginId); - if(pluginResource == null){ - return; - } - PLUGIN_RESOURCE_MAP.remove(pluginId); - } - /** - * 新增插件时,解析该插件的 StaticResourceConfig 配置。并将其保存到 StaticResourceConfig bean 中。 + * 每新增一个插件, 都需要调用该方法,来解析该插件的 StaticResourceConfig 配置。并将其保存到 StaticResourceConfig bean 中。 * @param basePlugin 插件信息 */ public static synchronized void parse(BasePlugin basePlugin){ @@ -264,14 +257,44 @@ public class PluginResourceResolver extends AbstractResourceResolver { } + + /** + * 卸载插件时。调用该方法移除插件的资源信息 + * @param pluginId 插件id + */ + public static synchronized void remove(String pluginId){ + PluginStaticResource pluginResource = PLUGIN_RESOURCE_MAP.get(pluginId); + if(pluginResource == null){ + return; + } + PLUGIN_RESOURCE_MAP.remove(pluginId); + } + + + /** * 插件资源解析后的信息 */ private static class PluginStaticResource { + /** + * basePlugin bean + */ private BasePlugin basePlugin; + + /** + * 定义的classpath集合 + */ private Set classPaths; + + /** + * 定义的文件路径集合 + */ private Set filePaths; + + /** + * 缓存的资源。key 为资源的可以。值为资源 + */ private Map cacheResourceMaps = new ConcurrentHashMap<>(); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java index d781993..8c1f91e 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/ResourceWebMvcConfigurer.java @@ -1,8 +1,6 @@ package com.gitee.starblues.extension.resources.resolver; import com.gitee.starblues.extension.resources.StaticResourceExtension; -import com.gitee.starblues.integration.IntegrationConfiguration; -import org.springframework.context.ApplicationContext; import org.springframework.http.CacheControl; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; diff --git a/springboot-plugin-framework/pom.xml b/springboot-plugin-framework/pom.xml index 28455c7..2b9024f 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.2.0-RELEASE + 2.2.1-RELEASE spring boot 插件式开发集成包 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java index 1325697..f825826 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionInitializer.java @@ -23,7 +23,7 @@ import java.util.stream.Stream; * 静态的扩展初始化器 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.1 */ public class ExtensionInitializer { @@ -75,14 +75,14 @@ public class ExtensionInitializer { debug.append(pluginResourceLoader.key()).append("、"); }, bean -> bean.order()); - iteration(abstractExtension.getPluginPipeProcessor(applicationContext), pluginResourceLoader->{ - PIPE_PROCESSOR_EXTENDS.add(pluginResourceLoader); - debug.append(pluginResourceLoader.key()).append("、"); + iteration(abstractExtension.getPluginPipeProcessor(applicationContext), pluginPipeProcessorExtend->{ + PIPE_PROCESSOR_EXTENDS.add(pluginPipeProcessorExtend); + debug.append(pluginPipeProcessorExtend.key()).append("、"); }, bean -> bean.order()); - iteration(abstractExtension.getPluginClassGroup(applicationContext), pluginResourceLoader->{ - CLASS_GROUP_EXTENDS.add(pluginResourceLoader); - debug.append(pluginResourceLoader.key()).append("、"); + iteration(abstractExtension.getPluginClassGroup(applicationContext), pluginClassGroupExtend->{ + CLASS_GROUP_EXTENDS.add(pluginClassGroupExtend); + debug.append(pluginClassGroupExtend.key()).append("、"); }, null); iteration(abstractExtension.getPluginPostProcessor(applicationContext), pluginResourceLoader->{ @@ -125,13 +125,7 @@ public class ExtensionInitializer { if(order != null){ list.stream() .filter(t -> t != null) - .sorted(Comparator.comparing(t -> { - OrderPriority orderPriority = order.apply(t); - if(orderPriority == null){ - orderPriority = OrderPriority.getLowPriority(); - } - return orderPriority.getPriority(); - }, Comparator.nullsLast(Comparator.reverseOrder()))) + .sorted(CommonUtils.orderPriority(order)) .forEach(consumer); ; } else { 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 e1307dc..0a3c2ba 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 @@ -138,6 +138,4 @@ public class SpringBeanRegister { } - - } 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 6255401..e529808 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 @@ -4,6 +4,7 @@ import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.BasicBeanProcessor; import com.gitee.starblues.factory.process.pipe.bean.ConfigBeanProcessor; +import com.gitee.starblues.factory.process.pipe.bean.OneselfListenerStopEventProcessor; import com.gitee.starblues.factory.process.pipe.classs.PluginClassProcess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +34,8 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { @Override public void initialize() throws Exception{ + // OneselfListenerStopEventProcessor 触发停止事件, 必须第一个执行 + pluginPipeProcessors.add(new OneselfListenerStopEventProcessor(applicationContext)); pluginPipeProcessors.add(new PluginClassProcess()); pluginPipeProcessors.add(new BasicBeanProcessor(applicationContext)); pluginPipeProcessors.add(new ConfigBeanProcessor(applicationContext)); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java index 3749486..381869e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java @@ -5,6 +5,7 @@ import com.gitee.starblues.factory.SpringBeanRegister; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessor; import com.gitee.starblues.factory.process.pipe.classs.group.ComponentGroup; import com.gitee.starblues.factory.process.pipe.classs.group.ConfigurationGroup; +import com.gitee.starblues.factory.process.pipe.classs.group.OneselfListenerGroup; import com.gitee.starblues.factory.process.pipe.classs.group.RepositoryGroup; import com.gitee.starblues.utils.GlobalRegistryInfo; import com.gitee.starblues.utils.PluginOperatorInfo; @@ -52,14 +53,17 @@ public class BasicBeanProcessor implements PluginPipeProcessor { public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { Set beanNames = new HashSet<>(); List> springComponents = pluginRegistryInfo - .getGroupClasses(ComponentGroup.SPRING_COMPONENT); + .getGroupClasses(ComponentGroup.GROUP_ID); List> springConfigurations = pluginRegistryInfo - .getGroupClasses(ConfigurationGroup.SPRING_CONFIGURATION); + .getGroupClasses(ConfigurationGroup.GROUP_ID); List> springRepository = pluginRegistryInfo - .getGroupClasses(RepositoryGroup.SPRING_REPOSITORY); + .getGroupClasses(RepositoryGroup.GROUP_ID); + List> oneselfListener = pluginRegistryInfo.getGroupClasses(OneselfListenerGroup.GROUP_ID); + register(pluginRegistryInfo, springComponents, beanNames); register(pluginRegistryInfo, springConfigurations, beanNames); register(pluginRegistryInfo, springRepository, beanNames); + register(pluginRegistryInfo, oneselfListener, beanNames); pluginRegistryInfo.addProcessorInfo(KEY, beanNames); } @@ -83,7 +87,7 @@ public class BasicBeanProcessor implements PluginPipeProcessor { private void register(PluginRegistryInfo pluginRegistryInfo, List> classes, Set beanNames){ - if(classes == null){ + if(classes == null || classes.isEmpty()){ return; } String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java index b11885c..e141c93 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java @@ -48,7 +48,7 @@ public class ConfigBeanProcessor implements PluginPipeProcessor { @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { List> configDefinitions = - pluginRegistryInfo.getGroupClasses(ConfigDefinitionGroup.CONFIG_DEFINITION); + pluginRegistryInfo.getGroupClasses(ConfigDefinitionGroup.GROUP_ID); if(configDefinitions == null || configDefinitions.isEmpty()){ return; } @@ -97,7 +97,8 @@ public class ConfigBeanProcessor implements PluginPipeProcessor { } PluginConfigDefinition pluginConfigDefinition = new PluginConfigDefinition(fileName, aClass); - Object parseObject = configurationParser.parse(pluginRegistryInfo.getBasePlugin(), pluginConfigDefinition); + Object parseObject = configurationParser.parse(pluginRegistryInfo.getBasePlugin(), + pluginConfigDefinition); String name = configDefinition.name(); if(StringUtils.isEmpty(name)){ name = aClass.getName(); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerStopEventProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerStopEventProcessor.java new file mode 100644 index 0000000..2d443d5 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerStopEventProcessor.java @@ -0,0 +1,62 @@ +package com.gitee.starblues.factory.process.pipe.bean; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.pipe.PluginPipeProcessor; +import com.gitee.starblues.factory.process.post.bean.PluginOneselfStartEventProcessor; +import com.gitee.starblues.integration.application.PluginApplication; +import com.gitee.starblues.integration.user.PluginUser; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.utils.CommonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; + +import java.util.List; +import java.util.Objects; + +/** + * 执行插件自监听器的停止事件的处理者。必须在所有处理者中第一个执行。否则会导致所依赖的bean被卸载。 + * + * @see PluginOneselfStartEventProcessor 触发启动事件 + * @author zhangzhuo + * @version 2.2.1 + */ +public class OneselfListenerStopEventProcessor implements PluginPipeProcessor { + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + private final PluginUser pluginUser; + + public OneselfListenerStopEventProcessor(ApplicationContext applicationContext){ + Objects.requireNonNull(applicationContext); + PluginApplication pluginApplication = applicationContext.getBean(PluginApplication.class); + this.pluginUser = pluginApplication.getPluginUser(); + } + + + @Override + public void initialize() throws Exception { + + } + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception {} + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); + String pluginId = basePlugin.getWrapper().getPluginId(); + List oneselfListeners = pluginUser.getPluginBeans(pluginId, OneselfListener.class); + oneselfListeners.stream() + .sorted(CommonUtils.orderPriority(oneselfListener -> oneselfListener.order())) + .forEach(oneselfListener -> { + try { + oneselfListener.stopEvent(basePlugin); + } catch (Exception e){ + log.error("OneselfListener {} execute stopEvent exception. {}", + oneselfListener.getClass().getName(), e.getMessage(), e); + } + }); + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java index 3516d65..da4a4fd 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/PluginClassProcess.java @@ -51,11 +51,9 @@ public class PluginClassProcess implements PluginPipeProcessor { pluginClassGroups.add(new ConfigDefinitionGroup()); pluginClassGroups.add(new SupplierGroup()); pluginClassGroups.add(new CallerGroup()); + pluginClassGroups.add(new OneselfListenerGroup()); // 添加扩展 pluginClassGroups.addAll(ExtensionInitializer.getClassGroupExtends()); - - - } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java index 8326944..7903154 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/CallerGroup.java @@ -18,12 +18,12 @@ public class CallerGroup implements PluginClassGroup { /** * 自定义 @Caller */ - public static final String CALLER = "caller"; + public static final String GROUP_ID = "caller"; @Override public String groupId() { - return CALLER; + return GROUP_ID; } @Override 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 66a18af..1f61a7c 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 @@ -18,11 +18,11 @@ public class ComponentGroup implements PluginClassGroup { * spring 组件bean. * 包括Component、Service */ - public static final String SPRING_COMPONENT= "spring_component"; + public static final String GROUP_ID= "spring_component"; @Override public String groupId() { - return SPRING_COMPONENT; + return GROUP_ID; } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java index 766c587..fc756d2 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigDefinitionGroup.java @@ -16,12 +16,12 @@ public class ConfigDefinitionGroup implements PluginClassGroup { /** * 自定义插件配置文件bean @ConfigDefinition */ - public static final String CONFIG_DEFINITION= "config_definition"; + public static final String GROUP_ID= "config_definition"; @Override public String groupId() { - return CONFIG_DEFINITION; + return GROUP_ID; } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java index 6fe1592..4ad9874 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java @@ -16,12 +16,12 @@ public class ConfigurationGroup implements PluginClassGroup { /** * spring @CONFIGURATION 注解bean */ - public static final String SPRING_CONFIGURATION = "spring_configuration"; + public static final String GROUP_ID = "spring_configuration"; @Override public String groupId() { - return SPRING_CONFIGURATION; + return GROUP_ID; } @Override 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 e1f1b2b..f930518 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,12 +18,12 @@ public class ControllerGroup implements PluginClassGroup { /** * spring @Controller @RestController 注解bean */ - public static final String SPRING_CONTROLLER= "spring_controller"; + public static final String GROUP_ID= "spring_controller"; @Override public String groupId() { - return SPRING_CONTROLLER; + return GROUP_ID; } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/OneselfListenerGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/OneselfListenerGroup.java new file mode 100644 index 0000000..cec6502 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/OneselfListenerGroup.java @@ -0,0 +1,38 @@ +package com.gitee.starblues.factory.process.pipe.classs.group; + +import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroup; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import org.springframework.util.ClassUtils; + +import java.util.Set; + +/** + * 插件自己的监听器分组 + * + * @author zhangzhuo + * @version 2.2.1 + */ +public class OneselfListenerGroup implements PluginClassGroup { + + public static final String GROUP_ID = "oneself_listener"; + + @Override + public String groupId() { + return GROUP_ID; + } + + @Override + public void initialize(BasePlugin basePlugin) { + + } + + @Override + public boolean filter(Class aClass) { + if(aClass == null){ + return false; + } + Set> allInterfacesForClassAsSet = ClassUtils.getAllInterfacesForClassAsSet(aClass); + return allInterfacesForClassAsSet.contains(OneselfListener.class); + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java index 23bfefb..523dfda 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/RepositoryGroup.java @@ -16,12 +16,12 @@ public class RepositoryGroup implements PluginClassGroup { /** * spring @Repository 注解bean */ - public static final String SPRING_REPOSITORY= "spring_repository"; + public static final String GROUP_ID = "spring_repository"; @Override public String groupId() { - return SPRING_REPOSITORY; + return GROUP_ID; } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java index 9ee9257..f42d8a0 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/SupplierGroup.java @@ -17,12 +17,12 @@ public class SupplierGroup implements PluginClassGroup { /** * 自定义 @Supplier */ - public static final String SUPPLIER = "supplier"; + public static final String GROUP_ID = "supplier"; @Override public String groupId() { - return SUPPLIER; + return GROUP_ID; } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java index 2ae3982..d1fba96 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/PluginPostProcessorFactory.java @@ -5,6 +5,7 @@ import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.post.bean.PluginConfigurationPostProcessor; import com.gitee.starblues.factory.process.post.bean.PluginControllerPostProcessor; import com.gitee.starblues.factory.process.post.bean.PluginInvokePostProcessor; +import com.gitee.starblues.factory.process.post.bean.PluginOneselfStartEventProcessor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; @@ -31,11 +32,17 @@ public class PluginPostProcessorFactory implements PluginPostProcessor { @Override public void initialize() throws Exception{ + + // 添加扩展 + pluginPostProcessors.addAll(ExtensionInitializer.getPostProcessorExtends()); + + // 以下顺序不能更改。 pluginPostProcessors.add(new PluginConfigurationPostProcessor(applicationContext)); pluginPostProcessors.add(new PluginInvokePostProcessor(applicationContext)); + pluginPostProcessors.add(new PluginControllerPostProcessor(applicationContext)); - // 添加扩展 - pluginPostProcessors.addAll(ExtensionInitializer.getPostProcessorExtends()); + // 主要触发启动监听事件,因此在最后一个执行。配合 OneselfListenerStopEventProcessor 该类触发启动、停止事件。 + pluginPostProcessors.add(new PluginOneselfStartEventProcessor(applicationContext)); // 进行初始化 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 14f73e4..6b5caf7 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 @@ -60,7 +60,7 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); try { - List> groupClasses = pluginRegistryInfo.getGroupClasses(ControllerGroup.SPRING_CONTROLLER); + List> groupClasses = pluginRegistryInfo.getGroupClasses(ControllerGroup.GROUP_ID); if(groupClasses == null || groupClasses.isEmpty()){ continue; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java index ca7542c..2afd559 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginInvokePostProcessor.java @@ -59,7 +59,7 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); try { - List> suppers = pluginRegistryInfo.getGroupClasses(SupplierGroup.SUPPLIER); + List> suppers = pluginRegistryInfo.getGroupClasses(SupplierGroup.GROUP_ID); if(suppers == null){ continue; } @@ -71,7 +71,7 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); try { - List> callers = pluginRegistryInfo.getGroupClasses(CallerGroup.CALLER); + List> callers = pluginRegistryInfo.getGroupClasses(CallerGroup.GROUP_ID); if(callers == null){ continue; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java new file mode 100644 index 0000000..341cbed --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginOneselfStartEventProcessor.java @@ -0,0 +1,77 @@ +package com.gitee.starblues.factory.process.post.bean; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.pipe.bean.OneselfListenerStopEventProcessor; +import com.gitee.starblues.factory.process.post.PluginPostProcessor; +import com.gitee.starblues.integration.application.PluginApplication; +import com.gitee.starblues.integration.user.PluginUser; +import com.gitee.starblues.realize.BasePlugin; +import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.utils.AopUtils; +import com.gitee.starblues.utils.CommonUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; + +import java.util.List; +import java.util.Objects; + +/** + * 插件中 OneselfListener 监听者处理者。主要执行监听器的启动事件。 + * @see OneselfListenerStopEventProcessor 触发停止事件 + * @author zhangzhuo + * @version 2.1.0 + */ +public class PluginOneselfStartEventProcessor implements PluginPostProcessor { + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + private final PluginUser pluginUser; + + public PluginOneselfStartEventProcessor(ApplicationContext applicationContext){ + Objects.requireNonNull(applicationContext); + PluginApplication pluginApplication = applicationContext.getBean(PluginApplication.class); + this.pluginUser = pluginApplication.getPluginUser(); + } + + + @Override + public void initialize() throws Exception { + + } + + @Override + public void registry(List pluginRegistryInfos) throws Exception { + for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { + AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); + try { + BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); + String pluginId = basePlugin.getWrapper().getPluginId(); + + List oneselfListeners = pluginUser.getPluginBeans(pluginId, OneselfListener.class); + oneselfListeners.stream() + .sorted(CommonUtils.orderPriority(oneselfListener -> oneselfListener.order())) + .forEach(oneselfListener -> { + try { + oneselfListener.startEvent(basePlugin); + } catch (Exception e){ + log.error("OneselfListener {} execute startEvent exception. {}", + oneselfListener.getClass().getName(), e.getMessage(), e); + } + }); + } finally { + AopUtils.recoverAop(); + } + } + } + + + + @Override + public void unRegistry(List pluginRegistryInfos) { + // 此处不卸载调用。 + } + + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java index 80990a6..332c884 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/BasePlugin.java @@ -4,7 +4,8 @@ import org.pf4j.Plugin; import org.pf4j.PluginWrapper; /** - * 插件包要继承的抽象类 + * 插件包要继承的抽象类。 + * 注意: 实现该类的子类无法使用依赖注入 * @author zhangzhuo * @version 2.2.0 */ @@ -73,16 +74,22 @@ public abstract class BasePlugin extends Plugin { /** * 启动事件. Spring 容器都没有准备。无法使用注入。 */ - protected abstract void startEvent(); + protected void startEvent(){ + + } /** * 删除事件. 在插件删除时触发。 */ - protected abstract void deleteEvent(); + protected void deleteEvent(){ + + } /** * 停止事件. 在插件停止时触发。 */ - protected abstract void stopEvent(); + protected void stopEvent(){ + + } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/OneselfListener.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/OneselfListener.java new file mode 100644 index 0000000..e3ad226 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/OneselfListener.java @@ -0,0 +1,33 @@ +package com.gitee.starblues.realize; + +import com.gitee.starblues.utils.OrderPriority; + +/** + * 监听本插件模块事件的监听者接口 + * + * @author zhangzhuo + * @version 2.2.1 + */ +public interface OneselfListener { + + /** + * 执行优先级。用于多个监听器的时候 + * @return OrderPriority + */ + OrderPriority order(); + + + /** + * 启动事件 + * @param basePlugin 当前插件实现的BasePlugin类 + */ + void startEvent(BasePlugin basePlugin); + + + /** + * 停止事件 + * @param basePlugin 当前插件实现的BasePlugin类 + */ + void stopEvent(BasePlugin basePlugin); + +} 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 bc63629..270adf9 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 @@ -9,7 +9,7 @@ import java.util.function.Function; * 通用工具 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.1 */ public class CommonUtils { @@ -31,4 +31,21 @@ public class CommonUtils { } + /** + * 对 OrderPriority 进行排序操作 + * @param order OrderPriority + * @param 当前操作要被排序的bean + * @return Comparator + */ + public static Comparator orderPriority(final Function order){ + return Comparator.comparing(t -> { + OrderPriority orderPriority = order.apply(t); + if(orderPriority == null){ + orderPriority = OrderPriority.getLowPriority(); + } + return orderPriority.getPriority(); + }, Comparator.nullsLast(Comparator.reverseOrder())); + } + + } -- Gitee From 40179d0fb2fcc643657ab33d77d1d14709b075a1 Mon Sep 17 00:00:00 2001 From: StarBlues Date: Sat, 9 Nov 2019 13:42:17 +0800 Subject: [PATCH 7/8] =?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 --- .../mybatis/configuration/SpringBootMybatisConfig.java | 4 +++- .../starblues/extension/mybatis/utils/MybatisXmlProcess.java | 2 +- .../springboot-plugin-framework-extension-resources/pom.xml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java index c8dcc44..6cd19f9 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java @@ -28,7 +28,9 @@ public interface SpringBootMybatisConfig { /** * 别名自定义映射。 * 如果同时配置了typeAliasesPackage, 则此处配置会覆盖typeAliasesPackage、或者注解@Alias('') 的配置。 - * 别名生效优先级别: aliasMapping > @Alias('') > typeAliasesPackage。如果同时配置了三个地方, 并且key一样, 则最终优先级别高的生效。 + * 优先级别: + * 别名生效优先级别(由大到小): aliasMapping、@Alias('')、typeAliasesPackage + * 如果同时配置了三个地方, 并且key一样, 则最终优先级别高的生效。 * @return 映射Map */ default Map aliasMapping(){ diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java index 6664a33..a0e72a2 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java @@ -35,7 +35,7 @@ public class MybatisXmlProcess { /** * 得到单例 * @param sqlSessionFactory sqlSessionFactory - * @return + * @return MybatisXmlProcess */ public static MybatisXmlProcess getInstance(SqlSessionFactory sqlSessionFactory){ Objects.requireNonNull(sqlSessionFactory); 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 90a4f08..1fda0a1 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 @@ -16,7 +16,7 @@ 2.2.1-RELEASE jar - 插件扩展-通过url读取加载插件中的静态资源 + 插件扩展-通过url读取插件中的静态资源 -- Gitee From 5fa5c1c95f876b0edecdf8f76bbc97cc41b7336a Mon Sep 17 00:00:00 2001 From: StarBlues Date: Sat, 9 Nov 2019 14:30:34 +0800 Subject: [PATCH 8/8] =?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 --- .../java/com/mybatis/plugin1/ExamplePlugin1.java | 13 ------------- .../java/com/mybatis/plugin1/Plugin1Listener.java | 3 +++ .../configuration/SpringBootMybatisConfig.java | 4 ++-- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java index 1d460f6..fa192d4 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ExamplePlugin1.java @@ -37,19 +37,6 @@ public class ExamplePlugin1 extends BasePlugin locations.add("file:D:\\aa"); } - @Override - protected void startEvent() { - } - - @Override - protected void deleteEvent() { - - } - - @Override - protected void stopEvent() { - - } @Override public Set mybatisMapperXmlLocationsMatch() { diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java index 2adf5a2..3be873c 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/Plugin1Listener.java @@ -26,17 +26,20 @@ public class Plugin1Listener implements OneselfListener { @Override public OrderPriority order() { + // 定义监听器执行顺序。用于多个监听器 return OrderPriority.getMiddlePriority(); } @Override public void startEvent(BasePlugin basePlugin) { + // 启动事件 logger.info("Plugin1Listener {} start Event", basePlugin.getWrapper().getPluginId()); logger.info("plugin1Mapper getList : {}", plugin1Mapper.getList()); } @Override public void stopEvent(BasePlugin basePlugin) { + // 停止事件 logger.info("Plugin1Listener {} stop Event", basePlugin.getWrapper().getPluginId()); logger.info("plugin1Mapper getList : {}", plugin1Mapper.getList()); } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java index 6cd19f9..b9ff2d3 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/configuration/SpringBootMybatisConfig.java @@ -38,8 +38,8 @@ public interface SpringBootMybatisConfig { } /** - * 别名类型包集合。别名规则为包名首字母小写。只支持当前包下的类, 不支持包递归。 - * 如果从该包下的类使用了别名注解@Alias. 则优先使用@Alias中定义的别名。 + * 要统一定义别名的包集合。别名规则为: 首字母小写的包名, 只支持当前包下的类, 不支持包递归。 + * 如果该包下的类使用了别名注解@Alias, 则优先使用@Alias中定义的别名。 * @return 包集合 */ default Set typeAliasesPackage(){ -- Gitee