From bf884aaf4e60bec38091a20c58cc277657d6a625 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 22 Jan 2021 17:02:11 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BA=95=E5=B1=82?= =?UTF-8?q?=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic-example/basic-example-main/pom.xml | 2 +- .../plugin1/service/ConsoleNameImpl.java | 1 - .../example/plugin1/service/HelloService.java | 1 - .../example/plugin2/rest/ProxyController.java | 2 - .../example/plugin2/service/HelloService.java | 2 +- .../integration-mybatis-plugin1/pom.xml | 20 --- .../plugin1/rest/Plugin1Controller.java | 2 - .../integration-mybatisplus-main/pom.xml | 2 +- .../src/main/resources/application-dev.yml | 4 +- ...lusConfig.java => MybatisPlusConfig2.java} | 20 +-- .../extension/mybatis/MapperHandler.java | 11 +- .../mybatis/SpringBootMybatisExtension.java | 10 +- .../mybatisplus/MybatisPlusProcessor.java | 64 ++++--- .../extension/AbstractExtension.java | 13 ++ .../extension/ExtensionConfigUtils.java | 5 +- .../extension/ExtensionInitializer.java | 41 +++-- .../factory/PluginInfoContainer.java | 84 ---------- .../starblues/factory/PluginRegistryInfo.java | 64 +++++-- .../starblues/factory/SpringBeanRegister.java | 54 ++++-- .../PluginApplicationContextProcessor.java | 70 ++++++++ .../process/pipe/PluginInfoContainers.java | 43 +++++ .../pipe/PluginPipeProcessorFactory.java | 18 +- ...Processor.java => BasicBeanRegistrar.java} | 72 +------- ...rocessor.java => ConfigBeanRegistrar.java} | 44 +---- ...ssor.java => ConfigFileBeanRegistrar.java} | 58 +++---- .../bean/OneselfListenerBeanRegistrar.java | 33 ++++ .../OneselfListenerStopEventProcessor.java | 62 ------- .../process/pipe/bean/PluginBeanRegister.java | 37 ----- .../pipe/bean/PluginBeanRegistrar.java | 25 +++ .../pipe/bean/PluginBeanRegistrarExtend.java | 15 ++ .../pipe/classs/group/ComponentGroup.java | 5 +- .../loader/load/PluginConfigFileLoader.java | 2 +- .../post/PluginPostProcessorFactory.java | 5 +- .../PluginConfigurationPostProcessor.java | 10 +- .../bean/PluginControllerPostProcessor.java | 84 ++++------ .../post/bean/PluginInvokePostProcessor.java | 34 ++-- .../PluginOneselfStartEventProcessor.java | 11 +- .../integration/user/DefaultPluginUser.java | 157 ++++++++++-------- .../integration/user/PluginUser.java | 2 + .../gitee/starblues/realize/PluginUtils.java | 85 ++++++++++ .../starblues/utils/PluginBeanUtils.java | 43 +++++ 41 files changed, 691 insertions(+), 626 deletions(-) rename example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/{MybatisPlusConfig.java => MybatisPlusConfig2.java} (41%) delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java rename springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/{BasicBeanProcessor.java => BasicBeanRegistrar.java} (46%) rename springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/{ConfigBeanProcessor.java => ConfigBeanRegistrar.java} (41%) rename springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/{ConfigFileBeanProcessor.java => ConfigFileBeanRegistrar.java} (66%) create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerStopEventProcessor.java delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegister.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrarExtend.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginBeanUtils.java diff --git a/example/basic-example/basic-example-main/pom.xml b/example/basic-example/basic-example-main/pom.xml index d9ae937..119c86e 100644 --- a/example/basic-example/basic-example-main/pom.xml +++ b/example/basic-example/basic-example-main/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.4.2 diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java index 3c86405..94e808a 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java @@ -11,7 +11,6 @@ import org.springframework.stereotype.Component; * @author starBlues * @version 1.0 */ -@Component public class ConsoleNameImpl implements ConsoleName { @Autowired diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/HelloService.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/HelloService.java index 12205b1..7bdbeba 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/HelloService.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/HelloService.java @@ -16,7 +16,6 @@ public class HelloService { private final PluginConfig1 pluginConfig1; private final Service2 service2; - @Autowired public HelloService(PluginConfig1 pluginConfig1, Service2 service2) { this.pluginConfig1 = pluginConfig1; this.service2 = service2; diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java index cb269be..078e3a2 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java @@ -14,8 +14,6 @@ import org.springframework.web.bind.annotation.RestController; * @author starBlues * @version 1.0 */ -@RestController -@RequestMapping("/proxy") public class ProxyController { diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/HelloService.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/HelloService.java index 7e37081..c225d13 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/HelloService.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/HelloService.java @@ -16,7 +16,7 @@ public class HelloService { private final Plugin2Config plugin2Config; private final Service2 service2; - @Autowired + public HelloService(Plugin2Config plugin2Config, Service2 service2) { this.plugin2Config = plugin2Config; this.service2 = service2; diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml index fd0225d..41fa0f3 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml @@ -24,26 +24,6 @@ - - - com.baomidou - mybatis-plus-generator - ${mybatis-plus.version} - - - - - org.apache.velocity - velocity-engine-core - ${velocity.version} - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring-boot-starter.version} - - \ No newline at end of file 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 b82a9e8..4e2748c 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 @@ -1,6 +1,5 @@ package com.mybatis.plugin1.rest; -import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.mybatis.plugin1.entity.Plugin1; import com.mybatis.plugin1.mapper.Plugin1Mapper; import com.mybatis.plugin1.service.TranServiec; @@ -47,7 +46,6 @@ public class Plugin1Controller { if(!StringUtils.isEmpty(name)){ p.setName(name); } - GlobalConfig config = new GlobalConfig(); return pluginMapperl.getByCondition(p); } diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml b/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml index f65a1a0..fce0dc9 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml +++ b/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.4.2 diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml index d07e143..9a4d4e7 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml +++ b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml @@ -16,6 +16,6 @@ mybatis-plus: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl plugin: - runMode: prod - pluginPath: D:\code\open-source-code\springboot-plugin-framework-parent\example\integration-mybatisplus\dist\plugins + runMode: dev + pluginPath: ./example/integration-mybatisplus/plugins pluginConfigFilePath: \ No newline at end of file diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusConfig.java b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusConfig2.java similarity index 41% rename from example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusConfig.java rename to example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusConfig2.java index dea3e3f..df5b71b 100644 --- a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusConfig.java +++ b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusConfig2.java @@ -1,9 +1,8 @@ package com.mybatisplus.plugin; -import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.extension.mybatis.mybatisplus.SpringBootMybatisPlusConfig; import com.google.common.collect.Sets; -import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import org.springframework.stereotype.Component; import java.util.Set; @@ -13,8 +12,8 @@ import java.util.Set; * @version 1.0 * @since 2020-12-14 */ -@Component -public class MybatisPlusConfig implements SpringBootMybatisPlusConfig { +@ConfigDefinition("") +public class MybatisPlusConfig2 implements SpringBootMybatisPlusConfig { @Override public Set entityPackage() { return Sets.newHashSet("com.mybatisplus.plugin.entity"); @@ -25,17 +24,4 @@ public class MybatisPlusConfig implements SpringBootMybatisPlusConfig { return Sets.newHashSet("classpath:mapper/*Mapper.xml"); } - @Override - public void oneselfConfig(MybatisSqlSessionFactoryBean sqlSessionFactoryBean) { - MysqlDataSource mysqlDataSource = new MysqlDataSource(); - mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/ac_identity_auth?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC"); - mysqlDataSource.setUser("root"); - mysqlDataSource.setPassword("root"); - sqlSessionFactoryBean.setDataSource(mysqlDataSource); - } - - @Override - public boolean enableOneselfConfig() { - return true; - } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java index 0ea4470..3405645 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java @@ -1,7 +1,6 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.mybatis.group.PluginMapperGroup; -import com.gitee.starblues.factory.PluginInfoContainer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.name.PluginAnnotationBeanNameGenerator; import org.apache.ibatis.session.SqlSessionFactory; @@ -15,6 +14,7 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.AnnotationScopeMetadataResolver; import org.springframework.context.annotation.ScopeMetadata; @@ -38,10 +38,8 @@ public class MapperHandler { private final ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver(); - private final GenericApplicationContext applicationContext; - public MapperHandler(GenericApplicationContext applicationContext) { - this.applicationContext = applicationContext; + public MapperHandler(ApplicationContext applicationContext) { } /** @@ -51,6 +49,7 @@ public class MapperHandler { */ public void processMapper(PluginRegistryInfo pluginRegistryInfo, MapperHandler.ProcessMapper processMapper){ + GenericApplicationContext applicationContext = pluginRegistryInfo.getPluginApplicationContext(); List> groupClasses = pluginRegistryInfo.getGroupClasses(PluginMapperGroup.GROUP_ID); if(groupClasses == null || groupClasses.isEmpty()){ return; @@ -72,7 +71,6 @@ public class MapperHandler { try { processMapper.process(definitionHolder, groupClass); beanNames.add(beanName); - PluginInfoContainer.addRegisterBeanName(pluginId, beanName); } catch (Exception e) { LOGGER.error("process mapper '{}' error. {}", groupClass.getName(), e.getMessage(), e); } @@ -107,14 +105,13 @@ public class MapperHandler { * @throws Exception 卸载异常 */ public void unRegistryMapper(PluginRegistryInfo pluginRegistryInfo) throws Exception { + GenericApplicationContext applicationContext = pluginRegistryInfo.getPluginApplicationContext(); Set beanNames = pluginRegistryInfo.getExtension(MAPPER_INTERFACE_NAMES); if(beanNames == null){ return; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); for (String beanName : beanNames) { applicationContext.removeBeanDefinition(beanName); - PluginInfoContainer.removeRegisterBeanName(pluginId, beanName); } } 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 4e5689c..ee1afb4 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 @@ -7,6 +7,7 @@ import com.gitee.starblues.extension.mybatis.group.PluginMapperGroup; import com.gitee.starblues.extension.mybatis.mybatisplus.MybatisPlusProcessor; import com.gitee.starblues.extension.mybatis.tkmyabtis.TkMybatisProcessor; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; +import com.gitee.starblues.factory.process.pipe.bean.PluginBeanRegistrarExtend; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroupExtend; import org.springframework.context.ApplicationContext; @@ -58,7 +59,7 @@ public class SpringBootMybatisExtension extends AbstractExtension { public List getPluginPipeProcessor(ApplicationContext applicationContext) { final List pluginPipeProcessorExtends = new ArrayList<>(); if(type == Type.MYBATIS_PLUS){ - pluginPipeProcessorExtends.add(new MybatisPlusProcessor(applicationContext)); + } else if(type == Type.TK_MYBATIS){ pluginPipeProcessorExtends.add(new TkMybatisProcessor(applicationContext)); } else { @@ -67,6 +68,13 @@ public class SpringBootMybatisExtension extends AbstractExtension { return pluginPipeProcessorExtends; } + @Override + public List getPluginBeanRegistrar(ApplicationContext applicationContext) { + final List pluginPipeProcessorExtends = new ArrayList<>(); + pluginPipeProcessorExtends.add(new MybatisPlusProcessor(applicationContext)); + return pluginPipeProcessorExtends; + } + public enum Type{ MYBATIS, MYBATIS_PLUS, diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java index 2233690..181fc7f 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java @@ -11,21 +11,24 @@ import com.gitee.starblues.extension.mybatis.MapperHandler; import com.gitee.starblues.extension.mybatis.PluginFollowCoreConfig; import com.gitee.starblues.extension.mybatis.PluginResourceFinder; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; -import com.gitee.starblues.utils.OrderPriority; +import com.gitee.starblues.factory.process.pipe.bean.PluginBeanRegistrarExtend; +import com.gitee.starblues.utils.PluginBeanUtils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.DatabaseIdProvider; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.scripting.LanguageDriver; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; -import org.pf4j.ClassLoadingStrategy; -import org.pf4j.PluginWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; +import org.springframework.core.type.AnnotationMetadata; + +import java.util.Set; /** @@ -33,16 +36,14 @@ import org.springframework.core.io.Resource; * @author starBlues * @version 2.3 */ -public class MybatisPlusProcessor implements PluginPipeProcessorExtend { +public class MybatisPlusProcessor implements PluginBeanRegistrarExtend, ImportBeanDefinitionRegistrar { private static final Logger LOGGER = LoggerFactory.getLogger(MybatisPlusProcessor.class); - private final GenericApplicationContext applicationContext; private final MapperHandler mapperHandler; public MybatisPlusProcessor(ApplicationContext applicationContext) { - this.applicationContext = (GenericApplicationContext) applicationContext; - this.mapperHandler = new MapperHandler(this.applicationContext); + this.mapperHandler = new MapperHandler(applicationContext); } @Override @@ -50,11 +51,6 @@ public class MybatisPlusProcessor implements PluginPipeProcessorExtend { return "MybatisPlusProcessor"; } - @Override - public OrderPriority order() { - return OrderPriority.getMiddlePriority(); - } - @Override public void initialize() throws Exception { @@ -62,21 +58,20 @@ public class MybatisPlusProcessor implements PluginPipeProcessorExtend { @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - - SpringBootMybatisPlusConfig config = ExtensionConfigUtils.getConfig(applicationContext, - pluginWrapper.getPluginId(), + SpringBootMybatisPlusConfig config = PluginBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), SpringBootMybatisPlusConfig.class); if(config == null){ return; } - final MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean(); if(config.enableOneselfConfig()){ config.oneselfConfig(factory); } else { - PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig(applicationContext); + PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig( + pluginRegistryInfo.getMainApplicationContext() + ); factory.setDataSource(followCoreConfig.getDataSource()); factory.setConfiguration(followCoreConfig.getMybatisPlusConfiguration()); Interceptor[] interceptor = followCoreConfig.getInterceptor(); @@ -92,7 +87,7 @@ public class MybatisPlusProcessor implements PluginPipeProcessorExtend { factory.setScriptingLanguageDrivers(languageDriver); } // 配置mybatis私有的配置 - mybatisPlusFollowCoreConfig(factory); + mybatisPlusFollowCoreConfig(factory, pluginRegistryInfo.getMainApplicationContext()); } PluginResourceFinder pluginResourceFinder = new PluginResourceFinder(pluginRegistryInfo); @@ -124,40 +119,41 @@ public class MybatisPlusProcessor implements PluginPipeProcessorExtend { } - @Override - public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - mapperHandler.unRegistryMapper(pluginRegistryInfo); - } - private void mybatisPlusFollowCoreConfig(MybatisSqlSessionFactoryBean factory){ - MybatisPlusProperties plusProperties = applicationContext.getBean(MybatisPlusProperties.class); + private void mybatisPlusFollowCoreConfig(MybatisSqlSessionFactoryBean factory, + GenericApplicationContext parentApplicationContext){ + MybatisPlusProperties plusProperties = parentApplicationContext.getBean(MybatisPlusProperties.class); GlobalConfig globalConfig = plusProperties.getGlobalConfig(); - if (this.applicationContext.getBeanNamesForType(IKeyGenerator.class, false, + if (parentApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, false).length > 0) { - IKeyGenerator keyGenerator = this.applicationContext.getBean(IKeyGenerator.class); + IKeyGenerator keyGenerator = parentApplicationContext.getBean(IKeyGenerator.class); globalConfig.getDbConfig().setKeyGenerator(keyGenerator); } - if (this.applicationContext.getBeanNamesForType(MetaObjectHandler.class, + if (parentApplicationContext.getBeanNamesForType(MetaObjectHandler.class, false, false).length > 0) { - MetaObjectHandler metaObjectHandler = this.applicationContext.getBean(MetaObjectHandler.class); + MetaObjectHandler metaObjectHandler = parentApplicationContext.getBean(MetaObjectHandler.class); globalConfig.setMetaObjectHandler(metaObjectHandler); } - if (this.applicationContext.getBeanNamesForType(IKeyGenerator.class, false, + if (parentApplicationContext.getBeanNamesForType(IKeyGenerator.class, false, false).length > 0) { - IKeyGenerator keyGenerator = this.applicationContext.getBean(IKeyGenerator.class); + IKeyGenerator keyGenerator = parentApplicationContext.getBean(IKeyGenerator.class); globalConfig.getDbConfig().setKeyGenerator(keyGenerator); } - if (this.applicationContext.getBeanNamesForType(ISqlInjector.class, false, + if (parentApplicationContext.getBeanNamesForType(ISqlInjector.class, false, false).length > 0) { - ISqlInjector iSqlInjector = this.applicationContext.getBean(ISqlInjector.class); + ISqlInjector iSqlInjector = parentApplicationContext.getBean(ISqlInjector.class); globalConfig.setSqlInjector(iSqlInjector); } factory.setGlobalConfig(globalConfig); } + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + + } } 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 8ae1cc1..6a34812 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,6 +1,7 @@ package com.gitee.starblues.extension; import com.gitee.starblues.factory.process.pipe.PluginPreProcessorExtend; +import com.gitee.starblues.factory.process.pipe.bean.PluginBeanRegistrarExtend; import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoader; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; @@ -70,6 +71,18 @@ public abstract class AbstractExtension { return null; } + + /** + * 返回扩展的bean定义注册者扩展 + * 该扩展主要是对每一个插件进行处理 + * @return List PluginPipeProcessorExtend + */ + public List getPluginBeanRegistrar(ApplicationContext applicationContext){ + return null; + } + + + /** * 返回扩展的流插件处理者。 * 该扩展主要是对每一个插件进行处理 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java index 2b4ee61..c9d5d7d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java @@ -1,6 +1,5 @@ package com.gitee.starblues.extension; -import com.gitee.starblues.factory.PluginInfoContainer; import org.pf4j.util.StringUtils; import org.springframework.context.ApplicationContext; @@ -35,9 +34,7 @@ public class ExtensionConfigUtils { if(StringUtils.isNullOrEmpty(beanName)){ continue; } - if(PluginInfoContainer.existRegisterBeanName(pluginId, beanName)){ - return applicationContext.getBean(beanName, tClass); - } + return applicationContext.getBean(beanName, tClass); } return null; } catch (Exception e){ 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 b1e7c0a..4463bdf 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 @@ -2,6 +2,7 @@ package com.gitee.starblues.extension; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.factory.process.pipe.PluginPreProcessorExtend; +import com.gitee.starblues.factory.process.pipe.bean.PluginBeanRegistrarExtend; import com.gitee.starblues.factory.process.pipe.classs.PluginClassGroupExtend; import com.gitee.starblues.factory.process.post.PluginPostProcessorExtend; import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoader; @@ -33,6 +34,7 @@ public class ExtensionInitializer { private static final List RESOURCE_LOADERS_EXTENDS = new ArrayList<>(); private static final List PIPE_PROCESSOR_EXTENDS = new ArrayList<>(); + private static final List BEAN_REGISTRAR_EXTEND = new ArrayList<>(); private static final List CLASS_GROUP_EXTENDS = new ArrayList<>(); private static final List PRE_PROCESSOR_EXTENDS = new ArrayList<>(); private static final List POST_PROCESSOR_EXTENDS = new ArrayList<>(); @@ -70,29 +72,34 @@ public class ExtensionInitializer { 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("、"); + iteration(abstractExtension.getPluginResourceLoader(), extend->{ + RESOURCE_LOADERS_EXTENDS.add(extend); + debug.append(extend.key()).append("、"); }, bean -> bean.order()); - iteration(abstractExtension.getPluginPreProcessor(applicationContext), pluginPreProcessorExtend->{ - PRE_PROCESSOR_EXTENDS.add(pluginPreProcessorExtend); - debug.append(pluginPreProcessorExtend.key()).append("、"); + iteration(abstractExtension.getPluginPreProcessor(applicationContext), extend->{ + PRE_PROCESSOR_EXTENDS.add(extend); + debug.append(extend.key()).append("、"); }, bean -> bean.order()); - iteration(abstractExtension.getPluginPipeProcessor(applicationContext), pluginPipeProcessorExtend->{ - PIPE_PROCESSOR_EXTENDS.add(pluginPipeProcessorExtend); - debug.append(pluginPipeProcessorExtend.key()).append("、"); + iteration(abstractExtension.getPluginBeanRegistrar(applicationContext), extend->{ + BEAN_REGISTRAR_EXTEND.add(extend); + debug.append(extend.key()).append("、"); + }, null); + + iteration(abstractExtension.getPluginPipeProcessor(applicationContext), extend->{ + PIPE_PROCESSOR_EXTENDS.add(extend); + debug.append(extend.key()).append("、"); }, bean -> bean.order()); - iteration(abstractExtension.getPluginClassGroup(applicationContext), pluginClassGroupExtend->{ - CLASS_GROUP_EXTENDS.add(pluginClassGroupExtend); - debug.append(pluginClassGroupExtend.key()).append("、"); + iteration(abstractExtension.getPluginClassGroup(applicationContext), extend->{ + CLASS_GROUP_EXTENDS.add(extend); + debug.append(extend.key()).append("、"); }, null); - iteration(abstractExtension.getPluginPostProcessor(applicationContext), pluginResourceLoader->{ - POST_PROCESSOR_EXTENDS.add(pluginResourceLoader); - debug.append(pluginResourceLoader.key()); + iteration(abstractExtension.getPluginPostProcessor(applicationContext), extend->{ + POST_PROCESSOR_EXTENDS.add(extend); + debug.append(extend.key()); }, bean -> bean.order()); debug.append("] is registered"); @@ -113,6 +120,10 @@ public class ExtensionInitializer { return PIPE_PROCESSOR_EXTENDS; } + public static List getPluginBeanRegistrarExtends() { + return BEAN_REGISTRAR_EXTEND; + } + public static List getClassGroupExtends() { return CLASS_GROUP_EXTENDS; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java deleted file mode 100644 index b085447..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.gitee.starblues.factory; - -import org.springframework.util.StringUtils; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 插件信息共享容器 - * - * @author starBlues - * @version 2.1.0 - */ -public class PluginInfoContainer { - - private PluginInfoContainer(){} - - - /** - * 全局插件中定义的BaneName - */ - private final static Map> REGISTER_BEAN_NAMES = new ConcurrentHashMap<>(); - - /** - * 添加注册的bean名称 - * @param pluginId 插件id - * @param beanName 注册的bean名称 - */ - public static synchronized void addRegisterBeanName(String pluginId, String beanName){ - if(!StringUtils.isEmpty(beanName)){ - Set beanNames = REGISTER_BEAN_NAMES.get(pluginId); - if(beanNames == null){ - beanNames = new HashSet<>(); - REGISTER_BEAN_NAMES.put(pluginId, beanNames); - } - beanNames.add(beanName); - } - } - - /** - * 移除注册的bean名称 - * @param pluginId 插件id - * @param beanName 注册的bean名称 - */ - public static synchronized void removeRegisterBeanName(String pluginId, String beanName){ - Set beanNames = REGISTER_BEAN_NAMES.get(pluginId); - if(beanNames != null){ - beanNames.remove(beanName); - } - } - - /** - * 是否存在bean名称 - * @param pluginId 插件id - * @param beanName 注册的bean名称 - * @return true 存在。false不存在 - */ - public static synchronized boolean existRegisterBeanName(String pluginId, String beanName){ - Set beanNames = REGISTER_BEAN_NAMES.get(pluginId); - if(beanNames != null){ - return beanNames.contains(beanName); - } else { - return false; - } - } - - /** - * 是否存在bean名称 - * @param beanName 注册的bean名称 - * @return true 存在。false不存在 - */ - public static synchronized boolean existRegisterBeanName(String beanName){ - for (Set beanNames : REGISTER_BEAN_NAMES.values()){ - if(beanNames.contains(beanName)){ - return true; - } - } - return false; - } - -} 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 c6853db..a266d6b 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 @@ -1,11 +1,13 @@ package com.gitee.starblues.factory; +import com.gitee.starblues.factory.process.pipe.PluginInfoContainers; import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.*; import org.pf4j.util.StringUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.util.ClassUtils; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -25,8 +27,10 @@ public class PluginRegistryInfo { private final PluginWrapper pluginWrapper; private final PluginManager pluginManager; - private final GenericApplicationContext parentApplicationContext; + private final GenericApplicationContext mainApplicationContext; private final AnnotationConfigApplicationContext pluginApplicationContext; + private final SpringBeanRegister springBeanRegister; + /** * 是否跟随主程序启动而初始化 @@ -34,7 +38,10 @@ public class PluginRegistryInfo { private final boolean followingInitial; private final BasePlugin basePlugin; - + /** + * 插件中的配置单例bean + */ + private final Set configSingletonObjects = new HashSet<>(2); /** * 插件中的Class */ @@ -60,19 +67,18 @@ public class PluginRegistryInfo { private PluginRegistryInfo(PluginWrapper pluginWrapper, PluginManager pluginManager, - GenericApplicationContext parentApplicationContext, + GenericApplicationContext mainApplicationContext, boolean followingInitial) { this.pluginWrapper = pluginWrapper; this.pluginManager = pluginManager; this.basePlugin = (BasePlugin) pluginWrapper.getPlugin(); - this.parentApplicationContext = parentApplicationContext; + this.mainApplicationContext = mainApplicationContext; this.followingInitial = followingInitial; // 生成插件Application - this.pluginApplicationContext = - new AnnotationConfigApplicationContext(); + this.pluginApplicationContext = new AnnotationConfigApplicationContext(); this.pluginApplicationContext.setClassLoader(basePlugin.getWrapper().getPluginClassLoader()); - + this.springBeanRegister = new SpringBeanRegister(pluginApplicationContext); } public static PluginRegistryInfo build(PluginWrapper pluginWrapper, @@ -189,9 +195,24 @@ public class PluginRegistryInfo { } /** - * 添加插件bean注册者信息 - * @param key 扩展的key - * @param value 扩展值 + * 添加插件中的配置对象 + * @param singletonObject 单例对象 + */ + public void addConfigSingleton(Object singletonObject){ + configSingletonObjects.add(singletonObject); + } + + /** + * 添加插件中的配置对象 + */ + public Set getConfigSingletons(){ + return Collections.unmodifiableSet(configSingletonObjects); + } + + /** + * 添加处理者信息 + * @param key key + * @param value value */ public void addProcessorInfo(String key, Object value){ processorInfo.put(key, value); @@ -209,14 +230,30 @@ public class PluginRegistryInfo { extensionMap.put(key, value); } - public GenericApplicationContext getParentApplicationContext() { - return parentApplicationContext; + /** + * 得到主程序的ApplicationContext + * @return GenericApplicationContext + */ + public GenericApplicationContext getMainApplicationContext() { + return mainApplicationContext; } + /** + * 得到当前插件的ApplicationContext + * @return AnnotationConfigApplicationContext + */ public AnnotationConfigApplicationContext getPluginApplicationContext() { return pluginApplicationContext; } + /** + * 得到当前插件Bean注册者 + * @return SpringBeanRegister + */ + public SpringBeanRegister getSpringBeanRegister() { + return springBeanRegister; + } + /** * 移除扩展数据 * @param key 扩展的key @@ -306,4 +343,7 @@ public class PluginRegistryInfo { APD, ADP, PAD, DAP, DPA, PDA } + + + } 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 5f2ec71..567c550 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 @@ -1,15 +1,19 @@ package com.gitee.starblues.factory; import com.gitee.starblues.factory.process.pipe.bean.name.PluginAnnotationBeanNameGenerator; +import com.gitee.starblues.utils.PluginBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition; import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import java.text.MessageFormat; +import java.util.Objects; import java.util.function.Consumer; /** @@ -24,8 +28,13 @@ public class SpringBeanRegister { private final GenericApplicationContext applicationContext; - public SpringBeanRegister(ApplicationContext applicationContext){ - this.applicationContext = (GenericApplicationContext) applicationContext; + public SpringBeanRegister(GenericApplicationContext pluginApplicationContext){ + this.applicationContext = pluginApplicationContext; + } + + + public boolean exist(String name){ + return applicationContext.containsBean(name); } /** @@ -48,13 +57,13 @@ public class SpringBeanRegister { */ public String register(String pluginId, Class aClass, Consumer consumer) { - AnnotatedGenericBeanDefinition beanDefinition = new - AnnotatedGenericBeanDefinition(aClass); - + AnnotatedGenericBeanDefinition beanDefinition = new AnnotatedGenericBeanDefinition(aClass); + beanDefinition.setBeanClass(aClass); BeanNameGenerator beanNameGenerator = new PluginAnnotationBeanNameGenerator(pluginId); String beanName = beanNameGenerator.generateBeanName(beanDefinition, applicationContext); - if(PluginInfoContainer.existRegisterBeanName((beanName))){ + + if(applicationContext.containsBean(beanName)){ String error = MessageFormat.format("Bean name {0} already exist of {1}", beanName, aClass.getName()); logger.debug(error); @@ -63,13 +72,7 @@ public class SpringBeanRegister { if(consumer != null){ consumer.accept(beanDefinition); } - PluginInfoContainer.addRegisterBeanName(pluginId, beanName); applicationContext.registerBeanDefinition(beanName, beanDefinition); - try { - applicationContext.getBean(beanName); - } catch (BeansException e) { - logger.debug(e.getMessage()); - } return beanName; } @@ -96,7 +99,7 @@ public class SpringBeanRegister { Consumer consumer) { AnnotatedGenericBeanDefinition beanDefinition = new AnnotatedGenericBeanDefinition(aClass); - if(PluginInfoContainer.existRegisterBeanName((beanName))){ + if(applicationContext.containsBean(beanName)){ String error = MessageFormat.format("Bean name {0} already exist of {1}", beanName, aClass.getName()); throw new RuntimeException(error); @@ -105,10 +108,31 @@ public class SpringBeanRegister { consumer.accept(beanDefinition); } applicationContext.registerBeanDefinition(beanName, beanDefinition); - PluginInfoContainer.addRegisterBeanName(pluginId, beanName); + } + + /** + * 注册单例 + * @param name 单例名称 + * @param object 对象 + */ + public void registerSingleton(String name, Object object){ + DefaultListableBeanFactory listableBeanFactory = applicationContext.getDefaultListableBeanFactory(); + if(!listableBeanFactory.containsSingleton(name)){ + listableBeanFactory.registerSingleton(name, object); + } } + /** + * 销毁单例 + * @param name 单例名称 + */ + public void destroySingleton(String name){ + DefaultListableBeanFactory listableBeanFactory = applicationContext.getDefaultListableBeanFactory(); + if(listableBeanFactory.containsSingleton(name)){ + listableBeanFactory.destroySingleton(name); + } + } /** * 卸载bean @@ -120,8 +144,6 @@ public class SpringBeanRegister { applicationContext.removeBeanDefinition(beanName); } catch (Exception e){ logger.error("Remove plugin '{}' bean {} error. {}", pluginId, beanName, e.getMessage()); - } finally { - PluginInfoContainer.removeRegisterBeanName(pluginId, beanName); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java new file mode 100644 index 0000000..ce23f0a --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java @@ -0,0 +1,70 @@ +package com.gitee.starblues.factory.process.pipe; + +import com.gitee.starblues.extension.ExtensionInitializer; +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.pipe.bean.*; +import com.gitee.starblues.realize.PluginUtils; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.GenericApplicationContext; + +import java.util.ArrayList; +import java.util.List; + +/** + * 插件的ApplicationContext 处理 + * 主要进行插件bean的扫描 + * @author starBlues + * @version 1.0 + */ +public class PluginApplicationContextProcessor implements PluginPipeProcessor{ + + private final List pluginBeanDefinitionRegistrars = new ArrayList<>(); + private final ApplicationContext mainApplicationContext; + + public PluginApplicationContextProcessor(ApplicationContext mainApplicationContext) { + this.mainApplicationContext = mainApplicationContext; + } + + @Override + public void initialize() throws Exception { + pluginBeanDefinitionRegistrars.add(new ConfigBeanRegistrar()); + pluginBeanDefinitionRegistrars.add(new ConfigFileBeanRegistrar(mainApplicationContext)); + pluginBeanDefinitionRegistrars.add(new BasicBeanRegistrar()); + pluginBeanDefinitionRegistrars.add(new OneselfListenerBeanRegistrar()); + pluginBeanDefinitionRegistrars.addAll(ExtensionInitializer.getPluginBeanRegistrarExtends()); + } + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + AnnotationConfigApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + pluginApplicationContext.getDefaultListableBeanFactory().registerSingleton("p", + pluginApplicationContext); + // 进行bean注册 + for (PluginBeanRegistrar pluginBeanDefinitionRegistrar : pluginBeanDefinitionRegistrars) { + pluginBeanDefinitionRegistrar.registry(pluginRegistryInfo); + } + pluginApplicationContext.refresh(); + buildPluginApplicationContext(pluginRegistryInfo); + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + PluginInfoContainers.removePluginApplicationContext(pluginRegistryInfo.getPluginWrapper().getPluginId()); + } + + private void buildPluginApplicationContext(PluginRegistryInfo pluginRegistryInfo){ + GenericApplicationContext parentApplicationContext = pluginRegistryInfo.getMainApplicationContext(); + AnnotationConfigApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + + PluginUtils pluginUtils = new PluginUtils(parentApplicationContext, + pluginApplicationContext, + pluginRegistryInfo.getPluginWrapper().getDescriptor()); + parentApplicationContext.getBeanFactory().registerSingleton( + pluginUtils.getClass().getName(), pluginUtils); + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + PluginInfoContainers.addPluginApplicationContext(pluginId, pluginApplicationContext); + } + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java new file mode 100644 index 0000000..2609a99 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java @@ -0,0 +1,43 @@ +package com.gitee.starblues.factory.process.pipe; + +import org.springframework.context.support.GenericApplicationContext; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 插件信息容器 + * @author starBlues + * @version 2.4.0 + */ +public class PluginInfoContainers { + + private final static Map pluginApplicationContexts = + new ConcurrentHashMap<>(); + + + static void addPluginApplicationContext(String pluginId, GenericApplicationContext applicationContext){ + pluginApplicationContexts.put(pluginId, applicationContext); + } + + static void removePluginApplicationContext(String pluginId){ + pluginApplicationContexts.remove(pluginId); + } + + static public GenericApplicationContext getPluginApplicationContext(String pluginId) { + GenericApplicationContext applicationContext = pluginApplicationContexts.get(pluginId); + if(applicationContext == null){ + return null; + } + return applicationContext; + } + + static public List getPluginApplicationContexts() { + Collection values = pluginApplicationContexts.values(); + if(values.isEmpty()){ + return Collections.emptyList(); + } + return new ArrayList<>(values); + } + +} 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 f86a11f..02835c4 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 @@ -2,10 +2,6 @@ package com.gitee.starblues.factory.process.pipe; import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.pipe.bean.BasicBeanProcessor; -import com.gitee.starblues.factory.process.pipe.bean.ConfigBeanProcessor; -import com.gitee.starblues.factory.process.pipe.bean.ConfigFileBeanProcessor; -import com.gitee.starblues.factory.process.pipe.bean.OneselfListenerStopEventProcessor; import com.gitee.starblues.factory.process.pipe.classs.PluginClassProcess; import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoadFactory; import org.slf4j.Logger; @@ -39,16 +35,18 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { // 以下顺序不能更改 // 插件资源加载者, 必须放在第一位 pluginPipeProcessors.add(new PluginResourceLoadFactory()); - // OneselfListenerStopEventProcessor 触发停止事件 - pluginPipeProcessors.add(new OneselfListenerStopEventProcessor(applicationContext)); pluginPipeProcessors.add(new PluginClassProcess()); - // 配置文件在所有bean中第一个初始化。 - pluginPipeProcessors.add(new ConfigFileBeanProcessor(applicationContext)); + pluginPipeProcessors.add(new PluginApplicationContextProcessor(applicationContext)); + // pluginPipeProcessors.add(new PluginApplicationContextProcessor()); + // OneselfListenerStopEventProcessor 触发停止事件 + // pluginPipeProcessors.add(new OneselfListenerStopEventProcessor()); + // 配置文件在所有bean中第一个初始化 + // pluginPipeProcessors.add(new ConfigFileBeanProcessor(applicationContext)); // 接下来初始化插件中配置bean的初始化 - pluginPipeProcessors.add(new ConfigBeanProcessor(applicationContext)); + // pluginPipeProcessors.add(new ConfigBeanProcessor()); // 添加前置扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPreProcessorExtends()); - pluginPipeProcessors.add(new BasicBeanProcessor(applicationContext)); + // pluginPipeProcessors.add(new BasicBeanProcessor()); // 添加扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPipeProcessorExtends()); 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/BasicBeanRegistrar.java similarity index 46% rename from springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanProcessor.java rename to springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java index 96270ea..16f90a0 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/BasicBeanRegistrar.java @@ -2,39 +2,29 @@ package com.gitee.starblues.factory.process.pipe.bean; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.SpringBeanRegister; -import com.gitee.starblues.factory.process.pipe.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 java.lang.reflect.Field; + import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator; -import org.springframework.context.ApplicationContext; -import org.springframework.util.ReflectionUtils; /** * 基础bean注册 * * @author starBlues - * @version 2.3 + * @version 2.4.0 */ -public class BasicBeanProcessor implements PluginPipeProcessor { +public class BasicBeanRegistrar implements PluginBeanRegistrar { - private static final Logger LOGGER = LoggerFactory.getLogger(BasicBeanProcessor.class); + private static final Logger LOGGER = LoggerFactory.getLogger(BasicBeanRegistrar.class); private static final String KEY = "BasicBeanProcessor"; - private final SpringBeanRegister springBeanRegister; - private final ApplicationContext applicationContext; - - public BasicBeanProcessor(ApplicationContext applicationContext){ - Objects.requireNonNull(applicationContext); - this.applicationContext = applicationContext; - this.springBeanRegister = new SpringBeanRegister(applicationContext); + public BasicBeanRegistrar(){ } @Override @@ -60,18 +50,6 @@ public class BasicBeanProcessor implements PluginPipeProcessor { pluginRegistryInfo.addProcessorInfo(KEY, beanNames); } - @Override - public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - Set beanNames = pluginRegistryInfo.getProcessorInfo(KEY); - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - if(beanNames != null){ - for (String beanName : beanNames) { - springBeanRegister.unregister(pluginId, beanName); - } - removeProxyBeanName(beanNames, pluginId); - } - } - /** * 往Spring注册bean * @param pluginRegistryInfo 插件注册的信息 @@ -85,6 +63,7 @@ public class BasicBeanProcessor implements PluginPipeProcessor { return; } String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); for (Class aClass : classes) { if(aClass == null){ continue; @@ -94,45 +73,6 @@ public class BasicBeanProcessor implements PluginPipeProcessor { } } - /** - * 移除代理类的Bean - * @param beanNames bean名称 - * @param pluginId 插件id - */ - @SuppressWarnings("unchecked") - private void removeProxyBeanName(Set beanNames, String pluginId) { - AbstractAutoProxyCreator proxyCreator = applicationContext.getBean(AbstractAutoProxyCreator.class); - try { - Class aClass = proxyCreator.getClass(); - Field proxyTypesField = ReflectionUtils.findField(aClass, "proxyTypes"); - Map> proxyTypes = null; - if(proxyTypesField != null){ - if (!proxyTypesField.isAccessible()) { - proxyTypesField.setAccessible(true); - } - proxyTypes = (Map>) proxyTypesField.get(proxyCreator); - } - - Field advisedBeansField = ReflectionUtils.findField(aClass, "advisedBeans"); - Map advisedBeans = null; - if(advisedBeansField != null){ - if (!advisedBeansField.isAccessible()) { - advisedBeansField.setAccessible(true); - } - advisedBeans = (Map) advisedBeansField.get(proxyCreator); - } - for (String beanName : beanNames) { - if(proxyTypes != null){ - proxyTypes.remove(beanName); - } - if(advisedBeans != null){ - advisedBeans.remove(beanName); - } - } - } catch (Exception e) { - LOGGER.error("Remove plugin '{}' proxy bean failure. {}", pluginId, e.getMessage(), e); - } - } } 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/ConfigBeanRegistrar.java similarity index 41% rename from springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanProcessor.java rename to springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java index 73ce242..c76c6b1 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/ConfigBeanRegistrar.java @@ -2,12 +2,10 @@ package com.gitee.starblues.factory.process.pipe.bean; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.SpringBeanRegister; -import com.gitee.starblues.factory.process.pipe.PluginPipeProcessor; import com.gitee.starblues.factory.process.pipe.classs.group.ConfigBeanGroup; import com.gitee.starblues.realize.ConfigBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import java.util.*; @@ -16,20 +14,16 @@ import java.util.*; * @see ConfigBean * * @author starBlues - * @version 2.2.2 + * @version 2.4.0 */ -public class ConfigBeanProcessor implements PluginPipeProcessor { +public class ConfigBeanRegistrar implements PluginBeanRegistrar { private final Logger log = LoggerFactory.getLogger(this.getClass()); private static final String KEY = "ConfigBeanProcessor"; - private final SpringBeanRegister springBeanRegister; - private final ApplicationContext applicationContext; - public ConfigBeanProcessor(ApplicationContext applicationContext) { - this.springBeanRegister = new SpringBeanRegister(applicationContext); - this.applicationContext = applicationContext; + public ConfigBeanRegistrar() { } @@ -46,41 +40,13 @@ public class ConfigBeanProcessor implements PluginPipeProcessor { return; } String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - Map configBeanMap = new HashMap<>(); + SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); for (Class aClass : configBeans) { if(aClass == null){ continue; } - String name = springBeanRegister.register(pluginId, aClass); - Object bean = applicationContext.getBean(name); - if(bean instanceof ConfigBean){ - ConfigBean configBean = (ConfigBean) bean; - configBean.initialize(); - configBeanMap.put(name, configBean); - } - } - pluginRegistryInfo.addProcessorInfo(KEY, configBeanMap); - } - - @Override - public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - Map configBeanMap = pluginRegistryInfo.getProcessorInfo(KEY); - if(configBeanMap == null){ - return; + springBeanRegister.register(pluginId, aClass); } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - configBeanMap.forEach((beanName, configBean)->{ - if(configBean == null){ - return; - } - try { - configBean.destroy(); - } catch (Exception e) { - log.error("ConfigBean '' destroy exception. {}", e.getMessage(), e); - } - springBeanRegister.unregister(pluginId, beanName); - }); - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java similarity index 66% rename from springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanProcessor.java rename to springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java index 1b40d83..c38c57d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java @@ -1,18 +1,16 @@ package com.gitee.starblues.factory.process.pipe.bean; import com.gitee.starblues.annotation.ConfigDefinition; -import com.gitee.starblues.factory.PluginInfoContainer; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.pipe.PluginPipeProcessor; +import com.gitee.starblues.factory.SpringBeanRegister; import com.gitee.starblues.factory.process.pipe.bean.configuration.ConfigurationParser; import com.gitee.starblues.factory.process.pipe.bean.configuration.PluginConfigDefinition; import com.gitee.starblues.factory.process.pipe.bean.configuration.YamlConfigurationParser; import com.gitee.starblues.factory.process.pipe.classs.group.ConfigDefinitionGroup; import com.gitee.starblues.integration.IntegrationConfiguration; import org.pf4j.RuntimeMode; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.pf4j.util.StringUtils; import org.springframework.context.ApplicationContext; -import org.springframework.util.StringUtils; import java.util.HashSet; import java.util.List; @@ -23,20 +21,17 @@ import java.util.Set; * @author starBlues * @version 2.4.0 */ -public class ConfigFileBeanProcessor implements PluginPipeProcessor { +public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { private static final String KEY = "ConfigFileBeanProcessor"; private final ConfigurationParser configurationParser; - private final DefaultListableBeanFactory defaultListableBeanFactory; private final IntegrationConfiguration integrationConfiguration; - public ConfigFileBeanProcessor(ApplicationContext mainApplicationContext) { + public ConfigFileBeanRegistrar(ApplicationContext mainApplicationContext) { integrationConfiguration = mainApplicationContext.getBean(IntegrationConfiguration.class); this.configurationParser = new YamlConfigurationParser(integrationConfiguration); - this.defaultListableBeanFactory = (DefaultListableBeanFactory) - mainApplicationContext.getAutowireCapableBeanFactory(); } @@ -52,33 +47,16 @@ public class ConfigFileBeanProcessor implements PluginPipeProcessor { if(configDefinitions == null || configDefinitions.isEmpty()){ return; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); Set beanNames = new HashSet<>(); for (Class aClass : configDefinitions) { String beanName = registry(pluginRegistryInfo, aClass); - if(!StringUtils.isEmpty(beanName)){ + if(!StringUtils.isNullOrEmpty(beanName)){ beanNames.add(beanName); - PluginInfoContainer.addRegisterBeanName(pluginId, beanName); } } pluginRegistryInfo.addProcessorInfo(KEY, beanNames); } - @Override - public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - Set beanNames = pluginRegistryInfo.getProcessorInfo(KEY); - if(beanNames == null){ - return; - } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - for (String beanName : beanNames) { - if(defaultListableBeanFactory.containsSingleton(beanName)){ - defaultListableBeanFactory.destroySingleton(beanName); - PluginInfoContainer.removeRegisterBeanName(pluginId, beanName); - } - } - } - /** * 注册配置文件 * @param pluginRegistryInfo 插件注册的信息 @@ -92,18 +70,24 @@ public class ConfigFileBeanProcessor implements PluginPipeProcessor { return null; } String fileName = getConfigFileName(configDefinition, aClass); - PluginConfigDefinition pluginConfigDefinition = - new PluginConfigDefinition(fileName, aClass); - Object parseObject = configurationParser.parse(pluginRegistryInfo, - pluginConfigDefinition); + Object parseObject = null; + if(!StringUtils.isNullOrEmpty(fileName)){ + PluginConfigDefinition pluginConfigDefinition = + new PluginConfigDefinition(fileName, aClass); + parseObject = configurationParser.parse(pluginRegistryInfo, + pluginConfigDefinition); + } else { + parseObject = aClass.newInstance(); + } + String name = configDefinition.beanName(); - if(StringUtils.isEmpty(name)){ + if(StringUtils.isNullOrEmpty(name)){ name = aClass.getName(); } name = name + "@" + pluginRegistryInfo.getPluginWrapper().getPluginId(); - if(!defaultListableBeanFactory.containsSingleton(name)){ - defaultListableBeanFactory.registerSingleton(name, parseObject); - } + SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); + springBeanRegister.registerSingleton(name, parseObject); + pluginRegistryInfo.addConfigSingleton(parseObject); return name; } @@ -115,8 +99,8 @@ public class ConfigFileBeanProcessor implements PluginPipeProcessor { */ private String getConfigFileName(ConfigDefinition configDefinition, Class aClass){ String fileName = configDefinition.value(); - if(StringUtils.isEmpty(fileName)){ - throw new IllegalArgumentException(aClass.getName() + " configDefinition value is null"); + if(StringUtils.isNullOrEmpty(fileName)){ + return fileName; } String fileNamePrefix; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java new file mode 100644 index 0000000..3e6d424 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java @@ -0,0 +1,33 @@ +package com.gitee.starblues.factory.process.pipe.bean; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.post.bean.PluginOneselfStartEventProcessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 执行插件自监听器的停止事件的处理者。必须在所有处理者中第一个执行。否则会导致所依赖的bean被卸载。 + * + * @see PluginOneselfStartEventProcessor 触发启动事件 + * @author starBlues + * @version 2.4.0 + */ +public class OneselfListenerBeanRegistrar implements PluginBeanRegistrar { + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + + public OneselfListenerBeanRegistrar(){ + } + + + @Override + public void initialize() throws Exception {} + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + + } + + +} 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 deleted file mode 100644 index 7388f15..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerStopEventProcessor.java +++ /dev/null @@ -1,62 +0,0 @@ -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 starBlues - * @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/bean/PluginBeanRegister.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegister.java deleted file mode 100644 index c3a1106..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegister.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gitee.starblues.factory.process.pipe.bean; - -import com.gitee.starblues.factory.PluginRegistryInfo; - -/** - * 插件bean注册者 - * - * @author starBlues - * @version 2.1.0 - */ -public interface PluginBeanRegister { - - /** - * 注册者的唯一标识 - * @return String - */ - String key(); - - - /** - * 注册插件中的bane - * @param registerPluginInfo 插件信息 - * @return 返回注册的bean的标识。卸载时,会将该参数传入 - * @throws Exception 插件bean工厂异常 - */ - T registry(PluginRegistryInfo registerPluginInfo) throws Exception; - - /** - * 卸载插件中的bean - * @param registerPluginInfo 插件信息 - * @param t 注册时返回的参数 - * @throws Exception 插件bean工厂异常 - */ - void unRegistry(PluginRegistryInfo registerPluginInfo, T t) throws Exception; - - -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java new file mode 100644 index 0000000..8eb8698 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java @@ -0,0 +1,25 @@ +package com.gitee.starblues.factory.process.pipe.bean; + +import com.gitee.starblues.factory.PluginRegistryInfo; + +/** + * @author starBlues + * @version 1.0 + */ +public interface PluginBeanRegistrar { + + /** + * 初始化 + * @throws Exception 初始化异常 + */ + void initialize() throws Exception; + + + /** + * 处理该插件的注册 + * @throws Exception 处理异常 + */ + void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception; + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrarExtend.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrarExtend.java new file mode 100644 index 0000000..d9446b1 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrarExtend.java @@ -0,0 +1,15 @@ +package com.gitee.starblues.factory.process.pipe.bean; + +/** + * @author starBlues + * @version 1.0 + */ +public interface PluginBeanRegistrarExtend extends PluginBeanRegistrar { + + /** + * 扩展key + * @return String + */ + String key(); + +} 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 feef6cc..1356173 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 @@ -4,7 +4,9 @@ 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.Controller; import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; @@ -47,7 +49,8 @@ public class ComponentGroup implements PluginClassGroup { @Override public boolean filter(Class aClass) { - boolean have = AnnotationsUtils.haveAnnotations(aClass, false, Component.class, Service.class); + boolean have = AnnotationsUtils.haveAnnotations(aClass, false, Component.class, Service.class, + Controller.class, RestController.class); if(!have){ return false; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java index b741de6..b47373e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/load/PluginConfigFileLoader.java @@ -50,7 +50,7 @@ public class PluginConfigFileLoader implements PluginResourceLoader { BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); suppliers.add(findConfigRoot()); suppliers.add(findPluginRoot(basePlugin)); - suppliers.add(findClassPath(pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PAD))); + suppliers.add(findClassPath(pluginRegistryInfo.getDefaultPluginClassLoader())); for (Supplier supplier : suppliers) { 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 b6bc0cb..229b9c4 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 @@ -33,8 +33,9 @@ public class PluginPostProcessorFactory implements PluginPostProcessor { // 添加扩展 pluginPostProcessors.addAll(ExtensionInitializer.getPostProcessorExtends()); // 以下顺序不能更改。 - pluginPostProcessors.add(new PluginConfigurationPostProcessor(applicationContext)); - pluginPostProcessors.add(new PluginInvokePostProcessor(applicationContext)); + // pluginPostProcessors.add(new PluginBeanRefreshProcessor()); + // pluginPostProcessors.add(new PluginConfigurationPostProcessor(applicationContext)); + // pluginPostProcessors.add(new PluginInvokePostProcessor(applicationContext)); pluginPostProcessors.add(new PluginControllerPostProcessor(applicationContext)); // 主要触发启动监听事件,因此在最后一个执行。配合 OneselfListenerStopEventProcessor 该类触发启动、停止事件。 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 87a9850..9ca231b 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 @@ -17,15 +17,13 @@ import java.util.Objects; * @author starBlues * @version 2.1.0 */ +@Deprecated public class PluginConfigurationPostProcessor implements PluginPostProcessor { private final Logger log = LoggerFactory.getLogger(this.getClass()); ; - private final GenericApplicationContext applicationContext; - public PluginConfigurationPostProcessor(ApplicationContext applicationContext){ - Objects.requireNonNull(applicationContext); - this.applicationContext = (GenericApplicationContext) applicationContext; + public PluginConfigurationPostProcessor(){ } @@ -36,9 +34,7 @@ public class PluginConfigurationPostProcessor implements PluginPostProcessor { @Override public void registry(List pluginRegistryInfos) throws Exception { - ConfigurationClassPostProcessor configurationClassPostProcessor = - applicationContext.getBean(ConfigurationClassPostProcessor.class); - configurationClassPostProcessor.processConfigBeanDefinitions(applicationContext); + } @Override 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 cfa29fe..59edc09 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 @@ -36,15 +36,11 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { private static final String KEY = "PluginControllerPostProcessor"; - private final SpringBeanRegister springBeanRegister; - private final GenericApplicationContext applicationContext; private final RequestMappingHandlerMapping requestMappingHandlerMapping; private final IntegrationConfiguration configuration; public PluginControllerPostProcessor(ApplicationContext applicationContext){ Objects.requireNonNull(applicationContext); - this.springBeanRegister = new SpringBeanRegister(applicationContext); - this.applicationContext = (GenericApplicationContext) applicationContext; this.requestMappingHandlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class); this.configuration = applicationContext.getBean(IntegrationConfiguration.class); } @@ -72,7 +68,7 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { } try { ControllerBeanWrapper controllerBeanWrapper = registry(pluginRegistryInfo, groupClass); - process(1, pluginRegistryInfo.getPluginWrapper().getPluginId(), groupClass); + // process(1, pluginRegistryInfo.getPluginWrapper().getPluginId(), groupClass); controllerBeanWrappers.add(controllerBeanWrapper); } catch (Exception e){ pluginRegistryInfo.addProcessorInfo(getKey(pluginRegistryInfo), controllerBeanWrappers); @@ -104,11 +100,10 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { continue; } unregister(pluginId, controllerBeanWrapper); - process(2, - pluginRegistryInfo.getPluginWrapper().getPluginId(), - controllerBeanWrapper.getBeanClass()); +// process(2, +// pluginRegistryInfo.getPluginWrapper().getPluginId(), +// controllerBeanWrapper.getBeanClass()); } - } } @@ -122,18 +117,10 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { private ControllerBeanWrapper registry(PluginRegistryInfo pluginRegistryInfo, Class aClass) throws Exception { String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - String beanName = springBeanRegister.register(pluginId, aClass); - if(beanName == null || "".equals(beanName)){ - throw new IllegalArgumentException("registry "+ aClass.getName() + "failure!"); - } + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); try { - Object object = applicationContext.getBean(beanName); - if(object == null){ - throw new Exception("registry "+ aClass.getName() + "failure! " + - "Not found The instance of" + aClass.getName()); - } + Object object = pluginApplicationContext.getBean(aClass); ControllerBeanWrapper controllerBeanWrapper = new ControllerBeanWrapper(); - controllerBeanWrapper.setBeanName(beanName); setPathPrefix(pluginId, aClass); Method getMappingForMethod = ReflectionUtils.findMethod(RequestMappingHandlerMapping.class, "getMappingForMethod", Method.class, Class.class); @@ -153,7 +140,6 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { return controllerBeanWrapper; } catch (Exception e){ // 出现异常, 卸载该 controller bean - springBeanRegister.unregister(pluginId, beanName); throw e; } } @@ -171,10 +157,6 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { requestMappingHandlerMapping.unregisterMapping(requestMappingInfo); } } - String beanName = controllerBeanWrapper.getBeanName(); - if(!StringUtils.isEmpty(beanName)){ - springBeanRegister.unregister(pluginId, beanName); - } } @@ -280,33 +262,33 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { } } - private void process(int type, String pluginId, Class aClass){ - PluginControllerProcessor pluginControllerProcessor = null; - try { - pluginControllerProcessor = applicationContext.getBean(PluginControllerProcessor.class); - }catch (Exception e){ - pluginControllerProcessor = null; - } - if(pluginControllerProcessor == null){ - return; - } - if(type == 1){ - try { - pluginControllerProcessor.registry(pluginId, aClass); - }catch (Exception e){ - log.error("PluginControllerProcessor process {} {} error of registry", - pluginId, aClass.getName()); - } - } else { - try { - pluginControllerProcessor.unRegistry(pluginId, aClass); - }catch (Exception e){ - log.error("PluginControllerProcessor process {} {} error of unRegistry", - pluginId, aClass.getName()); - } - } - - } +// private void process(int type, String pluginId, Class aClass){ +// PluginControllerProcessor pluginControllerProcessor = null; +// try { +// pluginControllerProcessor = applicationContext.getBean(PluginControllerProcessor.class); +// }catch (Exception e){ +// pluginControllerProcessor = null; +// } +// if(pluginControllerProcessor == null){ +// return; +// } +// if(type == 1){ +// try { +// pluginControllerProcessor.registry(pluginId, aClass); +// }catch (Exception e){ +// log.error("PluginControllerProcessor process {} {} error of registry", +// pluginId, aClass.getName()); +// } +// } else { +// try { +// pluginControllerProcessor.unRegistry(pluginId, aClass); +// }catch (Exception e){ +// log.error("PluginControllerProcessor process {} {} error of unRegistry", +// pluginId, aClass.getName()); +// } +// } +// +// } /** * Controller Bean的包装 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 052a819..90497bd 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 @@ -3,7 +3,6 @@ package com.gitee.starblues.factory.process.post.bean; import com.fasterxml.jackson.databind.ObjectMapper; import com.gitee.starblues.annotation.Caller; import com.gitee.starblues.annotation.Supplier; -import com.gitee.starblues.factory.PluginInfoContainer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.SpringBeanRegister; import com.gitee.starblues.factory.process.pipe.classs.group.CallerGroup; @@ -15,7 +14,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.ApplicationContext; -import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.ClassUtils; import java.lang.reflect.InvocationHandler; @@ -40,13 +38,8 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { private final String KEY_SUPPERS = "PluginInvokePostProcessorSuppers"; private final String KEY_CALLERS = "PluginInvokePostProcessorCallers"; - private final GenericApplicationContext applicationContext; - private final SpringBeanRegister springBeanRegister; - public PluginInvokePostProcessor(ApplicationContext applicationContext){ Objects.requireNonNull(applicationContext); - this.applicationContext = (GenericApplicationContext) applicationContext; - this.springBeanRegister = new SpringBeanRegister(applicationContext); } @@ -108,6 +101,7 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { } Set beanNames = new HashSet<>(); String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); for (Class supperClass : supperClasses) { if(supperClass == null){ continue; @@ -117,7 +111,7 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { continue; } String beanName = supplier.value(); - if(PluginInfoContainer.existRegisterBeanName(beanName)){ + if(springBeanRegister.exist(beanName)){ String error = MessageFormat.format( "Plugin {0} : Bean @Supplier name {1} already exist of {2}", pluginRegistryInfo.getPluginWrapper().getPluginId(), beanName, supperClass.getName()); @@ -146,17 +140,17 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { if(caller == null){ continue; } - Object supper = applicationContext.getBean(caller.value()); - if(supper == null){ - return; - } - String beanName = springBeanRegister.register(pluginId, callerClass, (beanDefinition) ->{ - beanDefinition.getPropertyValues().add("callerInterface", callerClass); - beanDefinition.getPropertyValues().add("supper", supper); - beanDefinition.setBeanClass(CallerInterfaceFactory.class); - beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE); - }); - beanNames.add(beanName); +// Object supper = applicationContext.getBean(caller.value()); +// if(supper == null){ +// return; +// } +// String beanName = springBeanRegister.register(pluginId, callerClass, (beanDefinition) ->{ +// beanDefinition.getPropertyValues().add("callerInterface", callerClass); +// beanDefinition.getPropertyValues().add("supper", supper); +// beanDefinition.setBeanClass(CallerInterfaceFactory.class); +// beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE); +// }); +// beanNames.add(beanName); } pluginRegistryInfo.addProcessorInfo(getKey(KEY_CALLERS, pluginRegistryInfo), beanNames); } @@ -181,7 +175,7 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { return; } for (String beanName : beanNames) { - springBeanRegister.unregister(pluginId, beanName); + // springBeanRegister.unregister(pluginId, beanName); } } 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 index c7d64d4..1b790df 100644 --- 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 @@ -1,7 +1,7 @@ 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.pipe.bean.OneselfListenerBeanRegistrar; import com.gitee.starblues.factory.process.post.PluginPostProcessor; import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.user.PluginUser; @@ -9,16 +9,18 @@ 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 com.gitee.starblues.utils.PluginBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; +import org.springframework.context.support.GenericApplicationContext; import java.util.List; import java.util.Objects; /** * 插件中 OneselfListener 监听者处理者。主要执行监听器的启动事件。 - * @see OneselfListenerStopEventProcessor 触发停止事件 + * @see OneselfListenerBeanRegistrar 触发停止事件 * @author starBlues * @version 2.1.0 */ @@ -47,9 +49,10 @@ public class PluginOneselfStartEventProcessor implements PluginPostProcessor { try { BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); String pluginId = basePlugin.getWrapper().getPluginId(); - - List oneselfListeners = pluginUser.getPluginBeans(pluginId, OneselfListener.class); + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + List oneselfListeners = PluginBeanUtils.getPluginBeans(pluginApplicationContext, OneselfListener.class); oneselfListeners.stream() + .filter(oneselfListener -> oneselfListener != null) .sorted(CommonUtils.orderPriority(oneselfListener -> oneselfListener.order())) .forEach(oneselfListener -> { try { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java index 96ed619..b65c62b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java @@ -1,6 +1,7 @@ package com.gitee.starblues.integration.user; -import com.gitee.starblues.factory.PluginInfoContainer; +import com.gitee.starblues.factory.process.pipe.PluginInfoContainers; +import com.gitee.starblues.utils.PluginBeanUtils; import org.pf4j.PluginManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,7 +9,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import java.util.*; -import java.util.stream.Collectors; /** * 默认插件使用者 @@ -19,13 +19,14 @@ public class DefaultPluginUser implements PluginUser{ protected final Logger log = LoggerFactory.getLogger(this.getClass()); - protected final GenericApplicationContext applicationContext; + protected final GenericApplicationContext parentApplicationContext; + protected final PluginManager pluginManager; - public DefaultPluginUser(ApplicationContext applicationContext, PluginManager pluginManager) { - Objects.requireNonNull(applicationContext, "ApplicationContext can't be null"); + public DefaultPluginUser(ApplicationContext parentApplicationContext, PluginManager pluginManager) { + Objects.requireNonNull(parentApplicationContext, "ApplicationContext can't be null"); Objects.requireNonNull(pluginManager, "PluginManager can't be null"); - this.applicationContext = (GenericApplicationContext)applicationContext; + this.parentApplicationContext = (GenericApplicationContext)parentApplicationContext; this.pluginManager = pluginManager; } @@ -37,24 +38,17 @@ public class DefaultPluginUser implements PluginUser{ */ @Override public T getBean(String name){ - Object bean = applicationContext.getBean(name); - if(bean == null){ - return null; - } - return (T) bean; + return getBean(name, true); } @Override public T getBean(Class aClass) { - return applicationContext.getBean(aClass); + return getBean(aClass, true); } @Override public T getPluginBean(String name) { - if(isPluginBean(name)){ - return getBean(name); - } - return null; + return getBean(name, false); } /** @@ -65,29 +59,12 @@ public class DefaultPluginUser implements PluginUser{ */ @Override public List getBeans(Class aClass){ - Map beansOfTypeMap = applicationContext.getBeansOfType(aClass); - if(beansOfTypeMap == null){ - return Collections.emptyList(); - } - return beansOfTypeMap.values() - .stream() - .filter(beansOfType-> beansOfTypeMap != null) - .collect(Collectors.toList()); + return getBeans(aClass, 3); } @Override public List getMainBeans(Class aClass) { - Map beansOfTypeMap = applicationContext.getBeansOfType(aClass); - if(beansOfTypeMap == null){ - return Collections.emptyList(); - } - List beans = new ArrayList<>(); - beansOfTypeMap.forEach((beanName, bean)->{ - if(!isPluginBean(beanName)){ - beans.add(bean); - } - }); - return beans; + return getBeans(aClass, 1); } /** @@ -98,32 +75,17 @@ public class DefaultPluginUser implements PluginUser{ */ @Override public List getPluginBeans(Class aClass) { - Map beansOfTypeMap = applicationContext.getBeansOfType(aClass); - if(beansOfTypeMap == null){ - return Collections.emptyList(); - } - List beans = new ArrayList<>(); - beansOfTypeMap.forEach((beanName, bean)->{ - if(isPluginBean(beanName)){ - beans.add(bean); - } - }); - return beans; + return getBeans(aClass, 2); } @Override public List getPluginBeans(String pluginId, Class aClass) { - Map beansOfTypeMap = applicationContext.getBeansOfType(aClass); - if(beansOfTypeMap == null){ + GenericApplicationContext pluginApplicationContext = + PluginInfoContainers.getPluginApplicationContext(pluginId); + if(pluginApplicationContext == null){ return Collections.emptyList(); } - List beans = new ArrayList<>(); - beansOfTypeMap.forEach((beanName, bean)->{ - if(PluginInfoContainer.existRegisterBeanName(pluginId, beanName)){ - beans.add(bean); - } - }); - return beans; + return PluginBeanUtils.getPluginBeans(pluginApplicationContext, aClass); } @Override @@ -131,13 +93,21 @@ public class DefaultPluginUser implements PluginUser{ if(object == null){ return null; } - try { - Object newObject = applicationContext.getDefaultListableBeanFactory() - .createBean(object.getClass()); - return (T) newObject; - } catch (Exception e) { - throw new RuntimeException(e); + List pluginApplicationContexts = PluginInfoContainers.getPluginApplicationContexts(); + pluginApplicationContexts.add(parentApplicationContext); + Class aClass = object.getClass(); + for (GenericApplicationContext pluginApplicationContext : pluginApplicationContexts) { + try { + // 判断是否存在 + pluginApplicationContext.getBean(aClass); + Object newBean = pluginApplicationContext.getBeanFactory() + .createBean(aClass); + return (T) newBean; + } catch (Exception e){ + // 忽略 + } } + return null; } @@ -152,16 +122,67 @@ public class DefaultPluginUser implements PluginUser{ return pluginManager.getExtensions(tClass); } + + private T getBean(String name, boolean haveParent){ + List pluginApplicationContexts = PluginInfoContainers.getPluginApplicationContexts(); + if(haveParent){ + pluginApplicationContexts.add(parentApplicationContext); + } + for (GenericApplicationContext pluginApplicationContext : pluginApplicationContexts) { + if(pluginApplicationContext.containsBean(name)){ + return (T) pluginApplicationContext.getBean(name); + } + } + return null; + } + + private T getBean(Class aClass, boolean haveParent) { + List pluginApplicationContexts = PluginInfoContainers.getPluginApplicationContexts(); + if(haveParent){ + pluginApplicationContexts.add(parentApplicationContext); + } + for (GenericApplicationContext pluginApplicationContext : pluginApplicationContexts) { + try { + T bean = pluginApplicationContext.getBean(aClass); + if(bean != null){ + return bean; + } + } catch (Exception e){ + // 忽略 + } + } + return null; + } + /** - * 是否是插件中的bean - * @param beanName bean名称 - * @return boolean + * 获取多个bean. + * @param aClass 接口或者抽象类类类型 + * @param type 1 获取主程序的, 2 获取插件中的, 3 获取所有的 + * @param 类类型 + * @return List */ - protected boolean isPluginBean(String beanName){ - if(beanName == null){ - return false; + private List getBeans(Class aClass, int type) { + List pluginApplicationContexts = new ArrayList<>(1); + + if(type == 1){ + pluginApplicationContexts.add(parentApplicationContext); + } else if(type == 2){ + pluginApplicationContexts.addAll(PluginInfoContainers.getPluginApplicationContexts()); + } else if(type == 3){ + pluginApplicationContexts.add(parentApplicationContext); + pluginApplicationContexts.addAll(PluginInfoContainers.getPluginApplicationContexts()); + } else { + return Collections.emptyList(); + } + + List result = new ArrayList<>(); + for (GenericApplicationContext pluginApplicationContext : pluginApplicationContexts) { + List pluginBeans = PluginBeanUtils.getPluginBeans(pluginApplicationContext, aClass); + if(!pluginBeans.isEmpty()){ + result.addAll(pluginBeans); + } } - return PluginInfoContainer.existRegisterBeanName(beanName); + return result; } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java index 1eb2e64..8adc50f 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java @@ -94,9 +94,11 @@ public interface PluginUser { * @param 实例泛型 * @return 新实例对象 */ + @Deprecated T generateNewInstance(T object); + /** * 使用场景: * 1. 在主程序定义接口(该接口需要继承 ExtensionPoint 接口)。 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java new file mode 100644 index 0000000..b9a4a23 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java @@ -0,0 +1,85 @@ +package com.gitee.starblues.realize; + +import com.gitee.starblues.integration.operator.module.PluginInfo; +import com.gitee.starblues.utils.PluginBeanUtils; +import org.pf4j.PluginDescriptor; +import org.pf4j.PluginWrapper; +import org.springframework.context.ApplicationContext; + +import java.util.List; + +/** + * 插件工具类 + * @author starBlues + * @version 1.0 + */ +public class PluginUtils { + + protected final ApplicationContext parentApplicationContext; + protected final ApplicationContext pluginApplicationContext; + protected final PluginDescriptor pluginDescriptor; + + public PluginUtils(ApplicationContext parentApplicationContext, + ApplicationContext pluginApplicationContext, + PluginDescriptor pluginDescriptor) { + this.parentApplicationContext = parentApplicationContext; + this.pluginApplicationContext = pluginApplicationContext; + this.pluginDescriptor = pluginDescriptor; + } + + /** + * 获取主程序的 ApplicationContext + * @return ApplicationContext + */ + public ApplicationContext getParentApplicationContext() { + return parentApplicationContext; + } + + /** + * 获取当前插件的 ApplicationContext + * @return ApplicationContext + */ + public ApplicationContext getPluginApplicationContext() { + return pluginApplicationContext; + } + + public PluginDescriptor getPluginDescriptor(){ + return pluginDescriptor; + } + + + /** + * 获取当前插件bean名称得到主程序中的bean + * @param name bean 名称 + * @param bean 类型 + * @return bean + */ + public T getParentBean(String name){ + Object bean = parentApplicationContext.getBean(name); + if(bean == null){ + return null; + } + return (T) bean; + } + + /** + * 通过当前插件bean类型得到主程序中的bean + * @param aClass bean 类型 + * @param bean 类型 + * @return bean + */ + public T getParentBean(Class aClass) { + return parentApplicationContext.getBean(aClass); + } + + /** + * 通过当前插件bean接口或者抽象类型得到主程序中的多个实现类型 + * @param aClass bean 类型 + * @param bean 类型 + * @return bean + */ + public List getParentBeans(Class aClass){ + return PluginBeanUtils.getPluginBeans(parentApplicationContext, aClass); + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginBeanUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginBeanUtils.java new file mode 100644 index 0000000..4dca938 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/PluginBeanUtils.java @@ -0,0 +1,43 @@ +package com.gitee.starblues.utils; + +import org.springframework.context.ApplicationContext; +import org.springframework.util.ClassUtils; + +import java.util.*; + +/** + * 插件bean工具类 + * @author starBlues + * @version 1.0 + */ +public class PluginBeanUtils { + + public static List getPluginBeans(ApplicationContext applicationContext, Class aClass) { + Map beansOfTypeMap = applicationContext.getBeansOfType(aClass); + if(beansOfTypeMap.isEmpty()){ + return Collections.emptyList(); + } + return new ArrayList<>(beansOfTypeMap.values()); + } + + /** + * 得到某个接口的实现对象 + * @param sourceObject 遍历的对象 + * @param interfaceClass 接口类类型 + * @return Object + */ + public static T getObjectByInterfaceClass(Set sourceObject, Class interfaceClass){ + if(sourceObject == null || sourceObject.isEmpty()){ + return null; + } + for (Object configSingletonObject : sourceObject) { + Set> allInterfacesForClassAsSet = ClassUtils + .getAllInterfacesAsSet(configSingletonObject); + if(allInterfacesForClassAsSet.contains(interfaceClass)){ + return (T) configSingletonObject; + } + } + return null; + } + +} -- Gitee From 0eadf0e4db8f644cbb58c2cd5a345e82b65903e6 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 22 Jan 2021 17:22:15 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E6=96=B0=E5=A2=9EConfiguration=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/rest/AppController.java | 11 ++++ .../mybatisplus/MybatisPlusProcessor.java | 3 -- .../annotation/ConfigDefinition.java | 9 +++- .../starblues/factory/SpringBeanRegister.java | 5 -- .../pipe/PluginPipeProcessorFactory.java | 12 ++--- .../pipe/bean/ConfigFileBeanRegistrar.java | 11 ++-- .../AbstractConfigurationParser.java | 1 - .../post/PluginPostProcessorFactory.java | 21 +++----- .../PluginConfigurationPostProcessor.java | 45 ---------------- .../post/bean/PluginInvokePostProcessor.java | 1 - .../PluginOneselfStartEventProcessor.java | 51 ++++++++++++------- 11 files changed, 69 insertions(+), 101 deletions(-) delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginConfigurationPostProcessor.java diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/rest/AppController.java b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/rest/AppController.java index 98905d0..89da14b 100644 --- a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/rest/AppController.java +++ b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/rest/AppController.java @@ -1,5 +1,7 @@ package com.mybatisplus.plugin.rest; +import com.mybatisplus.plugin.A; +import com.mybatisplus.plugin.MybatisPlusPlugin; import com.mybatisplus.plugin.entity.App; import com.mybatisplus.plugin.entity.PluginData; import com.mybatisplus.plugin.mapper.AppMapper; @@ -24,6 +26,9 @@ public class AppController { @Autowired private AppMapper appMapper; + @Autowired + private A a; + @GetMapping public List getAll(){ @@ -31,6 +36,12 @@ public class AppController { } + + @GetMapping("a") + public String getA(){ + return a.getName(); + } + @GetMapping("{version}") public List getAll(@PathVariable("version") Integer version){ return appMapper.getAppVersion(version); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java index 181fc7f..f55d4dc 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; -import com.gitee.starblues.extension.ExtensionConfigUtils; import com.gitee.starblues.extension.mybatis.MapperHandler; import com.gitee.starblues.extension.mybatis.PluginFollowCoreConfig; import com.gitee.starblues.extension.mybatis.PluginResourceFinder; @@ -28,8 +27,6 @@ import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; import org.springframework.core.type.AnnotationMetadata; -import java.util.Set; - /** * springboot-mybatis plus 处理者 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java index 1e2389c..3b6eceb 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java @@ -17,7 +17,14 @@ public @interface ConfigDefinition { * 插件中的配置文件的名称 * @return String */ - String value(); + @Deprecated + String value() default ""; + + /** + * 插件中的配置文件的名称 + * @return String + */ + String fileName() default ""; /** * 自定义 bean 名称 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 567c550..ed87493 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 @@ -1,19 +1,14 @@ package com.gitee.starblues.factory; import com.gitee.starblues.factory.process.pipe.bean.name.PluginAnnotationBeanNameGenerator; -import com.gitee.starblues.utils.PluginBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.beans.factory.support.GenericBeanDefinition; -import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import java.text.MessageFormat; -import java.util.Objects; import java.util.function.Consumer; /** 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 02835c4..04b4c2b 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 @@ -35,18 +35,12 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { // 以下顺序不能更改 // 插件资源加载者, 必须放在第一位 pluginPipeProcessors.add(new PluginResourceLoadFactory()); + // 插件类处理者 pluginPipeProcessors.add(new PluginClassProcess()); - pluginPipeProcessors.add(new PluginApplicationContextProcessor(applicationContext)); - // pluginPipeProcessors.add(new PluginApplicationContextProcessor()); - // OneselfListenerStopEventProcessor 触发停止事件 - // pluginPipeProcessors.add(new OneselfListenerStopEventProcessor()); - // 配置文件在所有bean中第一个初始化 - // pluginPipeProcessors.add(new ConfigFileBeanProcessor(applicationContext)); - // 接下来初始化插件中配置bean的初始化 - // pluginPipeProcessors.add(new ConfigBeanProcessor()); // 添加前置扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPreProcessorExtends()); - // pluginPipeProcessors.add(new BasicBeanProcessor()); + // 插件的ApplicationContext处理者 + pluginPipeProcessors.add(new PluginApplicationContextProcessor(applicationContext)); // 添加扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPipeProcessorExtends()); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java index c38c57d..1fcd624 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java @@ -69,7 +69,7 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { if(configDefinition == null){ return null; } - String fileName = getConfigFileName(configDefinition, aClass); + String fileName = getConfigFileName(configDefinition); Object parseObject = null; if(!StringUtils.isNullOrEmpty(fileName)){ PluginConfigDefinition pluginConfigDefinition = @@ -94,13 +94,16 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { /** * 根据项目运行环境模式来获取配置文件 * @param configDefinition 配置的注解 - * @param aClass 当前配置类 * @return 文件名称 */ - private String getConfigFileName(ConfigDefinition configDefinition, Class aClass){ + private String getConfigFileName(ConfigDefinition configDefinition){ + // TODO 后期移除 value String fileName = configDefinition.value(); if(StringUtils.isNullOrEmpty(fileName)){ - return fileName; + fileName = configDefinition.fileName(); + if(StringUtils.isNullOrEmpty(fileName)){ + return null; + } } String fileNamePrefix; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java index 53144b0..89065fa 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java @@ -5,7 +5,6 @@ import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.factory.process.pipe.loader.PluginResourceLoader; import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; import com.gitee.starblues.factory.process.pipe.loader.load.PluginConfigFileLoader; -import com.gitee.starblues.realize.BasePlugin; import org.springframework.core.io.Resource; import java.util.List; 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 229b9c4..20adf90 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 @@ -21,26 +21,21 @@ public class PluginPostProcessorFactory implements PluginPostProcessor { private final Logger LOGGER = LoggerFactory.getLogger(this.getClass()); private final List pluginPostProcessors = new ArrayList<>(); - private final ApplicationContext applicationContext; + private final ApplicationContext mainApplicationContext; - public PluginPostProcessorFactory(ApplicationContext applicationContext){ - this.applicationContext = applicationContext; + public PluginPostProcessorFactory(ApplicationContext mainApplicationContext){ + this.mainApplicationContext = mainApplicationContext; } @Override public void initialize() throws Exception{ - + // 以下顺序不能更改 + pluginPostProcessors.add(new PluginInvokePostProcessor(mainApplicationContext)); + pluginPostProcessors.add(new PluginControllerPostProcessor(mainApplicationContext)); + // 主要触发启动监听事件,因此在最后一个执行。配合 OneselfListenerStopEventProcessor 该类触发启动、停止事件。 + pluginPostProcessors.add(new PluginOneselfStartEventProcessor()); // 添加扩展 pluginPostProcessors.addAll(ExtensionInitializer.getPostProcessorExtends()); - // 以下顺序不能更改。 - // pluginPostProcessors.add(new PluginBeanRefreshProcessor()); - // pluginPostProcessors.add(new PluginConfigurationPostProcessor(applicationContext)); - // pluginPostProcessors.add(new PluginInvokePostProcessor(applicationContext)); - - pluginPostProcessors.add(new PluginControllerPostProcessor(applicationContext)); - // 主要触发启动监听事件,因此在最后一个执行。配合 OneselfListenerStopEventProcessor 该类触发启动、停止事件。 - pluginPostProcessors.add(new PluginOneselfStartEventProcessor(applicationContext)); - // 进行初始化 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 deleted file mode 100644 index 9ca231b..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginConfigurationPostProcessor.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gitee.starblues.factory.process.post.bean; - -import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.post.PluginPostProcessor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.ConfigurationClassPostProcessor; -import org.springframework.context.support.GenericApplicationContext; - -import java.util.List; -import java.util.Objects; - -/** - * 插件中Configuration处理者 - * - * @author starBlues - * @version 2.1.0 - */ -@Deprecated -public class PluginConfigurationPostProcessor implements PluginPostProcessor { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); -; - - public PluginConfigurationPostProcessor(){ - } - - - @Override - public void initialize() throws Exception { - - } - - @Override - public void registry(List pluginRegistryInfos) throws Exception { - - } - - @Override - public void unRegistry(List pluginRegistryInfos) throws Exception { - - } - -} 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 90497bd..b90855b 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 @@ -12,7 +12,6 @@ import com.gitee.starblues.utils.AopUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.util.ClassUtils; 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 index 1b790df..4c860b5 100644 --- 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 @@ -17,6 +17,7 @@ import org.springframework.context.support.GenericApplicationContext; import java.util.List; import java.util.Objects; +import java.util.function.Consumer; /** * 插件中 OneselfListener 监听者处理者。主要执行监听器的启动事件。 @@ -28,12 +29,8 @@ 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(); + public PluginOneselfStartEventProcessor(){ } @@ -44,37 +41,53 @@ public class PluginOneselfStartEventProcessor implements PluginPostProcessor { @Override public void registry(List pluginRegistryInfos) throws Exception { + notify(pluginRegistryInfos, (oneselfListener, basePlugin) -> { + try { + oneselfListener.startEvent(basePlugin); + } catch (Exception e){ + log.error("OneselfListener {} execute startEvent exception. {}", + oneselfListener.getClass().getName(), e.getMessage(), e); + } + }); + } + + + @Override + public void unRegistry(List pluginRegistryInfos) { + notify(pluginRegistryInfos, (oneselfListener, basePlugin) -> { + try { + oneselfListener.stopEvent(basePlugin); + } catch (Exception e){ + log.error("OneselfListener {} execute stopEvent exception. {}", + oneselfListener.getClass().getName(), e.getMessage(), e); + } + }); + } + + private void notify(List pluginRegistryInfos, NotifyConsumer consumer){ for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { - AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); try { BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); - String pluginId = basePlugin.getWrapper().getPluginId(); GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); List oneselfListeners = PluginBeanUtils.getPluginBeans(pluginApplicationContext, OneselfListener.class); oneselfListeners.stream() .filter(oneselfListener -> oneselfListener != null) .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); - } + consumer.notify(oneselfListener, basePlugin); }); - } finally { - AopUtils.recoverAop(); + } catch (Exception e){ + e.printStackTrace(); } } } + @FunctionalInterface + private interface NotifyConsumer{ + void notify(OneselfListener oneselfListener, BasePlugin basePlugin); - @Override - public void unRegistry(List pluginRegistryInfos) { - // 此处不卸载调用。 } - } -- Gitee From 5cf194ddbbd91e7cc529b35a7f32b6bc25ca082e Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 22 Jan 2021 20:16:18 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/mybatis/MapperHandler.java | 17 +- .../extension/mybatis/MybatisProcessor.java | 41 +-- .../mybatis/PluginFollowCoreConfig.java | 24 +- .../mybatis/SpringBootMybatisExtension.java | 23 +- .../mybatisplus/MybatisPlusProcessor.java | 20 +- .../mybatis/tkmyabtis/TkMybatisProcessor.java | 47 +-- .../PluginResourceResolverProcess.java | 18 +- .../resources/StaticResourceExtension.java | 12 +- .../thymeleaf/ThymeleafProcessor.java | 23 +- .../gitee/starblues/annotation/Caller.java | 6 + .../extension/AbstractExtension.java | 23 +- .../extension/ExtensionConfigUtils.java | 45 --- .../starblues/factory/PluginRegistryInfo.java | 46 ++- .../starblues/factory/SpringBeanRegister.java | 22 +- .../PluginApplicationContextProcessor.java | 24 +- .../process/pipe/PluginInfoContainers.java | 16 +- .../process/pipe/bean/BasicBeanRegistrar.java | 31 +- .../pipe/bean/ConfigBeanRegistrar.java | 13 - .../pipe/bean/ConfigFileBeanRegistrar.java | 16 +- .../pipe/bean/InvokeBeanRegistrar.java | 301 +++++++++++++++++ .../bean/OneselfListenerBeanRegistrar.java | 33 -- .../pipe/bean/PluginBeanRegistrar.java | 13 +- .../pipe/classs/PluginClassProcess.java | 1 - .../pipe/classs/group/ComponentGroup.java | 3 +- .../pipe/classs/group/ConfigurationGroup.java | 36 -- .../bean/PluginControllerPostProcessor.java | 11 +- .../post/bean/PluginInvokePostProcessor.java | 309 +----------------- .../PluginOneselfStartEventProcessor.java | 73 ++--- .../application/DefaultPluginApplication.java | 2 +- .../operator/PluginOperatorWrapper.java | 37 ++- 30 files changed, 543 insertions(+), 743 deletions(-) delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java delete mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java index 3405645..0f8e55f 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MapperHandler.java @@ -39,7 +39,7 @@ public class MapperHandler { private final ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver(); - public MapperHandler(ApplicationContext applicationContext) { + public MapperHandler() { } /** @@ -99,21 +99,6 @@ public class MapperHandler { definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); } - /** - * 公共卸载Mapper - * @param pluginRegistryInfo 插件信息 - * @throws Exception 卸载异常 - */ - public void unRegistryMapper(PluginRegistryInfo pluginRegistryInfo) throws Exception { - GenericApplicationContext applicationContext = pluginRegistryInfo.getPluginApplicationContext(); - Set beanNames = pluginRegistryInfo.getExtension(MAPPER_INTERFACE_NAMES); - if(beanNames == null){ - return; - } - for (String beanName : beanNames) { - applicationContext.removeBeanDefinition(beanName); - } - } @FunctionalInterface diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java index 3e6b5fb..e00e5ae 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java @@ -1,9 +1,8 @@ package com.gitee.starblues.extension.mybatis; -import com.gitee.starblues.extension.ExtensionConfigUtils; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; -import com.gitee.starblues.utils.OrderPriority; +import com.gitee.starblues.factory.process.pipe.bean.PluginBeanRegistrarExtend; +import com.gitee.starblues.utils.PluginBeanUtils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.DatabaseIdProvider; import org.apache.ibatis.plugin.Interceptor; @@ -12,11 +11,8 @@ import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; -import org.pf4j.ClassLoadingStrategy; -import org.pf4j.PluginWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; @@ -25,16 +21,11 @@ import org.springframework.core.io.Resource; * @author starBlues * @version 2.3 */ -public class MybatisProcessor implements PluginPipeProcessorExtend { +public class MybatisProcessor implements PluginBeanRegistrarExtend { private static final Logger LOGGER = LoggerFactory.getLogger(MybatisProcessor.class); - private final GenericApplicationContext applicationContext; - private final MapperHandler mapperHandler; - - public MybatisProcessor(ApplicationContext applicationContext) { - this.applicationContext = (GenericApplicationContext) applicationContext; - this.mapperHandler = new MapperHandler(this.applicationContext); + public MybatisProcessor() { } @Override @@ -42,21 +33,10 @@ public class MybatisProcessor implements PluginPipeProcessorExtend { return "MybatisProcessor"; } - @Override - public OrderPriority order() { - return OrderPriority.getHighPriority(); - } - - @Override - public void initialize() throws Exception { - - } - @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - - SpringBootMybatisConfig config = ExtensionConfigUtils.getConfig(applicationContext, pluginWrapper.getPluginId(), + SpringBootMybatisConfig config = PluginBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), SpringBootMybatisConfig.class); if(config == null){ return; @@ -67,7 +47,8 @@ public class MybatisProcessor implements PluginPipeProcessorExtend { if(config.enableOneselfConfig()){ config.oneselfConfig(factory); } else { - PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig(applicationContext); + GenericApplicationContext mainApplicationContext = pluginRegistryInfo.getMainApplicationContext(); + PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig(mainApplicationContext); factory.setDataSource(followCoreConfig.getDataSource()); Configuration configuration = followCoreConfig.getConfiguration(SpringBootMybatisExtension.Type.MYBATIS); factory.setConfiguration(configuration); @@ -106,6 +87,7 @@ public class MybatisProcessor implements PluginPipeProcessorExtend { throw new Exception("Get mybatis sqlSessionFactory is null"); } SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory); + MapperHandler mapperHandler = new MapperHandler(); mapperHandler.processMapper(pluginRegistryInfo, (holder, mapperClass) -> { mapperHandler.commonProcessMapper(holder, mapperClass, sqlSessionFactory, sqlSessionTemplate); }); @@ -115,10 +97,5 @@ public class MybatisProcessor implements PluginPipeProcessorExtend { } - @Override - public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - mapperHandler.unRegistryMapper(pluginRegistryInfo); - } - } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginFollowCoreConfig.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginFollowCoreConfig.java index 455257c..97cc067 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginFollowCoreConfig.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginFollowCoreConfig.java @@ -22,22 +22,22 @@ import java.util.*; */ public class PluginFollowCoreConfig { - private final ApplicationContext applicationContext; + private final ApplicationContext mainApplicationContext; - public PluginFollowCoreConfig(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; + public PluginFollowCoreConfig(ApplicationContext mainApplicationContext) { + this.mainApplicationContext = mainApplicationContext; } public DataSource getDataSource(){ - return applicationContext.getBean(DataSource.class); + return mainApplicationContext.getBean(DataSource.class); } public Configuration getConfiguration(SpringBootMybatisExtension.Type type){ Configuration configuration = new Configuration(); if(type == SpringBootMybatisExtension.Type.MYBATIS){ try { - Map customizerMap = applicationContext.getBeansOfType(ConfigurationCustomizer.class); + Map customizerMap = mainApplicationContext.getBeansOfType(ConfigurationCustomizer.class); if(!customizerMap.isEmpty()){ for (ConfigurationCustomizer customizer : customizerMap.values()) { customizer.customize(configuration); @@ -54,7 +54,7 @@ public class PluginFollowCoreConfig { MybatisConfiguration configuration = new MybatisConfiguration(); try { Map customizerMap = - applicationContext.getBeansOfType(com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer.class); + mainApplicationContext.getBeansOfType(com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer.class); if(!customizerMap.isEmpty()){ for (com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer customizer : customizerMap.values()) { customizer.customize(configuration); @@ -69,7 +69,7 @@ public class PluginFollowCoreConfig { public Interceptor[] getInterceptor(){ Map, Interceptor> interceptorMap = new HashMap<>(); try { - SqlSessionFactory sqlSessionFactory = applicationContext.getBean(SqlSessionFactory.class); + SqlSessionFactory sqlSessionFactory = mainApplicationContext.getBean(SqlSessionFactory.class); // 先从 SqlSessionFactory 工厂中获取拦截器 List interceptors = sqlSessionFactory.getConfiguration().getInterceptors(); if(interceptors != null){ @@ -84,7 +84,7 @@ public class PluginFollowCoreConfig { // ignore } // 再从定义Bean中获取拦截器 - Map beanInterceptorMap = applicationContext.getBeansOfType(Interceptor.class); + Map beanInterceptorMap = mainApplicationContext.getBeansOfType(Interceptor.class); if(!beanInterceptorMap.isEmpty()){ beanInterceptorMap.forEach((k, v)->{ // 如果Class一致, 则会覆盖 @@ -99,9 +99,9 @@ public class PluginFollowCoreConfig { } public DatabaseIdProvider getDatabaseIdProvider(){ - String[] beanNamesForType = applicationContext.getBeanNamesForType(DatabaseIdProvider.class, false, false); + String[] beanNamesForType = mainApplicationContext.getBeanNamesForType(DatabaseIdProvider.class, false, false); if(beanNamesForType.length > 0){ - return applicationContext.getBean(DatabaseIdProvider.class); + return mainApplicationContext.getBean(DatabaseIdProvider.class); } return null; } @@ -110,7 +110,7 @@ public class PluginFollowCoreConfig { public LanguageDriver[] getLanguageDriver(){ Map, LanguageDriver> languageDriverMap = new HashMap<>(); try { - SqlSessionFactory sqlSessionFactory = applicationContext.getBean(SqlSessionFactory.class); + SqlSessionFactory sqlSessionFactory = mainApplicationContext.getBean(SqlSessionFactory.class); LanguageDriverRegistry languageRegistry = sqlSessionFactory.getConfiguration() .getLanguageRegistry(); // 先从 SqlSessionFactory 工厂中获取LanguageDriver @@ -128,7 +128,7 @@ public class PluginFollowCoreConfig { } catch (Exception e){ // ignore } - Map beansLanguageDriver = applicationContext.getBeansOfType(LanguageDriver.class); + Map beansLanguageDriver = mainApplicationContext.getBeansOfType(LanguageDriver.class); if(!beansLanguageDriver.isEmpty()){ beansLanguageDriver.forEach((k, v)->{ // 如果Class一致, 则会覆盖 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 ee1afb4..acaba4b 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 @@ -43,11 +43,11 @@ public class SpringBootMybatisExtension extends AbstractExtension { } @Override - public void initialize(ApplicationContext applicationContext) throws Exception { + public void initialize(ApplicationContext mainApplicationContext) throws Exception { } @Override - public List getPluginClassGroup(ApplicationContext applicationContext) { + public List getPluginClassGroup(ApplicationContext mainApplicationContext) { final List pluginClassGroups = new ArrayList<>(); pluginClassGroups.add(new MybatisConfigGroup()); pluginClassGroups.add(new PluginEntityAliasesGroup()); @@ -56,23 +56,16 @@ public class SpringBootMybatisExtension extends AbstractExtension { } @Override - public List getPluginPipeProcessor(ApplicationContext applicationContext) { - final List pluginPipeProcessorExtends = new ArrayList<>(); + public List getPluginBeanRegistrar(ApplicationContext mainApplicationContext) { + final List pluginBeanRegistrarExtends = new ArrayList<>(3); if(type == Type.MYBATIS_PLUS){ - + pluginBeanRegistrarExtends.add(new MybatisPlusProcessor()); } else if(type == Type.TK_MYBATIS){ - pluginPipeProcessorExtends.add(new TkMybatisProcessor(applicationContext)); + pluginBeanRegistrarExtends.add(new TkMybatisProcessor()); } else { - pluginPipeProcessorExtends.add(new MybatisProcessor(applicationContext)); + pluginBeanRegistrarExtends.add(new MybatisProcessor()); } - return pluginPipeProcessorExtends; - } - - @Override - public List getPluginBeanRegistrar(ApplicationContext applicationContext) { - final List pluginPipeProcessorExtends = new ArrayList<>(); - pluginPipeProcessorExtends.add(new MybatisPlusProcessor(applicationContext)); - return pluginPipeProcessorExtends; + return pluginBeanRegistrarExtends; } public enum Type{ diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java index f55d4dc..9b399a8 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java @@ -20,12 +20,8 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; -import org.springframework.core.type.AnnotationMetadata; /** @@ -33,14 +29,12 @@ import org.springframework.core.type.AnnotationMetadata; * @author starBlues * @version 2.3 */ -public class MybatisPlusProcessor implements PluginBeanRegistrarExtend, ImportBeanDefinitionRegistrar { +public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { private static final Logger LOGGER = LoggerFactory.getLogger(MybatisPlusProcessor.class); - private final MapperHandler mapperHandler; - public MybatisPlusProcessor(ApplicationContext applicationContext) { - this.mapperHandler = new MapperHandler(applicationContext); + public MybatisPlusProcessor() { } @Override @@ -48,10 +42,6 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend, ImportBe return "MybatisPlusProcessor"; } - @Override - public void initialize() throws Exception { - - } @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { @@ -106,6 +96,7 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend, ImportBe throw new Exception("Get mybatis-plus sqlSessionFactory is null"); } SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory); + MapperHandler mapperHandler = new MapperHandler(); mapperHandler.processMapper(pluginRegistryInfo, (holder, mapperClass) -> { mapperHandler.commonProcessMapper(holder, mapperClass, sqlSessionFactory, sqlSessionTemplate); }); @@ -148,9 +139,4 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend, ImportBe factory.setGlobalConfig(globalConfig); } - - @Override - public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { - - } } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java index 8f2689e..cfbe72e 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java @@ -1,27 +1,23 @@ package com.gitee.starblues.extension.mybatis.tkmyabtis; -import com.gitee.starblues.extension.ExtensionConfigUtils; import com.gitee.starblues.extension.mybatis.MapperHandler; import com.gitee.starblues.extension.mybatis.PluginFollowCoreConfig; import com.gitee.starblues.extension.mybatis.PluginResourceFinder; import com.gitee.starblues.extension.mybatis.SpringBootMybatisExtension; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; -import com.gitee.starblues.utils.OrderPriority; +import com.gitee.starblues.factory.process.pipe.bean.PluginBeanRegistrarExtend; +import com.gitee.starblues.utils.PluginBeanUtils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.DatabaseIdProvider; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; -import org.pf4j.ClassLoadingStrategy; -import org.pf4j.PluginWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.GenericBeanDefinition; -import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; import tk.mybatis.mapper.entity.Config; @@ -33,17 +29,13 @@ import tk.mybatis.spring.mapper.MapperFactoryBean; * @author starBlues * @version 2.3 */ -public class TkMybatisProcessor implements PluginPipeProcessorExtend { +public class TkMybatisProcessor implements PluginBeanRegistrarExtend { private static final Logger LOGGER = LoggerFactory.getLogger(TkMybatisProcessor.class); - private final GenericApplicationContext applicationContext; - private final MapperHandler mapperHandler; private final MapperFactoryBean mapperFactoryBean = new MapperFactoryBean(); - public TkMybatisProcessor(ApplicationContext applicationContext) { - this.applicationContext = (GenericApplicationContext) applicationContext; - this.mapperHandler = new MapperHandler(this.applicationContext); + public TkMybatisProcessor() { } @Override @@ -51,22 +43,11 @@ public class TkMybatisProcessor implements PluginPipeProcessorExtend { return "TkMybatisProcessor"; } - @Override - public OrderPriority order() { - return OrderPriority.getHighPriority(); - } - - @Override - public void initialize() throws Exception { - - } @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - - SpringBootTkMybatisConfig config = ExtensionConfigUtils.getConfig(applicationContext, - pluginWrapper.getPluginId(), + SpringBootTkMybatisConfig config = PluginBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), SpringBootTkMybatisConfig.class); if(config == null){ return; @@ -80,7 +61,8 @@ public class TkMybatisProcessor implements PluginPipeProcessorExtend { tkConfig = new Config(); config.oneselfConfig(tkConfig); } else { - PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig(applicationContext); + GenericApplicationContext mainApplicationContext = pluginRegistryInfo.getMainApplicationContext(); + PluginFollowCoreConfig followCoreConfig = new PluginFollowCoreConfig(mainApplicationContext); factory.setDataSource(followCoreConfig.getDataSource()); factory.setConfiguration(followCoreConfig.getConfiguration(SpringBootMybatisExtension.Type.TK_MYBATIS)); Interceptor[] interceptor = followCoreConfig.getInterceptor(); @@ -91,9 +73,9 @@ public class TkMybatisProcessor implements PluginPipeProcessorExtend { if(databaseIdProvider != null){ factory.setDatabaseIdProvider(databaseIdProvider); } - if(applicationContext.getBeanNamesForType(Config.class, + if(mainApplicationContext.getBeanNamesForType(Config.class, false, false).length > 0){ - tkConfig = applicationContext.getBean(Config.class); + tkConfig = mainApplicationContext.getBean(Config.class); } } @@ -126,10 +108,9 @@ public class TkMybatisProcessor implements PluginPipeProcessorExtend { SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory); // 用于解决Tk中MsUtil的ClassLoader的问题 Thread.currentThread().setContextClassLoader(pluginClassLoader); + MapperHandler mapperHandler = new MapperHandler(); mapperHandler.processMapper(pluginRegistryInfo, (holder, mapperClass) -> { processMapper(holder, mapperClass, mapperHelper, sqlSessionFactory, sqlSessionTemplate); - // tk需要立即生成创建Mapper - applicationContext.getBean(mapperClass); }); } finally { Resources.setDefaultClassLoader(defaultClassLoader); @@ -162,10 +143,4 @@ public class TkMybatisProcessor implements PluginPipeProcessorExtend { } - @Override - public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - mapperHandler.unRegistryMapper(pluginRegistryInfo); - } - - } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java index 8b0d093..5700e03 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/PluginResourceResolverProcess.java @@ -1,13 +1,12 @@ package com.gitee.starblues.extension.resources; -import com.gitee.starblues.extension.ExtensionConfigUtils; 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 com.gitee.starblues.utils.PluginBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import java.util.List; @@ -22,10 +21,8 @@ public class PluginResourceResolverProcess implements PluginPostProcessorExtend private static final Logger LOGGER = LoggerFactory.getLogger(PluginResourceResolverProcess.class); private static final String KEY = "PluginResourceResolverProcess"; - private final ApplicationContext applicationContext; - PluginResourceResolverProcess(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; + PluginResourceResolverProcess() { } @Override @@ -51,9 +48,13 @@ public class PluginResourceResolverProcess implements PluginPostProcessorExtend } String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); try { - StaticResourceConfig staticResourceConfig = ExtensionConfigUtils.getConfig( - applicationContext, pluginId, StaticResourceConfig.class); - PluginResourceResolver.parse(pluginRegistryInfo, staticResourceConfig); + StaticResourceConfig config = PluginBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), + StaticResourceConfig.class); + if(config == null){ + return; + } + PluginResourceResolver.parse(pluginRegistryInfo, config); } catch (Exception e){ LOGGER.error("Parse plugin '{}' static resource failure.", pluginId, e); } @@ -70,7 +71,6 @@ public class PluginResourceResolverProcess implements PluginPostProcessorExtend pluginRegistryInfo.getPluginWrapper().getPluginId(), e); } - } } } 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 4747c7c..64512ff 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 @@ -43,26 +43,26 @@ public class StaticResourceExtension extends AbstractExtension { } @Override - public void initialize(ApplicationContext applicationContext) throws Exception{ + public void initialize(ApplicationContext mainApplicationContext) throws Exception{ WebMvcConfigurer webMvcConfigurer = new ResourceWebMvcConfigurer(); List webMvcConfigurers = new ArrayList<>(); webMvcConfigurers.add(webMvcConfigurer); DelegatingWebMvcConfiguration support = - applicationContext.getBean(DelegatingWebMvcConfiguration.class); + mainApplicationContext.getBean(DelegatingWebMvcConfiguration.class); support.setConfigurers(webMvcConfigurers); } @Override - public List getPluginPipeProcessor(ApplicationContext applicationContext) { + public List getPluginPipeProcessor(ApplicationContext mainApplicationContext) { final List pluginPipeProcessorExtends = new ArrayList<>(); - pluginPipeProcessorExtends.add(new ThymeleafProcessor(applicationContext)); + pluginPipeProcessorExtends.add(new ThymeleafProcessor()); return pluginPipeProcessorExtends; } @Override - public List getPluginPostProcessor(ApplicationContext applicationContext) { + public List getPluginPostProcessor(ApplicationContext mainApplicationContext) { final List pluginPostProcessorExtends = new ArrayList<>(); - pluginPostProcessorExtends.add(new PluginResourceResolverProcess(applicationContext)); + pluginPostProcessorExtends.add(new PluginResourceResolverProcess()); return pluginPostProcessorExtends; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java index a27ea9c..e857deb 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/thymeleaf/ThymeleafProcessor.java @@ -1,12 +1,12 @@ package com.gitee.starblues.extension.resources.thymeleaf; -import com.gitee.starblues.extension.ExtensionConfigUtils; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; import com.gitee.starblues.utils.OrderPriority; +import com.gitee.starblues.utils.PluginBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; +import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.thymeleaf.spring5.SpringTemplateEngine; @@ -26,10 +26,7 @@ public class ThymeleafProcessor implements PluginPipeProcessorExtend { private static final String TEMPLATE_RESOLVER_BEAN = "ClassLoaderTemplateResolver"; private static final Logger LOGGER = LoggerFactory.getLogger(ThymeleafProcessor.class); - private final ApplicationContext applicationContext; - - public ThymeleafProcessor(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; + public ThymeleafProcessor() { } @Override @@ -49,14 +46,13 @@ public class ThymeleafProcessor implements PluginPipeProcessorExtend { @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - - SpringTemplateEngine springTemplateEngine = getSpringTemplateEngine(); + SpringTemplateEngine springTemplateEngine = getSpringTemplateEngine(pluginRegistryInfo); if(springTemplateEngine == null){ return; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - SpringBootThymeleafConfig config = ExtensionConfigUtils.getConfig(applicationContext, - pluginId, SpringBootThymeleafConfig.class); + SpringBootThymeleafConfig config = PluginBeanUtils.getObjectByInterfaceClass( + pluginRegistryInfo.getConfigSingletons(), + SpringBootThymeleafConfig.class); if(config == null){ return; } @@ -114,7 +110,7 @@ public class ThymeleafProcessor implements PluginPipeProcessorExtend { return; } try { - SpringTemplateEngine springTemplateEngine = getSpringTemplateEngine(); + SpringTemplateEngine springTemplateEngine = getSpringTemplateEngine(pluginRegistryInfo); Set templateResolvers = getITemplateResolvers(springTemplateEngine); if(templateResolvers != null){ templateResolvers.remove(resolver); @@ -125,7 +121,8 @@ public class ThymeleafProcessor implements PluginPipeProcessorExtend { } } - private SpringTemplateEngine getSpringTemplateEngine(){ + private SpringTemplateEngine getSpringTemplateEngine(PluginRegistryInfo pluginRegistryInfo){ + GenericApplicationContext applicationContext = pluginRegistryInfo.getMainApplicationContext(); String[] beanNamesForType = applicationContext.getBeanNamesForType(SpringTemplateEngine.class, false, false); if(beanNamesForType.length == 0){ diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java index 7ac0f9d..be34fb6 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java @@ -20,6 +20,12 @@ public @interface Caller { */ String value(); + /** + * 可指定调用哪一个插件 + * @return 插件id + */ + String pluginId(); + /** * 调用者方法注解。配合 @Supper.Method 使用。如果不定义, 则以方法名称为准。 */ 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 6a34812..170afdf 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 @@ -35,10 +35,10 @@ public abstract class AbstractExtension { /** * 该扩展初始化的操作 * 主要是在插件初始化阶段被调用 - * @param applicationContext applicationContext + * @param mainApplicationContext 主程序ApplicationContext * @throws Exception 初始化异常 */ - public void initialize(ApplicationContext applicationContext) throws Exception{ + public void initialize(ApplicationContext mainApplicationContext) throws Exception{ } @@ -54,20 +54,20 @@ public abstract class AbstractExtension { /** * 返回扩展的插件中的类分组器。 * 该扩展主要是对插件中的Class文件分组,然后供 PluginPipeProcessor、PluginPostProcessor 阶段使用。 - * @param applicationContext 主程序ApplicationContext + * @param mainApplicationContext 主程序ApplicationContext * @return List PluginPipeProcessorExtend */ - public List getPluginClassGroup(ApplicationContext applicationContext){ + public List getPluginClassGroup(ApplicationContext mainApplicationContext){ return null; } /** * 返回扩展的插件前置处理者。 * 该扩展主要是对每一个插件进行处理 - * @param applicationContext 主程序ApplicationContext + * @param mainApplicationContext 主程序ApplicationContext * @return List PluginPipeProcessorExtend */ - public List getPluginPreProcessor(ApplicationContext applicationContext){ + public List getPluginPreProcessor(ApplicationContext mainApplicationContext){ return null; } @@ -75,9 +75,10 @@ public abstract class AbstractExtension { /** * 返回扩展的bean定义注册者扩展 * 该扩展主要是对每一个插件进行处理 + * @param mainApplicationContext 主程序ApplicationContext * @return List PluginPipeProcessorExtend */ - public List getPluginBeanRegistrar(ApplicationContext applicationContext){ + public List getPluginBeanRegistrar(ApplicationContext mainApplicationContext){ return null; } @@ -86,20 +87,20 @@ public abstract class AbstractExtension { /** * 返回扩展的流插件处理者。 * 该扩展主要是对每一个插件进行处理 - * @param applicationContext 主程序ApplicationContext + * @param mainApplicationContext 主程序ApplicationContext * @return List PluginPipeProcessorExtend */ - public List getPluginPipeProcessor(ApplicationContext applicationContext){ + public List getPluginPipeProcessor(ApplicationContext mainApplicationContext){ return null; } /** * 返回扩展的插件后置处理者。 * 该扩展主要是对全部插件进行处理。 - * @param applicationContext 主程序ApplicationContext + * @param mainApplicationContext 主程序ApplicationContext * @return List PluginPostProcessorExtend */ - public List getPluginPostProcessor(ApplicationContext applicationContext){ + public List getPluginPostProcessor(ApplicationContext mainApplicationContext){ return null; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java deleted file mode 100644 index c9d5d7d..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/ExtensionConfigUtils.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gitee.starblues.extension; - -import org.pf4j.util.StringUtils; -import org.springframework.context.ApplicationContext; - - -/** - * 扩展配置文件工具 - * @author starBlues - * @version 2.4.0 - */ -public class ExtensionConfigUtils { - - private ExtensionConfigUtils(){} - - /** - * 得到扩展的配置 - * @param applicationContext ApplicationContext - * @param pluginId 插件id - * @param tClass 配置类 - * @param 配置类的类型 - * @return 配置类的Spring容器对象 - */ - public static T getConfig(ApplicationContext applicationContext, - String pluginId, - Class tClass){ - try { - String[] beanNamesForType = applicationContext.getBeanNamesForType(tClass, - false, false); - if(beanNamesForType.length == 0){ - return null; - } - for (String beanName : beanNamesForType) { - if(StringUtils.isNullOrEmpty(beanName)){ - continue; - } - return applicationContext.getBean(beanName, tClass); - } - return null; - } catch (Exception e){ - return null; - } - } - -} 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 a266d6b..1042dc2 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 @@ -5,6 +5,8 @@ import com.gitee.starblues.factory.process.pipe.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; import org.pf4j.*; import org.pf4j.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.ClassUtils; @@ -20,10 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public class PluginRegistryInfo { - /** - * 扩展存储项 - */ - private final Map extensionMap = new ConcurrentHashMap<>(); + private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final PluginWrapper pluginWrapper; private final PluginManager pluginManager; @@ -31,38 +30,47 @@ public class PluginRegistryInfo { private final AnnotationConfigApplicationContext pluginApplicationContext; private final SpringBeanRegister springBeanRegister; - /** * 是否跟随主程序启动而初始化 */ private final boolean followingInitial; private final BasePlugin basePlugin; + + /** + * 扩展存储项 + */ + private final Map extensionMap = new ConcurrentHashMap<>(); + /** * 插件中的配置单例bean */ - private final Set configSingletonObjects = new HashSet<>(2); + private final Set configSingletonObjects = new HashSet<>(4); + /** * 插件中的Class */ - private final List> classes = new ArrayList<>(); + private final List> classes = new ArrayList<>(8); + /** * 插件加载的资源 */ - private final Map pluginLoadResources = new ConcurrentHashMap<>(); + private final Map pluginLoadResources = new ConcurrentHashMap<>(8); + /** * 插件中分类的Class */ - private final Map>> groupClasses = new ConcurrentHashMap<>(); + private final Map>> groupClasses = new ConcurrentHashMap<>(8); + /** * 处理者信息 */ - private final Map processorInfo = new ConcurrentHashMap<>(); + private final Map processorInfo = new ConcurrentHashMap<>(8); /** * 自定义策略插件类加载器缓存 */ - private final Map pluginClassLoaders = new ConcurrentHashMap<>(); + private final Map pluginClassLoaders = new ConcurrentHashMap<>(8); private PluginRegistryInfo(PluginWrapper pluginWrapper, @@ -242,7 +250,7 @@ public class PluginRegistryInfo { * 得到当前插件的ApplicationContext * @return AnnotationConfigApplicationContext */ - public AnnotationConfigApplicationContext getPluginApplicationContext() { + public GenericApplicationContext getPluginApplicationContext() { return pluginApplicationContext; } @@ -333,8 +341,20 @@ public class PluginRegistryInfo { processorInfo.clear(); pluginClassLoaders.clear(); pluginLoadResources.clear(); + configSingletonObjects.clear(); + } catch (Exception e){ + logger.error("Clear plugin '{}' failure", getPluginWrapper().getPluginId(), e); + } finally { + PluginInfoContainers.removePluginApplicationContext(getPluginWrapper().getPluginId()); + closePluginApplicationContext(); + } + } + + private void closePluginApplicationContext() { + try { + pluginApplicationContext.close(); } catch (Exception e){ - e.printStackTrace(); + logger.error("Close plugin '{}' ApplicationContext failure", getPluginWrapper().getPluginId(), e); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/SpringBeanRegister.java index ed87493..bf94f7d 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 @@ -21,15 +21,15 @@ public class SpringBeanRegister { private static final Logger logger = LoggerFactory.getLogger(SpringBeanRegister.class); - private final GenericApplicationContext applicationContext; + private final GenericApplicationContext pluginApplicationContext; public SpringBeanRegister(GenericApplicationContext pluginApplicationContext){ - this.applicationContext = pluginApplicationContext; + this.pluginApplicationContext = pluginApplicationContext; } public boolean exist(String name){ - return applicationContext.containsBean(name); + return pluginApplicationContext.containsBean(name); } /** @@ -56,9 +56,9 @@ public class SpringBeanRegister { beanDefinition.setBeanClass(aClass); BeanNameGenerator beanNameGenerator = new PluginAnnotationBeanNameGenerator(pluginId); - String beanName = beanNameGenerator.generateBeanName(beanDefinition, applicationContext); + String beanName = beanNameGenerator.generateBeanName(beanDefinition, pluginApplicationContext); - if(applicationContext.containsBean(beanName)){ + if(pluginApplicationContext.containsBean(beanName)){ String error = MessageFormat.format("Bean name {0} already exist of {1}", beanName, aClass.getName()); logger.debug(error); @@ -67,7 +67,7 @@ public class SpringBeanRegister { if(consumer != null){ consumer.accept(beanDefinition); } - applicationContext.registerBeanDefinition(beanName, beanDefinition); + pluginApplicationContext.registerBeanDefinition(beanName, beanDefinition); return beanName; } @@ -94,7 +94,7 @@ public class SpringBeanRegister { Consumer consumer) { AnnotatedGenericBeanDefinition beanDefinition = new AnnotatedGenericBeanDefinition(aClass); - if(applicationContext.containsBean(beanName)){ + if(pluginApplicationContext.containsBean(beanName)){ String error = MessageFormat.format("Bean name {0} already exist of {1}", beanName, aClass.getName()); throw new RuntimeException(error); @@ -102,7 +102,7 @@ public class SpringBeanRegister { if(consumer != null){ consumer.accept(beanDefinition); } - applicationContext.registerBeanDefinition(beanName, beanDefinition); + pluginApplicationContext.registerBeanDefinition(beanName, beanDefinition); } /** @@ -111,7 +111,7 @@ public class SpringBeanRegister { * @param object 对象 */ public void registerSingleton(String name, Object object){ - DefaultListableBeanFactory listableBeanFactory = applicationContext.getDefaultListableBeanFactory(); + DefaultListableBeanFactory listableBeanFactory = pluginApplicationContext.getDefaultListableBeanFactory(); if(!listableBeanFactory.containsSingleton(name)){ listableBeanFactory.registerSingleton(name, object); } @@ -123,7 +123,7 @@ public class SpringBeanRegister { * @param name 单例名称 */ public void destroySingleton(String name){ - DefaultListableBeanFactory listableBeanFactory = applicationContext.getDefaultListableBeanFactory(); + DefaultListableBeanFactory listableBeanFactory = pluginApplicationContext.getDefaultListableBeanFactory(); if(listableBeanFactory.containsSingleton(name)){ listableBeanFactory.destroySingleton(name); } @@ -136,7 +136,7 @@ public class SpringBeanRegister { */ public void unregister(String pluginId, String beanName){ try { - applicationContext.removeBeanDefinition(beanName); + pluginApplicationContext.removeBeanDefinition(beanName); } catch (Exception e){ logger.error("Remove plugin '{}' bean {} error. {}", pluginId, beanName, e.getMessage()); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java index ce23f0a..c12cefd 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java @@ -31,40 +31,44 @@ public class PluginApplicationContextProcessor implements PluginPipeProcessor{ pluginBeanDefinitionRegistrars.add(new ConfigBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigFileBeanRegistrar(mainApplicationContext)); pluginBeanDefinitionRegistrars.add(new BasicBeanRegistrar()); - pluginBeanDefinitionRegistrars.add(new OneselfListenerBeanRegistrar()); pluginBeanDefinitionRegistrars.addAll(ExtensionInitializer.getPluginBeanRegistrarExtends()); } @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - AnnotationConfigApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); pluginApplicationContext.getDefaultListableBeanFactory().registerSingleton("p", pluginApplicationContext); // 进行bean注册 for (PluginBeanRegistrar pluginBeanDefinitionRegistrar : pluginBeanDefinitionRegistrars) { pluginBeanDefinitionRegistrar.registry(pluginRegistryInfo); } + addBeanExtend(pluginRegistryInfo); pluginApplicationContext.refresh(); - buildPluginApplicationContext(pluginRegistryInfo); + // 向插件静态容器中新增插件的ApplicationContext + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + PluginInfoContainers.addPluginApplicationContext(pluginId, pluginApplicationContext); } @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - PluginInfoContainers.removePluginApplicationContext(pluginRegistryInfo.getPluginWrapper().getPluginId()); + for (PluginBeanRegistrar pluginBeanDefinitionRegistrar : pluginBeanDefinitionRegistrars) { + pluginBeanDefinitionRegistrar.unRegistry(pluginRegistryInfo); + } } - private void buildPluginApplicationContext(PluginRegistryInfo pluginRegistryInfo){ + /** + * 向插件ApplicationContext容器中添加扩展的bean + * @param pluginRegistryInfo 插件注册信息 + */ + private void addBeanExtend(PluginRegistryInfo pluginRegistryInfo){ GenericApplicationContext parentApplicationContext = pluginRegistryInfo.getMainApplicationContext(); - AnnotationConfigApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); - + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); PluginUtils pluginUtils = new PluginUtils(parentApplicationContext, pluginApplicationContext, pluginRegistryInfo.getPluginWrapper().getDescriptor()); parentApplicationContext.getBeanFactory().registerSingleton( pluginUtils.getClass().getName(), pluginUtils); - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - PluginInfoContainers.addPluginApplicationContext(pluginId, pluginApplicationContext); } - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java index 2609a99..81fea36 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginInfoContainers.java @@ -12,20 +12,21 @@ import java.util.concurrent.ConcurrentHashMap; */ public class PluginInfoContainers { - private final static Map pluginApplicationContexts = + private final static Map PLUGIN_APPLICATION_CONTEXTS = new ConcurrentHashMap<>(); - static void addPluginApplicationContext(String pluginId, GenericApplicationContext applicationContext){ - pluginApplicationContexts.put(pluginId, applicationContext); + + public static void addPluginApplicationContext(String pluginId, GenericApplicationContext applicationContext){ + PLUGIN_APPLICATION_CONTEXTS.put(pluginId, applicationContext); } - static void removePluginApplicationContext(String pluginId){ - pluginApplicationContexts.remove(pluginId); + public static void removePluginApplicationContext(String pluginId){ + PLUGIN_APPLICATION_CONTEXTS.remove(pluginId); } static public GenericApplicationContext getPluginApplicationContext(String pluginId) { - GenericApplicationContext applicationContext = pluginApplicationContexts.get(pluginId); + GenericApplicationContext applicationContext = PLUGIN_APPLICATION_CONTEXTS.get(pluginId); if(applicationContext == null){ return null; } @@ -33,11 +34,12 @@ public class PluginInfoContainers { } static public List getPluginApplicationContexts() { - Collection values = pluginApplicationContexts.values(); + Collection values = PLUGIN_APPLICATION_CONTEXTS.values(); if(values.isEmpty()){ return Collections.emptyList(); } return new ArrayList<>(values); } + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java index 16f90a0..69077fb 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/BasicBeanRegistrar.java @@ -3,15 +3,11 @@ package com.gitee.starblues.factory.process.pipe.bean; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.SpringBeanRegister; import com.gitee.starblues.factory.process.pipe.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 java.util.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * 基础bean注册 * @@ -20,45 +16,31 @@ import org.slf4j.LoggerFactory; */ public class BasicBeanRegistrar implements PluginBeanRegistrar { - private static final Logger LOGGER = LoggerFactory.getLogger(BasicBeanRegistrar.class); - - private static final String KEY = "BasicBeanProcessor"; public BasicBeanRegistrar(){ } - @Override - public void initialize() throws Exception { - - } - @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - Set beanNames = new HashSet<>(); List> springComponents = pluginRegistryInfo .getGroupClasses(ComponentGroup.GROUP_ID); - List> springConfigurations = pluginRegistryInfo - .getGroupClasses(ConfigurationGroup.GROUP_ID); List> springRepository = pluginRegistryInfo .getGroupClasses(RepositoryGroup.GROUP_ID); - List> oneselfListener = pluginRegistryInfo.getGroupClasses(OneselfListenerGroup.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); + register(pluginRegistryInfo, springComponents); + register(pluginRegistryInfo, springRepository); + register(pluginRegistryInfo, oneselfListener); } /** * 往Spring注册bean * @param pluginRegistryInfo 插件注册的信息 * @param classes 要注册的类集合 - * @param beanNames 存储bean名称集合 */ private void register(PluginRegistryInfo pluginRegistryInfo, - List> classes, - Set beanNames){ + List> classes){ if(classes == null || classes.isEmpty()){ return; } @@ -69,7 +51,6 @@ public class BasicBeanRegistrar implements PluginBeanRegistrar { continue; } String beanName = springBeanRegister.register(pluginId, aClass); - beanNames.add(beanName); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java index c76c6b1..0f33c7e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java @@ -4,8 +4,6 @@ import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.SpringBeanRegister; import com.gitee.starblues.factory.process.pipe.classs.group.ConfigBeanGroup; import com.gitee.starblues.realize.ConfigBean; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.*; @@ -18,20 +16,9 @@ import java.util.*; */ public class ConfigBeanRegistrar implements PluginBeanRegistrar { - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - private static final String KEY = "ConfigBeanProcessor"; - - public ConfigBeanRegistrar() { } - - @Override - public void initialize() throws Exception { - - } - @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { List> configBeans = diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java index 1fcd624..f6cee2a 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigFileBeanRegistrar.java @@ -12,9 +12,7 @@ import org.pf4j.RuntimeMode; import org.pf4j.util.StringUtils; import org.springframework.context.ApplicationContext; -import java.util.HashSet; import java.util.List; -import java.util.Set; /** * 插件中配置文件 bean 的处理者。包括配置文件 @@ -23,8 +21,6 @@ import java.util.Set; */ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { - private static final String KEY = "ConfigFileBeanProcessor"; - private final ConfigurationParser configurationParser; private final IntegrationConfiguration integrationConfiguration; @@ -35,11 +31,6 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { } - @Override - public void initialize() throws Exception { - - } - @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { List> configDefinitions = @@ -47,14 +38,9 @@ public class ConfigFileBeanRegistrar implements PluginBeanRegistrar { if(configDefinitions == null || configDefinitions.isEmpty()){ return; } - Set beanNames = new HashSet<>(); for (Class aClass : configDefinitions) { - String beanName = registry(pluginRegistryInfo, aClass); - if(!StringUtils.isNullOrEmpty(beanName)){ - beanNames.add(beanName); - } + registry(pluginRegistryInfo, aClass); } - pluginRegistryInfo.addProcessorInfo(KEY, beanNames); } /** diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java new file mode 100644 index 0000000..417afe0 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java @@ -0,0 +1,301 @@ +package com.gitee.starblues.factory.process.pipe.bean; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gitee.starblues.annotation.Caller; +import com.gitee.starblues.annotation.Supplier; +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.SpringBeanRegister; +import com.gitee.starblues.factory.process.pipe.PluginInfoContainers; +import com.gitee.starblues.factory.process.pipe.classs.group.CallerGroup; +import com.gitee.starblues.factory.process.pipe.classs.group.SupplierGroup; +import com.gitee.starblues.factory.process.post.bean.PluginInvokePostProcessor; +import org.pf4j.util.StringUtils; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.util.ClassUtils; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.text.MessageFormat; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 插件互相调用的bean注册者 + * @author starBlues + * @version 2.4.0 + */ +public class InvokeBeanRegistrar implements PluginBeanRegistrar{ + + private final static Map> PLUGIN_SUPPER_MAP = new ConcurrentHashMap<>(4); + + public static final String SUPPLIER_KEY = "Invoke_Supplier"; + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + registrySupper(pluginRegistryInfo); + registryCall(pluginRegistryInfo); + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + PLUGIN_SUPPER_MAP.remove(pluginRegistryInfo.getPluginWrapper().getPluginId()); + } + + /** + * 处理被调用者 + * @param pluginRegistryInfo 插件注册的信息 + * @throws Exception 处理异常 + */ + private void registrySupper(PluginRegistryInfo pluginRegistryInfo) throws Exception { + List> supperClasses = pluginRegistryInfo.getGroupClasses(SupplierGroup.GROUP_ID); + if(supperClasses.isEmpty()){ + return; + } + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); + Set beanNames = new HashSet<>(supperClasses.size()); + for (Class supperClass : supperClasses) { + if(supperClass == null){ + continue; + } + Supplier supplier = supperClass.getAnnotation(Supplier.class); + if(supplier == null){ + continue; + } + String beanName = supplier.value(); + if(springBeanRegister.exist(beanName)){ + String error = MessageFormat.format( + "Plugin {0} : Bean @Supplier name {1} already exist of {2}", + pluginRegistryInfo.getPluginWrapper().getPluginId(), beanName, supperClass.getName()); + throw new Exception(error); + } + springBeanRegister.registerOfSpecifyName(pluginId, beanName, supperClass); + beanNames.add(beanName); + } + pluginRegistryInfo.addExtension(SUPPLIER_KEY, beanNames); + } + + + private void registryCall(PluginRegistryInfo pluginRegistryInfo) { + List> callerClasses = pluginRegistryInfo.getGroupClasses(CallerGroup.GROUP_ID); + if(callerClasses == null || callerClasses.isEmpty()){ + return; + } + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); + SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); + for (Class callerClass : callerClasses) { + Caller caller = callerClass.getAnnotation(Caller.class); + if(caller == null){ + continue; + } + springBeanRegister.register(pluginId, callerClass, (beanDefinition) ->{ + beanDefinition.getPropertyValues().add("callerInterface", callerClass); + beanDefinition.getPropertyValues().add("callerAnnotation", caller); + beanDefinition.setBeanClass(CallerInterfaceFactory.class); + beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE); + }); + } + + } + + public static void addSupper(String pluginId, String name, Object o){ + Map superMap = PLUGIN_SUPPER_MAP.computeIfAbsent(pluginId, k -> new HashMap<>(4)); + superMap.put(name, o); + } + + public static Object getSupper(String name){ + for (Map superMap : PLUGIN_SUPPER_MAP.values()) { + Object o = superMap.get(name); + if(o != null){ + return o; + } + } + return null; + } + + public static Object getSupper(String pluginId, String name){ + Map superMap = PLUGIN_SUPPER_MAP.get(pluginId); + if(superMap == null || superMap.isEmpty()){ + return null; + } + return superMap.get(name); + } + + + /** + * 调用者的接口工厂 + * @param 接口泛型 + */ + private static class CallerInterfaceFactory implements FactoryBean { + + private Class callerInterface; + private Caller callerAnnotation; + + @Override + public T getObject() throws Exception { + String pluginId = callerAnnotation.pluginId(); + Object supperObject = null; + if(StringUtils.isNullOrEmpty(pluginId)){ + supperObject = getSupper(callerAnnotation.value()); + } else { + supperObject = getSupper(pluginId, callerAnnotation.value()); + } + if(supperObject == null){ + if(StringUtils.isNullOrEmpty(pluginId)){ + throw new Exception("Not found Supper '" + callerAnnotation.value() + "'"); + } else { + throw new Exception("Not found Supper '" + callerAnnotation.value() + "' in plugin '" + pluginId + "'"); + } + } + ClassLoader classLoader = callerInterface.getClassLoader(); + Class[] interfaces = new Class[]{callerInterface}; + + ProxyHandler proxy = new ProxyHandler(supperObject); + return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy); + } + + @Override + public Class getObjectType() { + return callerInterface; + } + + @Override + public boolean isSingleton() { + return true; + } + + public Class getCallerInterface() { + return callerInterface; + } + + public void setCallerInterface(Class callerInterface) { + this.callerInterface = callerInterface; + } + + public Caller getCallerAnnotation() { + return callerAnnotation; + } + + public void setCallerAnnotation(Caller callerAnnotation) { + this.callerAnnotation = callerAnnotation; + } + } + + + + /** + * 代理类 + */ + private static class ProxyHandler implements InvocationHandler { + + private final Object supplier; + private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private ProxyHandler(Object supplier) { + this.supplier = supplier; + } + + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + + Caller.Method callerMethod = method.getAnnotation(Caller.Method.class); + if(callerMethod == null){ + return notAnnotationInvoke(method, args); + } else { + return annotationInvoke(method, callerMethod, args); + } + } + + /** + * 有注解的调用 + * @param method 调用接口的方法 + * @param callerMethod 调用者方法注解 + * @param args 传入参数 + * @return 返回值 + * @throws Throwable 异常 + */ + private Object annotationInvoke(Method method, Caller.Method callerMethod, Object[] args) throws Throwable{ + String callerMethodName = callerMethod.value(); + Class aClass = supplier.getClass(); + Method[] methods = aClass.getMethods(); + Method supplierMethod = null; + for (Method m : methods) { + Supplier.Method supplierMethodAnnotation = m.getAnnotation(Supplier.Method.class); + if(supplierMethodAnnotation == null){ + continue; + } + if(Objects.equals(supplierMethodAnnotation.value(), callerMethodName)){ + supplierMethod = m; + break; + } + } + if(supplierMethod == null){ + // 如果为空, 说明没有找到被调用者的注解, 则走没有注解的代理调用。 + return notAnnotationInvoke(method, args); + } + Class[] parameterTypes = supplierMethod.getParameterTypes(); + if(parameterTypes.length != args.length){ + // 参数不匹配 + return notAnnotationInvoke(method, args); + } + Object[] supplierArgs = new Object[args.length]; + for (int i = 0; i < parameterTypes.length; i++) { + Class parameterType = parameterTypes[i]; + Object arg = args[i]; + if(parameterType == arg.getClass()){ + supplierArgs[i] = arg; + } else { + // 类型不匹配, 尝试使用json序列化 + String json = OBJECT_MAPPER.writeValueAsString(arg); + Object serializeObject = OBJECT_MAPPER.readValue(json, parameterType); + supplierArgs[i] = serializeObject; + } + } + Object invokeReturn = supplierMethod.invoke(supplier, supplierArgs); + return getReturnObject(invokeReturn, method); + } + + /** + * 没有注解调用 + * @param method 调用接口的方法 + * @param args 传入参数 + * @return 返回值 + * @throws Throwable 异常 + */ + private Object notAnnotationInvoke(Method method, Object[] args) throws Throwable{ + String name = method.getName(); + Class[] argClasses = new Class[args.length]; + for (int i = 0; i < args.length; i++) { + argClasses[i] = args[i].getClass(); + } + Method supplierMethod = supplier.getClass().getMethod(name, argClasses); + Object invokeReturn = supplierMethod.invoke(supplier, args); + return getReturnObject(invokeReturn, method); + } + + + /** + * 得到返回值对象 + * @param invokeReturn 反射调用后返回的对象 + * @param method 调用接口的方法 + * @return 返回值对象 + * @throws Throwable Throwable + */ + private Object getReturnObject(Object invokeReturn, Method method) throws Throwable{ + if(invokeReturn == null){ + return null; + } + Class returnType = method.getReturnType(); + if(ClassUtils.isAssignable(invokeReturn.getClass(),returnType)){ + return invokeReturn; + } else { + String json = OBJECT_MAPPER.writeValueAsString(invokeReturn); + return OBJECT_MAPPER.readValue(json, OBJECT_MAPPER.getTypeFactory().constructType(method.getGenericReturnType()) ); + } + } + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java deleted file mode 100644 index 3e6d424..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/OneselfListenerBeanRegistrar.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gitee.starblues.factory.process.pipe.bean; - -import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.post.bean.PluginOneselfStartEventProcessor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * 执行插件自监听器的停止事件的处理者。必须在所有处理者中第一个执行。否则会导致所依赖的bean被卸载。 - * - * @see PluginOneselfStartEventProcessor 触发启动事件 - * @author starBlues - * @version 2.4.0 - */ -public class OneselfListenerBeanRegistrar implements PluginBeanRegistrar { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - - public OneselfListenerBeanRegistrar(){ - } - - - @Override - public void initialize() throws Exception {} - - @Override - public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - - } - - -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java index 8eb8698..8168c17 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/PluginBeanRegistrar.java @@ -1,6 +1,7 @@ package com.gitee.starblues.factory.process.pipe.bean; import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.factory.process.pipe.PluginInfoContainers; /** * @author starBlues @@ -8,12 +9,6 @@ import com.gitee.starblues.factory.PluginRegistryInfo; */ public interface PluginBeanRegistrar { - /** - * 初始化 - * @throws Exception 初始化异常 - */ - void initialize() throws Exception; - /** * 处理该插件的注册 @@ -21,5 +16,11 @@ public interface PluginBeanRegistrar { */ void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception; + /** + * 处理该插件的卸载 + * @param pluginRegistryInfo 插件注册的信息 + * @throws Exception 处理异常 + */ + default void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception{} } 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 497ec7a..d85adcc 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 @@ -47,7 +47,6 @@ public class PluginClassProcess implements PluginPipeProcessor { pluginClassGroups.add(new ComponentGroup()); pluginClassGroups.add(new ControllerGroup()); pluginClassGroups.add(new RepositoryGroup()); - pluginClassGroups.add(new ConfigurationGroup()); pluginClassGroups.add(new ConfigDefinitionGroup()); pluginClassGroups.add(new ConfigBeanGroup()); pluginClassGroups.add(new SupplierGroup()); 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 1356173..e6819ed 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 @@ -3,6 +3,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; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Service; @@ -50,7 +51,7 @@ public class ComponentGroup implements PluginClassGroup { @Override public boolean filter(Class aClass) { boolean have = AnnotationsUtils.haveAnnotations(aClass, false, Component.class, Service.class, - Controller.class, RestController.class); + Controller.class, RestController.class, Configuration.class); if(!have){ return false; } 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 deleted file mode 100644 index fc53fb7..0000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/classs/group/ConfigurationGroup.java +++ /dev/null @@ -1,36 +0,0 @@ -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; - -/** - * 分组存在注解: @Configuration - * - * @author starBlues - * @version 2.1.0 - */ -public class ConfigurationGroup implements PluginClassGroup { - - /** - * spring @CONFIGURATION 注解bean - */ - public static final String GROUP_ID = "spring_configuration"; - - - @Override - public String groupId() { - return GROUP_ID; - } - - @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/post/bean/PluginControllerPostProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/post/bean/PluginControllerPostProcessor.java index 59edc09..4a12436 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 @@ -68,7 +68,6 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { } try { ControllerBeanWrapper controllerBeanWrapper = registry(pluginRegistryInfo, groupClass); - // process(1, pluginRegistryInfo.getPluginWrapper().getPluginId(), groupClass); controllerBeanWrappers.add(controllerBeanWrapper); } catch (Exception e){ pluginRegistryInfo.addProcessorInfo(getKey(pluginRegistryInfo), controllerBeanWrappers); @@ -94,15 +93,11 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { if(controllerBeanWrappers == null || controllerBeanWrappers.isEmpty()){ continue; } - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); for (ControllerBeanWrapper controllerBeanWrapper : controllerBeanWrappers) { if(controllerBeanWrapper == null){ continue; } - unregister(pluginId, controllerBeanWrapper); -// process(2, -// pluginRegistryInfo.getPluginWrapper().getPluginId(), -// controllerBeanWrapper.getBeanClass()); + unregister(controllerBeanWrapper); } } } @@ -147,10 +142,9 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { /** * 卸载具体的Controller操作 - * @param pluginId 插件id * @param controllerBeanWrapper controllerBean包装 */ - private void unregister(String pluginId, ControllerBeanWrapper controllerBeanWrapper) { + private void unregister(ControllerBeanWrapper controllerBeanWrapper) { Set requestMappingInfos = controllerBeanWrapper.getRequestMappingInfos(); if(requestMappingInfos != null && !requestMappingInfos.isEmpty()){ for (RequestMappingInfo requestMappingInfo : requestMappingInfos) { @@ -160,7 +154,6 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { } - /** * 得到往RegisterPluginInfo->processorInfo 保存的key * @param registerPluginInfo 注册的插件信息 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 b90855b..dd64f87 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 @@ -1,42 +1,27 @@ package com.gitee.starblues.factory.process.post.bean; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gitee.starblues.annotation.Caller; -import com.gitee.starblues.annotation.Supplier; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.SpringBeanRegister; -import com.gitee.starblues.factory.process.pipe.classs.group.CallerGroup; -import com.gitee.starblues.factory.process.pipe.classs.group.SupplierGroup; +import com.gitee.starblues.factory.process.pipe.bean.InvokeBeanRegistrar; import com.gitee.starblues.factory.process.post.PluginPostProcessor; -import com.gitee.starblues.utils.AopUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.FactoryBean; import org.springframework.context.ApplicationContext; -import org.springframework.util.ClassUtils; +import org.springframework.context.support.GenericApplicationContext; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.text.MessageFormat; -import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** - * 处理插件中类之间相互调用的的功能 + * 处理插件中类之间相互调用的的功能. 主要获取被调用者的对象, 然后存储到被调用者容器中 * * @author starBlues - * @version 2.1.0 + * @version 2.4.0 */ public class PluginInvokePostProcessor implements PluginPostProcessor { private final Logger log = LoggerFactory.getLogger(this.getClass()); - private final String KEY_SUPPERS = "PluginInvokePostProcessorSuppers"; - private final String KEY_CALLERS = "PluginInvokePostProcessorCallers"; - public PluginInvokePostProcessor(ApplicationContext applicationContext){ Objects.requireNonNull(applicationContext); } @@ -50,27 +35,21 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { @Override public void registry(List pluginRegistryInfos) throws Exception { for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { - AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); + String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); try { - List> suppers = pluginRegistryInfo.getGroupClasses(SupplierGroup.GROUP_ID); - if(suppers == null){ + Set supperBeanNames = pluginRegistryInfo.getExtension(InvokeBeanRegistrar.SUPPLIER_KEY); + if(supperBeanNames == null || supperBeanNames.isEmpty()){ continue; } - processSupper(pluginRegistryInfo, suppers); - } finally { - AopUtils.recoverAop(); - } - } - for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { - AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); - try { - List> callers = pluginRegistryInfo.getGroupClasses(CallerGroup.GROUP_ID); - if(callers == null){ - continue; + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + for (String supperBeanName : supperBeanNames) { + if(pluginApplicationContext.containsBean(supperBeanName)){ + Object bean = pluginApplicationContext.getBean(supperBeanName); + InvokeBeanRegistrar.addSupper(pluginId, supperBeanName, bean); + } } - processCaller(pluginRegistryInfo, callers); - } finally { - AopUtils.recoverAop(); + } catch (Exception e){ + log.error("Process plugin '{}' supper bean exception.", pluginId, e); } } } @@ -78,265 +57,9 @@ public class PluginInvokePostProcessor implements PluginPostProcessor { @Override public void unRegistry(List pluginRegistryInfos) throws Exception{ - for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { - Set supperNames = pluginRegistryInfo.getProcessorInfo(getKey(KEY_SUPPERS, pluginRegistryInfo)); - Set callerNames = pluginRegistryInfo.getProcessorInfo(getKey(KEY_CALLERS, pluginRegistryInfo)); - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - unregister(pluginId, supperNames); - unregister(pluginId, callerNames); - } - } - - /** - * 处理被调用者 - * @param pluginRegistryInfo 插件注册的信息 - * @param supperClasses 被调用者集合 - * @throws Exception 处理异常 - */ - private void processSupper(PluginRegistryInfo pluginRegistryInfo, - List> supperClasses) throws Exception { - if(supperClasses.isEmpty()){ - return; - } - Set beanNames = new HashSet<>(); - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - SpringBeanRegister springBeanRegister = pluginRegistryInfo.getSpringBeanRegister(); - for (Class supperClass : supperClasses) { - if(supperClass == null){ - continue; - } - Supplier supplier = supperClass.getAnnotation(Supplier.class); - if(supplier == null){ - continue; - } - String beanName = supplier.value(); - if(springBeanRegister.exist(beanName)){ - String error = MessageFormat.format( - "Plugin {0} : Bean @Supplier name {1} already exist of {2}", - pluginRegistryInfo.getPluginWrapper().getPluginId(), beanName, supperClass.getName()); - throw new Exception(error); - } - springBeanRegister.registerOfSpecifyName(pluginId, beanName, supperClass); - beanNames.add(beanName); - } - pluginRegistryInfo.addProcessorInfo(getKey(KEY_SUPPERS, pluginRegistryInfo), beanNames); - } - - /** - * 处理调用者 - * @param pluginRegistryInfo 插件注册的信息 - * @param callerClasses 调用者集合 - * @throws Exception 处理异常 - */ - private void processCaller(PluginRegistryInfo pluginRegistryInfo, List> callerClasses) throws Exception { - if(callerClasses == null || callerClasses.isEmpty()){ - return; - } - Set beanNames = new HashSet<>(); - String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); - for (Class callerClass : callerClasses) { - Caller caller = callerClass.getAnnotation(Caller.class); - if(caller == null){ - continue; - } -// Object supper = applicationContext.getBean(caller.value()); -// if(supper == null){ -// return; -// } -// String beanName = springBeanRegister.register(pluginId, callerClass, (beanDefinition) ->{ -// beanDefinition.getPropertyValues().add("callerInterface", callerClass); -// beanDefinition.getPropertyValues().add("supper", supper); -// beanDefinition.setBeanClass(CallerInterfaceFactory.class); -// beanDefinition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE); -// }); -// beanNames.add(beanName); - } - pluginRegistryInfo.addProcessorInfo(getKey(KEY_CALLERS, pluginRegistryInfo), beanNames); - } - - /** - * 得到往RegisterPluginInfo->processorInfo 保存的key - * @param key key前缀 - * @param pluginRegistryInfo 插件注册的信息 - * @return String - */ - private String getKey(String key, PluginRegistryInfo pluginRegistryInfo){ - return key + "_" + pluginRegistryInfo.getPluginWrapper().getPluginId(); + // 什么也不做 } - /** - * 通过beanName卸载 - * @param pluginId 插件id - * @param beanNames beanNames集合 - */ - private void unregister(String pluginId, Set beanNames){ - if(beanNames == null || beanNames.isEmpty()){ - return; - } - for (String beanName : beanNames) { - // springBeanRegister.unregister(pluginId, beanName); - } - } - - /** - * 代理类 - */ - private static class ProxyHandler implements InvocationHandler { - - private final Object supplier; - private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private ProxyHandler(Object supplier) { - this.supplier = supplier; - } - - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - - Caller.Method callerMethod = method.getAnnotation(Caller.Method.class); - if(callerMethod == null){ - return notAnnotationInvoke(method, args); - } else { - return annotationInvoke(method, callerMethod, args); - } - } - - /** - * 有注解的调用 - * @param method 调用接口的方法 - * @param callerMethod 调用者方法注解 - * @param args 传入参数 - * @return 返回值 - * @throws Throwable 异常 - */ - private Object annotationInvoke(Method method, Caller.Method callerMethod, Object[] args) throws Throwable{ - String callerMethodName = callerMethod.value(); - Class aClass = supplier.getClass(); - Method[] methods = aClass.getMethods(); - Method supplierMethod = null; - for (Method m : methods) { - Supplier.Method supplierMethodAnnotation = m.getAnnotation(Supplier.Method.class); - if(supplierMethodAnnotation == null){ - continue; - } - if(Objects.equals(supplierMethodAnnotation.value(), callerMethodName)){ - supplierMethod = m; - break; - } - } - if(supplierMethod == null){ - // 如果为空, 说明没有找到被调用者的注解, 则走没有注解的代理调用。 - return notAnnotationInvoke(method, args); - } - Class[] parameterTypes = supplierMethod.getParameterTypes(); - if(parameterTypes.length != args.length){ - // 参数不匹配 - return notAnnotationInvoke(method, args); - } - Object[] supplierArgs = new Object[args.length]; - for (int i = 0; i < parameterTypes.length; i++) { - Class parameterType = parameterTypes[i]; - Object arg = args[i]; - if(parameterType == arg.getClass()){ - supplierArgs[i] = arg; - } else { - // 类型不匹配, 尝试使用json序列化 - String json = OBJECT_MAPPER.writeValueAsString(arg); - Object serializeObject = OBJECT_MAPPER.readValue(json, parameterType); - supplierArgs[i] = serializeObject; - } - } - Object invokeReturn = supplierMethod.invoke(supplier, supplierArgs); - return getReturnObject(invokeReturn, method); - } - - /** - * 没有注解调用 - * @param method 调用接口的方法 - * @param args 传入参数 - * @return 返回值 - * @throws Throwable 异常 - */ - private Object notAnnotationInvoke(Method method, Object[] args) throws Throwable{ - String name = method.getName(); - Class[] argClasses = new Class[args.length]; - for (int i = 0; i < args.length; i++) { - argClasses[i] = args[i].getClass(); - } - Method supplierMethod = supplier.getClass().getMethod(name, argClasses); - Object invokeReturn = supplierMethod.invoke(supplier, args); - return getReturnObject(invokeReturn, method); - } - - - /** - * 得到返回值对象 - * @param invokeReturn 反射调用后返回的对象 - * @param method 调用接口的方法 - * @return 返回值对象 - * @throws Throwable Throwable - */ - private Object getReturnObject(Object invokeReturn, Method method) throws Throwable{ - if(invokeReturn == null){ - return null; - } - Class returnType = method.getReturnType(); - if(ClassUtils.isAssignable(invokeReturn.getClass(),returnType)){ - return invokeReturn; - } else { - String json = OBJECT_MAPPER.writeValueAsString(invokeReturn); - return OBJECT_MAPPER.readValue(json, OBJECT_MAPPER.getTypeFactory().constructType(method.getGenericReturnType()) ); - } - } - - - } - - /** - * 调用者的接口工厂 - * @param 接口泛型 - */ - private static class CallerInterfaceFactory implements FactoryBean { - - private Class callerInterface; - private Object supper; - - - @Override - public T getObject() throws Exception { - ClassLoader classLoader = callerInterface.getClassLoader(); - Class[] interfaces = new Class[]{callerInterface}; - ProxyHandler proxy = new ProxyHandler(supper); - return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy); - } - - @Override - public Class getObjectType() { - return callerInterface; - } - - - @Override - public boolean isSingleton() { - return true; - } - - public Class getCallerInterface() { - return callerInterface; - } - - public void setCallerInterface(Class callerInterface) { - this.callerInterface = callerInterface; - } - - public Object getSupper() { - return supper; - } - - public void setSupper(Object supper) { - this.supper = supper; - } - } } 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 index 4c860b5..0e89d6e 100644 --- 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 @@ -1,34 +1,27 @@ package com.gitee.starblues.factory.process.post.bean; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.process.pipe.bean.OneselfListenerBeanRegistrar; 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 com.gitee.starblues.utils.PluginBeanUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import java.util.ArrayList; import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; /** * 插件中 OneselfListener 监听者处理者。主要执行监听器的启动事件。 - * @see OneselfListenerBeanRegistrar 触发停止事件 * @author starBlues * @version 2.1.0 */ public class PluginOneselfStartEventProcessor implements PluginPostProcessor { private final Logger log = LoggerFactory.getLogger(this.getClass()); - + private final static String KEY = "OneselfListeners"; public PluginOneselfStartEventProcessor(){ } @@ -41,52 +34,52 @@ public class PluginOneselfStartEventProcessor implements PluginPostProcessor { @Override public void registry(List pluginRegistryInfos) throws Exception { - notify(pluginRegistryInfos, (oneselfListener, basePlugin) -> { - try { - oneselfListener.startEvent(basePlugin); - } catch (Exception e){ - log.error("OneselfListener {} execute startEvent exception. {}", - oneselfListener.getClass().getName(), e.getMessage(), e); - } - }); - } - - - @Override - public void unRegistry(List pluginRegistryInfos) { - notify(pluginRegistryInfos, (oneselfListener, basePlugin) -> { - try { - oneselfListener.stopEvent(basePlugin); - } catch (Exception e){ - log.error("OneselfListener {} execute stopEvent exception. {}", - oneselfListener.getClass().getName(), e.getMessage(), e); - } - }); - } - - private void notify(List pluginRegistryInfos, NotifyConsumer consumer){ for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { + BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); try { - BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); List oneselfListeners = PluginBeanUtils.getPluginBeans(pluginApplicationContext, OneselfListener.class); + List saveOneselfListeners = new ArrayList<>(oneselfListeners.size()); oneselfListeners.stream() .filter(oneselfListener -> oneselfListener != null) .sorted(CommonUtils.orderPriority(oneselfListener -> oneselfListener.order())) .forEach(oneselfListener -> { - consumer.notify(oneselfListener, basePlugin); + try { + oneselfListener.startEvent(basePlugin); + } catch (Exception e){ + log.error("OneselfListener {} execute stopEvent exception. {}", + oneselfListener.getClass().getName(), e.getMessage(), e); + } finally { + saveOneselfListeners.add(oneselfListener); + } }); + if(!saveOneselfListeners.isEmpty()){ + pluginRegistryInfo.addExtension(KEY, saveOneselfListeners); + } } catch (Exception e){ - e.printStackTrace(); + log.error("Plugin '{}' OneselfListener process exception.", basePlugin.getWrapper().getPluginId(), e); } } } - @FunctionalInterface - private interface NotifyConsumer{ - - void notify(OneselfListener oneselfListener, BasePlugin basePlugin); + @Override + public void unRegistry(List pluginRegistryInfos) { + for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { + BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); + List oneselfListeners = pluginRegistryInfo.getExtension(KEY); + if(oneselfListeners == null || oneselfListeners.isEmpty()){ + continue; + } + for (OneselfListener oneselfListener : oneselfListeners) { + 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/integration/application/DefaultPluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java index 26ec551..7814b7d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java @@ -91,7 +91,7 @@ public class DefaultPluginApplication extends AbstractPluginApplication { pluginManager, this.listenerFactory ); - return new PluginOperatorWrapper(pluginOperator, configuration, applicationContext); + return new PluginOperatorWrapper(pluginOperator, configuration); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperatorWrapper.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperatorWrapper.java index 31e7982..b141800 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperatorWrapper.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperatorWrapper.java @@ -1,15 +1,17 @@ package com.gitee.starblues.integration.operator; -import com.gitee.starblues.extension.ExtensionConfigUtils; +import com.gitee.starblues.factory.process.pipe.PluginInfoContainers; import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.integration.listener.PluginInitializerListener; import com.gitee.starblues.integration.operator.module.PluginInfo; +import com.gitee.starblues.realize.PluginUtils; import com.gitee.starblues.realize.UnRegistryValidator; +import com.gitee.starblues.utils.PluginBeanUtils; import org.pf4j.PluginWrapper; import org.pf4j.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; +import org.springframework.context.support.GenericApplicationContext; import org.springframework.web.multipart.MultipartFile; import java.nio.file.Path; @@ -28,14 +30,11 @@ public class PluginOperatorWrapper implements PluginOperator{ private final PluginOperator pluginOperator; private final IntegrationConfiguration integrationConfiguration; - private final ApplicationContext applicationContext; public PluginOperatorWrapper(PluginOperator pluginOperator, - IntegrationConfiguration integrationConfiguration, - ApplicationContext applicationContext) { + IntegrationConfiguration integrationConfiguration) { this.pluginOperator = pluginOperator; this.integrationConfiguration = integrationConfiguration; - this.applicationContext = applicationContext; } @Override @@ -184,20 +183,24 @@ public class PluginOperatorWrapper implements PluginOperator{ * @throws Exception 检查异常 */ private void checkIsUnRegistry(String pluginId) throws Exception{ - UnRegistryValidator unRegistryValidator = ExtensionConfigUtils - .getConfig(applicationContext, pluginId, UnRegistryValidator.class); - if(unRegistryValidator == null){ + GenericApplicationContext pluginApplicationContext = PluginInfoContainers.getPluginApplicationContext(pluginId); + if(pluginApplicationContext == null){ + log.error("Plugin '{}' Not found ApplicationContext. So cannot found and execute unRegistryValidator", + pluginId); return; } - UnRegistryValidator.Result result = unRegistryValidator.verify(); - if(result.isVerify()){ - return; - } - String message = result.getMessage(); - if(StringUtils.isNullOrEmpty(message)){ - message = "Plugin [" + pluginId + "] Stop or Uninstall be banned"; + List unRegistryValidators = PluginBeanUtils.getPluginBeans(pluginApplicationContext, UnRegistryValidator.class); + for (UnRegistryValidator unRegistryValidator : unRegistryValidators) { + UnRegistryValidator.Result result = unRegistryValidator.verify(); + if(result.isVerify()){ + return; + } + String message = result.getMessage(); + if(StringUtils.isNullOrEmpty(message)){ + message = "Plugin [" + pluginId + "] Stop or Uninstall be banned"; + } + throw new Exception(message); } - throw new Exception(message); } -- Gitee From a297727eebbba1debeaa4ba1f65e14bbfbe5e35e Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 22 Jan 2021 21:01:05 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E4=BA=92=E7=9B=B8=E8=B0=83=E7=94=A8=E7=9A=84=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/plugin2/rest/ProxyController.java | 2 + .../plugin2/service/CallerService.java | 2 +- .../gitee/starblues/annotation/Caller.java | 2 +- .../PluginApplicationContextProcessor.java | 3 +- .../pipe/bean/InvokeBeanRegistrar.java | 67 ++++++++++--------- 5 files changed, 43 insertions(+), 33 deletions(-) diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java index 078e3a2..cb269be 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java @@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.RestController; * @author starBlues * @version 1.0 */ +@RestController +@RequestMapping("/proxy") public class ProxyController { diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java index 34a30fd..b606d53 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java @@ -10,7 +10,7 @@ import com.gitee.starblues.annotation.Caller; * @author starBlues * @version 1.0 */ -@Caller("SupplierService") +@Caller(value = "SupplierService") public interface CallerService { PluginInfo getConfig(String key); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java index be34fb6..aeca1a2 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/Caller.java @@ -24,7 +24,7 @@ public @interface Caller { * 可指定调用哪一个插件 * @return 插件id */ - String pluginId(); + String pluginId() default ""; /** * 调用者方法注解。配合 @Supper.Method 使用。如果不定义, 则以方法名称为准。 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java index c12cefd..addd772 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java @@ -31,6 +31,7 @@ public class PluginApplicationContextProcessor implements PluginPipeProcessor{ pluginBeanDefinitionRegistrars.add(new ConfigBeanRegistrar()); pluginBeanDefinitionRegistrars.add(new ConfigFileBeanRegistrar(mainApplicationContext)); pluginBeanDefinitionRegistrars.add(new BasicBeanRegistrar()); + pluginBeanDefinitionRegistrars.add(new InvokeBeanRegistrar()); pluginBeanDefinitionRegistrars.addAll(ExtensionInitializer.getPluginBeanRegistrarExtends()); } @@ -67,7 +68,7 @@ public class PluginApplicationContextProcessor implements PluginPipeProcessor{ PluginUtils pluginUtils = new PluginUtils(parentApplicationContext, pluginApplicationContext, pluginRegistryInfo.getPluginWrapper().getDescriptor()); - parentApplicationContext.getBeanFactory().registerSingleton( + pluginApplicationContext.getBeanFactory().registerSingleton( pluginUtils.getClass().getName(), pluginUtils); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java index 417afe0..350b252 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java @@ -135,24 +135,9 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ @Override public T getObject() throws Exception { - String pluginId = callerAnnotation.pluginId(); - Object supperObject = null; - if(StringUtils.isNullOrEmpty(pluginId)){ - supperObject = getSupper(callerAnnotation.value()); - } else { - supperObject = getSupper(pluginId, callerAnnotation.value()); - } - if(supperObject == null){ - if(StringUtils.isNullOrEmpty(pluginId)){ - throw new Exception("Not found Supper '" + callerAnnotation.value() + "'"); - } else { - throw new Exception("Not found Supper '" + callerAnnotation.value() + "' in plugin '" + pluginId + "'"); - } - } ClassLoader classLoader = callerInterface.getClassLoader(); Class[] interfaces = new Class[]{callerInterface}; - - ProxyHandler proxy = new ProxyHandler(supperObject); + ProxyHandler proxy = new ProxyHandler(callerInterface, callerAnnotation); return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy); } @@ -190,22 +175,40 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ */ private static class ProxyHandler implements InvocationHandler { - private final Object supplier; + private final Class supplierClass; + private final Caller callerAnnotation; + private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private ProxyHandler(Object supplier) { - this.supplier = supplier; + private ProxyHandler(Class supplierClass, Caller callerAnnotation) { + this.supplierClass = supplierClass; + this.callerAnnotation = callerAnnotation; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object supplierObject = null; + String pluginId = callerAnnotation.pluginId(); + if(StringUtils.isNullOrEmpty(pluginId)){ + supplierObject = getSupper(callerAnnotation.value()); + } else { + supplierObject = getSupper(pluginId, callerAnnotation.value()); + } + if(supplierObject == null){ + if(StringUtils.isNullOrEmpty(pluginId)){ + throw new Exception("Not found '" + callerAnnotation.value() + "' supplier object"); + } else { + throw new Exception("Not found '" + callerAnnotation.value() + "' supplier object in plugin '" + + pluginId + "'"); + } + } Caller.Method callerMethod = method.getAnnotation(Caller.Method.class); if(callerMethod == null){ - return notAnnotationInvoke(method, args); + return notAnnotationInvoke(method, supplierObject, args); } else { - return annotationInvoke(method, callerMethod, args); + return annotationInvoke(method, callerMethod, supplierObject, args); } } @@ -213,14 +216,16 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ * 有注解的调用 * @param method 调用接口的方法 * @param callerMethod 调用者方法注解 + * @param supplierObject 调用者对象 * @param args 传入参数 * @return 返回值 * @throws Throwable 异常 */ - private Object annotationInvoke(Method method, Caller.Method callerMethod, Object[] args) throws Throwable{ + private Object annotationInvoke(Method method, Caller.Method callerMethod, + Object supplierObject, Object[] args) throws Throwable{ + String callerMethodName = callerMethod.value(); - Class aClass = supplier.getClass(); - Method[] methods = aClass.getMethods(); + Method[] methods = supplierClass.getMethods(); Method supplierMethod = null; for (Method m : methods) { Supplier.Method supplierMethodAnnotation = m.getAnnotation(Supplier.Method.class); @@ -234,12 +239,12 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ } if(supplierMethod == null){ // 如果为空, 说明没有找到被调用者的注解, 则走没有注解的代理调用。 - return notAnnotationInvoke(method, args); + return notAnnotationInvoke(method, supplierObject, args); } Class[] parameterTypes = supplierMethod.getParameterTypes(); if(parameterTypes.length != args.length){ // 参数不匹配 - return notAnnotationInvoke(method, args); + return notAnnotationInvoke(method, supplierObject, args); } Object[] supplierArgs = new Object[args.length]; for (int i = 0; i < parameterTypes.length; i++) { @@ -254,25 +259,27 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ supplierArgs[i] = serializeObject; } } - Object invokeReturn = supplierMethod.invoke(supplier, supplierArgs); + Object invokeReturn = supplierMethod.invoke(supplierObject, supplierArgs); return getReturnObject(invokeReturn, method); } /** * 没有注解调用 * @param method 调用接口的方法 + * @param supplierObject 提供者对象 * @param args 传入参数 * @return 返回值 * @throws Throwable 异常 */ - private Object notAnnotationInvoke(Method method, Object[] args) throws Throwable{ + private Object notAnnotationInvoke(Method method, Object supplierObject, Object[] args) throws Throwable{ String name = method.getName(); Class[] argClasses = new Class[args.length]; for (int i = 0; i < args.length; i++) { argClasses[i] = args[i].getClass(); } - Method supplierMethod = supplier.getClass().getMethod(name, argClasses); - Object invokeReturn = supplierMethod.invoke(supplier, args); + Method supplierMethod = supplierClass.getMethod(name, argClasses); + System.out.println(supplierObject); + Object invokeReturn = supplierMethod.invoke(supplierObject, args); return getReturnObject(invokeReturn, method); } -- Gitee From 659f5b191feeba62ded1c65e1ff2cebf2334ca35 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 22 Jan 2021 21:08:18 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E4=BA=92=E7=9B=B8=E8=B0=83=E7=94=A8=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../factory/process/pipe/bean/InvokeBeanRegistrar.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java index 350b252..b025370 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java @@ -137,7 +137,7 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ public T getObject() throws Exception { ClassLoader classLoader = callerInterface.getClassLoader(); Class[] interfaces = new Class[]{callerInterface}; - ProxyHandler proxy = new ProxyHandler(callerInterface, callerAnnotation); + ProxyHandler proxy = new ProxyHandler(callerAnnotation); return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy); } @@ -175,13 +175,11 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ */ private static class ProxyHandler implements InvocationHandler { - private final Class supplierClass; private final Caller callerAnnotation; private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private ProxyHandler(Class supplierClass, Caller callerAnnotation) { - this.supplierClass = supplierClass; + private ProxyHandler(Caller callerAnnotation) { this.callerAnnotation = callerAnnotation; } @@ -225,6 +223,7 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ Object supplierObject, Object[] args) throws Throwable{ String callerMethodName = callerMethod.value(); + Class supplierClass = supplierObject.getClass(); Method[] methods = supplierClass.getMethods(); Method supplierMethod = null; for (Method m : methods) { @@ -277,6 +276,7 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ for (int i = 0; i < args.length; i++) { argClasses[i] = args[i].getClass(); } + Class supplierClass = supplierObject.getClass(); Method supplierMethod = supplierClass.getMethod(name, argClasses); System.out.println(supplierObject); Object invokeReturn = supplierMethod.invoke(supplierObject, args); -- Gitee From bfb5c88a6fa018770db2cb5678f92137405234e4 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Fri, 22 Jan 2021 21:14:29 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E4=BB=A3=E7=90=86=E6=97=A0=E6=B3=95=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/basic/example/plugin1/service/SupplierService.java | 3 +++ .../com/basic/example/plugin2/rest/ProxyController.java | 5 +++++ .../com/basic/example/plugin2/service/CallerService.java | 2 ++ .../factory/process/pipe/bean/InvokeBeanRegistrar.java | 6 ++++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/SupplierService.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/SupplierService.java index a698a62..eb2c76e 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/SupplierService.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/SupplierService.java @@ -40,6 +40,9 @@ public class SupplierService { return key; } + public String notArg(){ + return "noArg"; + } public CommonReturn commonTest(String key, CommonParam commonParam){ System.out.println(commonParam); diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java index cb269be..3bf98de 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/rest/ProxyController.java @@ -28,6 +28,11 @@ public class ProxyController { } + @GetMapping("noArg") + public String noArg(){ + return callerService.notArg(); + } + @GetMapping("add") public Integer add(){ return callerService.add(1, 2); diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java index b606d53..1a156d9 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/service/CallerService.java @@ -22,6 +22,8 @@ public interface CallerService { CommonReturn commonTest(String key, CommonParam commonParam); + String notArg(); + class CallerInfo{ private String name; private PluginInfo pluginInfo; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java index b025370..d040e4e 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/InvokeBeanRegistrar.java @@ -203,6 +203,9 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ } Caller.Method callerMethod = method.getAnnotation(Caller.Method.class); + if(args == null){ + args = new Object[]{}; + } if(callerMethod == null){ return notAnnotationInvoke(method, supplierObject, args); } else { @@ -272,13 +275,12 @@ public class InvokeBeanRegistrar implements PluginBeanRegistrar{ */ private Object notAnnotationInvoke(Method method, Object supplierObject, Object[] args) throws Throwable{ String name = method.getName(); - Class[] argClasses = new Class[args.length]; + Class[] argClasses = new Class[args.length]; for (int i = 0; i < args.length; i++) { argClasses[i] = args[i].getClass(); } Class supplierClass = supplierObject.getClass(); Method supplierMethod = supplierClass.getMethod(name, argClasses); - System.out.println(supplierObject); Object invokeReturn = supplierMethod.invoke(supplierObject, args); return getReturnObject(invokeReturn, method); } -- Gitee From 443d051b5fa3e3175491dad79ffc3479eba5ff1e Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 11:39:48 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E6=97=A0=E6=B3=95=E5=85=B3=E9=97=AD=E7=9A=84?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/config/TkMybatisPlusConfig.java | 3 +- .../extension/mybatis/MybatisProcessor.java | 2 +- .../mybatis/PluginResourceFinder.java | 2 +- .../mybatisplus/MybatisPlusProcessor.java | 2 +- .../mybatis/tkmyabtis/TkMybatisProcessor.java | 2 +- .../PluginApplicationContextProcessor.java | 51 +++++++++++++++---- .../process/pipe/loader/PluginResource.java | 2 +- 7 files changed, 48 insertions(+), 16 deletions(-) diff --git a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/src/main/java/com/tkmybatis/plugin/config/TkMybatisPlusConfig.java b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/src/main/java/com/tkmybatis/plugin/config/TkMybatisPlusConfig.java index 838b0be..bf8b5ca 100644 --- a/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/src/main/java/com/tkmybatis/plugin/config/TkMybatisPlusConfig.java +++ b/example/integration-tkmybatis/plugins/integration-tkmybatis-plugin/src/main/java/com/tkmybatis/plugin/config/TkMybatisPlusConfig.java @@ -1,5 +1,6 @@ package com.tkmybatis.plugin.config; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.extension.mybatis.tkmyabtis.SpringBootTkMybatisConfig; import com.google.common.collect.Sets; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; @@ -14,7 +15,7 @@ import java.util.Set; * @version 1.0 * @since 2020-12-14 */ -@Component +@ConfigDefinition public class TkMybatisPlusConfig implements SpringBootTkMybatisConfig { @Override diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java index e00e5ae..cd522b0 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/MybatisProcessor.java @@ -81,7 +81,7 @@ public class MybatisProcessor implements PluginBeanRegistrarExtend { ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); try { - Resources.setDefaultClassLoader(pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PAD)); + Resources.setDefaultClassLoader(pluginRegistryInfo.getDefaultPluginClassLoader()); SqlSessionFactory sqlSessionFactory = factory.getObject(); if(sqlSessionFactory == null){ throw new Exception("Get mybatis sqlSessionFactory is null"); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java index 423fe0b..7dc23d2 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginResourceFinder.java @@ -37,7 +37,7 @@ public class PluginResourceFinder { public PluginResourceFinder(PluginRegistryInfo pluginRegistryInfo) { - this.classLoader = pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PAD); + this.classLoader = pluginRegistryInfo.getDefaultPluginClassLoader(); this.resourcePatternResolver = new PathMatchingResourcePatternResolver(classLoader);; } diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java index 9b399a8..012f7c2 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/mybatisplus/MybatisPlusProcessor.java @@ -90,7 +90,7 @@ public class MybatisPlusProcessor implements PluginBeanRegistrarExtend { } ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); try { - Resources.setDefaultClassLoader(pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PAD)); + Resources.setDefaultClassLoader(pluginRegistryInfo.getDefaultPluginClassLoader()); SqlSessionFactory sqlSessionFactory = factory.getObject(); if(sqlSessionFactory == null){ throw new Exception("Get mybatis-plus sqlSessionFactory is null"); diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java index cfbe72e..debfb08 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/tkmyabtis/TkMybatisProcessor.java @@ -96,7 +96,7 @@ public class TkMybatisProcessor implements PluginBeanRegistrarExtend { if(xmlResource != null && xmlResource.length > 0){ factory.setMapperLocations(xmlResource); } - ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PAD); + ClassLoader pluginClassLoader = pluginRegistryInfo.getDefaultPluginClassLoader(); ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); try { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java index addd772..2d8b51b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java @@ -4,12 +4,13 @@ import com.gitee.starblues.extension.ExtensionInitializer; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.bean.*; import com.gitee.starblues.realize.PluginUtils; +import org.pf4j.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericApplicationContext; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * 插件的ApplicationContext 处理 @@ -19,6 +20,8 @@ import java.util.List; */ public class PluginApplicationContextProcessor implements PluginPipeProcessor{ + private final static Logger logger = LoggerFactory.getLogger(PluginApplicationContextProcessor.class); + private final List pluginBeanDefinitionRegistrars = new ArrayList<>(); private final ApplicationContext mainApplicationContext; @@ -38,14 +41,19 @@ public class PluginApplicationContextProcessor implements PluginPipeProcessor{ @Override public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); - pluginApplicationContext.getDefaultListableBeanFactory().registerSingleton("p", - pluginApplicationContext); // 进行bean注册 for (PluginBeanRegistrar pluginBeanDefinitionRegistrar : pluginBeanDefinitionRegistrars) { pluginBeanDefinitionRegistrar.registry(pluginRegistryInfo); } addBeanExtend(pluginRegistryInfo); - pluginApplicationContext.refresh(); + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(pluginRegistryInfo.getDefaultPluginClassLoader()); + pluginApplicationContext.refresh(); + } finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } + // 向插件静态容器中新增插件的ApplicationContext String pluginId = pluginRegistryInfo.getPluginWrapper().getPluginId(); PluginInfoContainers.addPluginApplicationContext(pluginId, pluginApplicationContext); @@ -53,11 +61,19 @@ public class PluginApplicationContextProcessor implements PluginPipeProcessor{ @Override public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { - for (PluginBeanRegistrar pluginBeanDefinitionRegistrar : pluginBeanDefinitionRegistrars) { - pluginBeanDefinitionRegistrar.unRegistry(pluginRegistryInfo); + for (PluginBeanRegistrar registrar : pluginBeanDefinitionRegistrars) { + try { + registrar.unRegistry(pluginRegistryInfo); + } catch (Exception e){ + logger.error("Plugin '{}'-'{}' unRegistry failure.", + pluginRegistryInfo.getPluginWrapper().getPluginId(), + registrar.getClass().getName()); + } } + removeBeanExtend(pluginRegistryInfo); } + /** * 向插件ApplicationContext容器中添加扩展的bean * @param pluginRegistryInfo 插件注册信息 @@ -68,8 +84,23 @@ public class PluginApplicationContextProcessor implements PluginPipeProcessor{ PluginUtils pluginUtils = new PluginUtils(parentApplicationContext, pluginApplicationContext, pluginRegistryInfo.getPluginWrapper().getDescriptor()); - pluginApplicationContext.getBeanFactory().registerSingleton( - pluginUtils.getClass().getName(), pluginUtils); + String name = pluginUtils.getClass().getName(); + pluginApplicationContext.getBeanFactory().registerSingleton(name, pluginUtils); + pluginRegistryInfo.addExtension("PluginUtilsName", name); + } + + + /** + * 移除扩展绑定 + * @param pluginRegistryInfo 插件注册信息 + */ + private void removeBeanExtend(PluginRegistryInfo pluginRegistryInfo) { + String pluginUtilsName = pluginRegistryInfo.getExtension("PluginUtilsName"); + if(StringUtils.isNullOrEmpty(pluginUtilsName)){ + return; + } + GenericApplicationContext pluginApplicationContext = pluginRegistryInfo.getPluginApplicationContext(); + pluginApplicationContext.getDefaultListableBeanFactory().destroySingleton(pluginUtilsName); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java index 55e15cd..57adec8 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java @@ -48,7 +48,7 @@ public class PluginResource implements Resource { this.path = pathToUse; PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - this.classLoader = pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PAD); + this.classLoader = pluginRegistryInfo.getDefaultPluginClassLoader(); this.pluginWrapper = pluginWrapper; this.lastModified = pluginRegistryInfo.getBasePlugin().getBasePluginExtend().getStartTimestamp(); -- Gitee From 5609b54f6cfa9e35a968513fe77d6f3e5e749122 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 12:03:19 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E4=B8=8E=E4=B8=BB=E7=A8=8B=E5=BA=8F=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/example/plugin1/PluginListener1.java | 10 +++++++++- .../example/plugin1/rest/HelloPlugin1.java | 9 ++++++++- .../plugin1/service/ConsoleNameImpl.java | 5 ++++- .../resolver/PluginResourceResolver.java | 5 +++-- .../process/pipe/loader/PluginResource.java | 5 ++++- .../gitee/starblues/realize/PluginUtils.java | 18 +++++++++++------- 6 files changed, 39 insertions(+), 13 deletions(-) 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 index c613b21..477d149 100644 --- 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 @@ -1,8 +1,10 @@ package com.basic.example.plugin1; +import com.basic.example.main.config.PluginConfiguration; import com.basic.example.plugin1.service.HelloService; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.realize.PluginUtils; import com.gitee.starblues.utils.OrderPriority; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,9 +20,11 @@ public class PluginListener1 implements OneselfListener { private static final Logger logger = LoggerFactory.getLogger(PluginListener1.class); private final HelloService helloService; + private final PluginUtils pluginUtils; - public PluginListener1(HelloService helloService) { + public PluginListener1(HelloService helloService, PluginUtils pluginUtils) { this.helloService = helloService; + this.pluginUtils = pluginUtils; } @@ -31,12 +35,16 @@ public class PluginListener1 implements OneselfListener { @Override public void startEvent(BasePlugin basePlugin) { + PluginConfiguration mainBean = pluginUtils.getMainBean(PluginConfiguration.class); + System.out.println(mainBean); logger.info("PluginListener1 {} start. helloService : {} .", basePlugin.getWrapper().getPluginId(), helloService.sayService2()); } @Override public void stopEvent(BasePlugin basePlugin) { + PluginConfiguration mainBean = pluginUtils.getMainBean(PluginConfiguration.class); + System.out.println(mainBean); 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/rest/HelloPlugin1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java index ddc966f..9ed6eed 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java @@ -2,8 +2,10 @@ package com.basic.example.plugin1.rest; import com.basic.example.plugin1.config.PluginConfig1; import com.basic.example.plugin1.service.HelloService; +import com.gitee.starblues.realize.PluginUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.pf4j.PluginDescriptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,6 +28,8 @@ public class HelloPlugin1 { @Autowired private PluginConfig1 pluginConfig1; + @Autowired + private PluginUtils pluginUtils; @GetMapping("plugin1") @ApiOperation(value = "hello", notes = "hello") @@ -50,6 +54,9 @@ public class HelloPlugin1 { return helloService.sayService2(); } - + @GetMapping("pluginInfo") + public PluginDescriptor getPluginInfo(){ + return pluginUtils.getPluginDescriptor(); + } } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java index 94e808a..6e79ff4 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/ConsoleNameImpl.java @@ -2,6 +2,7 @@ package com.basic.example.plugin1.service; import com.basic.example.main.config.PluginConfiguration; import com.basic.example.main.plugin.ConsoleName; +import com.gitee.starblues.realize.PluginUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -11,13 +12,15 @@ import org.springframework.stereotype.Component; * @author starBlues * @version 1.0 */ +@Component public class ConsoleNameImpl implements ConsoleName { @Autowired - private PluginConfiguration pluginConfiguration; + private PluginUtils pluginUtils; @Override public String name() { + PluginConfiguration pluginConfiguration = pluginUtils.getMainBean(PluginConfiguration.class); return "My name is Plugin1" + "->pluginArgConfiguration :" + pluginConfiguration.toString(); } } 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 c879917..731df42 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/src/main/java/com/gitee/starblues/extension/resources/resolver/PluginResourceResolver.java @@ -100,10 +100,11 @@ public class PluginResourceResolver extends AbstractResourceResolver { return null; } - + ClassLoader pluginClassLoader = pluginRegistryInfo.getPluginClassLoader(PluginRegistryInfo.ClassLoaderStrategy.PDA); for (String classPath : classPaths) { try { - Resource resource = new PluginResource(classPath + partialPath, pluginRegistryInfo); + PluginResource resource = new PluginResource(classPath + partialPath, pluginRegistryInfo); + resource.setClassLoader(pluginClassLoader); if(resource.exists()){ return resource; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java index 57adec8..846daa3 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/loader/PluginResource.java @@ -28,7 +28,7 @@ public class PluginResource implements Resource { private final static Logger log = LoggerFactory.getLogger(PluginResource.class); - private final ClassLoader classLoader; + private ClassLoader classLoader; private final PluginWrapper pluginWrapper; private final long lastModified; @@ -54,6 +54,9 @@ public class PluginResource implements Resource { this.lastModified = pluginRegistryInfo.getBasePlugin().getBasePluginExtend().getStartTimestamp(); } + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } @Override public InputStream getInputStream() throws IOException { diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java index b9a4a23..c2970b9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/realize/PluginUtils.java @@ -31,7 +31,7 @@ public class PluginUtils { * 获取主程序的 ApplicationContext * @return ApplicationContext */ - public ApplicationContext getParentApplicationContext() { + public ApplicationContext getMainApplicationContext() { return parentApplicationContext; } @@ -43,18 +43,22 @@ public class PluginUtils { return pluginApplicationContext; } + /** + * 获取当前插件的描述信息 + * @return PluginDescriptor + */ public PluginDescriptor getPluginDescriptor(){ return pluginDescriptor; } /** - * 获取当前插件bean名称得到主程序中的bean + * 获取bean名称得到主程序中的bean * @param name bean 名称 * @param bean 类型 * @return bean */ - public T getParentBean(String name){ + public T getMainBean(String name){ Object bean = parentApplicationContext.getBean(name); if(bean == null){ return null; @@ -63,22 +67,22 @@ public class PluginUtils { } /** - * 通过当前插件bean类型得到主程序中的bean + * 通过bean类型得到主程序中的bean * @param aClass bean 类型 * @param bean 类型 * @return bean */ - public T getParentBean(Class aClass) { + public T getMainBean(Class aClass) { return parentApplicationContext.getBean(aClass); } /** - * 通过当前插件bean接口或者抽象类型得到主程序中的多个实现类型 + * 通过接口或者抽象类型得到主程序中的多个实现类型 * @param aClass bean 类型 * @param bean 类型 * @return bean */ - public List getParentBeans(Class aClass){ + public List getMainBeans(Class aClass){ return PluginBeanUtils.getPluginBeans(parentApplicationContext, aClass); } -- Gitee From 9472e013c9dac422cb3df356ed7eb0b29ab01547 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 12:07:58 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/starblues/annotation/ConfigDefinition.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java index 3b6eceb..4df2a07 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/annotation/ConfigDefinition.java @@ -3,7 +3,9 @@ package com.gitee.starblues.annotation; import java.lang.annotation.*; /** - * 插件配置文件对应的bean定义注解 + * 插件配置对应的bean定义注解 + * 如果存在配置文件, 则进行属性自定义 + * 如果未依赖配置文件, 则直接定义注解即可 * @author starBlues * @version 1.0 */ @@ -14,14 +16,14 @@ public @interface ConfigDefinition { /** - * 插件中的配置文件的名称 + * 插件中的配置文件的名称. 建议使用 fileName 进行文件名称配置. * @return String */ @Deprecated String value() default ""; /** - * 插件中的配置文件的名称 + * 插件中的配置文件的名称, 新版本替换 value 值 * @return String */ String fileName() default ""; -- Gitee From c7c0d898539115c51f169e7b2a640fef5a6bd3ef Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 13:00:29 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/main/config/PluginBeanConfig.java | 3 ++ .../com/mybatis/plugin1/MybatisConfig.java | 3 +- .../com/mybatis/plugin1/ResourceConfig.java | 3 +- .../mybatis/plugin1/rest/UserController.java | 9 +++-- .../com/mybatis/plugin2/MybatisConfig2.java | 3 +- .../com/mybatis/plugin2/Plugin2Listener.java | 7 ++-- .../mybatis/plugin2/rest/RoleController.java | 5 +-- .../factory/DefaultPluginFactory.java | 29 +++------------- .../starblues/factory/PluginRegistryInfo.java | 33 ++++++++++++++++--- .../AutoIntegrationConfiguration.java | 22 ++++++++++++- .../integration/ConfigurationBuilder.java | 21 ++++++++++++ .../DefaultIntegrationConfiguration.java | 4 +++ .../integration/IntegrationConfiguration.java | 6 ++++ .../pf4j/ConfigPluginStatusProvider.java | 16 ++++++--- .../integration/pf4j/DefaultPf4jFactory.java | 8 +++-- 15 files changed, 126 insertions(+), 46 deletions(-) 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 77444a5..1c0b551 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 @@ -5,6 +5,7 @@ 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; +import com.google.common.collect.Sets; import org.pf4j.RuntimeMode; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -59,6 +60,8 @@ public class PluginBeanConfig { .pluginRestPathPrefix("/api/plugin") .enablePluginIdRestPathPrefix(true) .enableSwaggerRefresh(true) + .enablePluginIds(Sets.newHashSet("integration-mybatis-plugin1")) + .disablePluginIds(Sets.newHashSet("integration-mybatis-plugin2")) .build(); } diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/MybatisConfig.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/MybatisConfig.java index 4e57c31..fba3cfc 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/MybatisConfig.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/MybatisConfig.java @@ -1,5 +1,6 @@ package com.mybatis.plugin1; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.extension.mybatis.SpringBootMybatisConfig; import org.springframework.stereotype.Component; @@ -11,7 +12,7 @@ import java.util.Set; * @version 1.0 * @since 2020-12-18 */ -@Component +@ConfigDefinition public class MybatisConfig implements SpringBootMybatisConfig { @Override diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java index be69126..17784c8 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/ResourceConfig.java @@ -1,5 +1,6 @@ package com.mybatis.plugin1; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.extension.resources.StaticResourceConfig; import com.gitee.starblues.extension.resources.thymeleaf.SpringBootThymeleafConfig; import com.gitee.starblues.extension.resources.thymeleaf.ThymeleafConfig; @@ -13,7 +14,7 @@ import java.util.Set; * @version 1.0 * @since 2020-12-19 */ -@Component +@ConfigDefinition public class ResourceConfig implements StaticResourceConfig, SpringBootThymeleafConfig { @Override public Set locations() { 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 d1fc604..6ff4acf 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 @@ -1,5 +1,6 @@ package com.mybatis.plugin1.rest; +import com.gitee.starblues.realize.PluginUtils; import com.mybatis.main.entity.User; import com.mybatis.main.mapper.UserMapper; import com.mybatis.main.service.TestTestTransactional; @@ -22,10 +23,12 @@ public class UserController { private final UserMapper userMapper; private final TestTestTransactional testTestTransactional; + + @Autowired - public UserController(UserMapper userMapper, TestTestTransactional testTestTransactional) { - this.userMapper = userMapper; - this.testTestTransactional = testTestTransactional; + public UserController(PluginUtils pluginUtils) { + this.userMapper = pluginUtils.getMainBean(UserMapper.class); + this.testTestTransactional = pluginUtils.getMainBean(TestTestTransactional.class); } @GetMapping("/list") diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/MybatisConfig2.java b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/MybatisConfig2.java index efa972a..8daa7a8 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/MybatisConfig2.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/MybatisConfig2.java @@ -1,5 +1,6 @@ package com.mybatis.plugin2; +import com.gitee.starblues.annotation.ConfigDefinition; import com.gitee.starblues.extension.mybatis.SpringBootMybatisConfig; import org.springframework.stereotype.Component; @@ -11,7 +12,7 @@ import java.util.Set; * @version 1.0 * @since 2020-12-18 */ -@Component +@ConfigDefinition public class MybatisConfig2 implements SpringBootMybatisConfig { @Override 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 index ea5dfa6..4e5aebb 100644 --- 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 @@ -2,10 +2,12 @@ package com.mybatis.plugin2; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.realize.OneselfListener; +import com.gitee.starblues.realize.PluginUtils; import com.gitee.starblues.utils.OrderPriority; import com.mybatis.main.mapper.RoleMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; /** * description @@ -19,8 +21,9 @@ public class Plugin2Listener implements OneselfListener { private final RoleMapper roleMapper; - public Plugin2Listener(RoleMapper roleMapper) { - this.roleMapper = roleMapper; + @Autowired + public Plugin2Listener(PluginUtils pluginUtils){ + roleMapper = pluginUtils.getMainBean(RoleMapper.class); } @Override diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/rest/RoleController.java b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/rest/RoleController.java index 1d8b1e9..dfc92a3 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/rest/RoleController.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/rest/RoleController.java @@ -1,5 +1,6 @@ package com.mybatis.plugin2.rest; +import com.gitee.starblues.realize.PluginUtils; import com.mybatis.main.entity.Role; import com.mybatis.main.mapper.RoleMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -22,8 +23,8 @@ public class RoleController { private final RoleMapper roleMapper; @Autowired - public RoleController(RoleMapper roleMapper) { - this.roleMapper = roleMapper; + public RoleController(PluginUtils pluginUtils){ + roleMapper = pluginUtils.getMainBean(RoleMapper.class); } @GetMapping("/list") 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 65dbbb2..5194a2a 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 @@ -87,18 +87,17 @@ public class DefaultPluginFactory implements PluginFactory { if(!buildContainer.isEmpty() && buildType == 2){ throw new IllegalAccessException("Unable to Registry operate. Because there's no build"); } - AopUtils.resolveAop(pluginWrapper); try { pluginPipeProcessor.registry(pluginRegistryInfo); registerPluginInfoMap.put(pluginWrapper.getPluginId(), pluginRegistryInfo); buildContainer.add(pluginRegistryInfo); return this; } catch (Exception e) { + pluginListenerFactory.failure(pluginWrapper.getPluginId(), e); throw e; } finally { buildType = 1; - AopUtils.recoverAop(); } } @@ -116,6 +115,7 @@ public class DefaultPluginFactory implements PluginFactory { buildContainer.add(registerPluginInfo); return this; } catch (Exception e) { + registerPluginInfo.destroy(); pluginListenerFactory.failure(pluginId, e); throw e; } finally { @@ -140,13 +140,9 @@ public class DefaultPluginFactory implements PluginFactory { unRegistryBuild(); } } finally { - if(buildType == 1){ - AopUtils.recoverAop(); - } else { + if(buildType != 1){ for (PluginRegistryInfo pluginRegistryInfo : buildContainer) { - // 卸载classLoader - closeClassLoader(pluginRegistryInfo); - pluginRegistryInfo.clear(); + pluginRegistryInfo.destroy(); } } buildContainer.clear(); @@ -197,22 +193,7 @@ public class DefaultPluginFactory implements PluginFactory { } } - /** - * 卸载Close Loader - * @param registerPluginInfo registerPluginInfo - */ - private void closeClassLoader(PluginRegistryInfo registerPluginInfo) { - List pluginClassLoaders = registerPluginInfo.getPluginClassLoaders(); - for (ClassLoader pluginClassLoader : pluginClassLoaders) { - if (pluginClassLoader instanceof Closeable) { - try { - ((Closeable) pluginClassLoader).close(); - } catch (IOException e) { - throw new PluginRuntimeException(e, ""); - } - } - } - } + /** * 添加默认插件监听者 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 1042dc2..568c271 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 @@ -11,6 +11,8 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.ClassUtils; +import java.io.Closeable; +import java.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -333,20 +335,41 @@ public class PluginRegistryInfo { } - void clear(){ + void destroy(){ + // 关闭ApplicationContext + try { + PluginInfoContainers.removePluginApplicationContext(getPluginWrapper().getPluginId()); + closePluginApplicationContext(); + } catch (Exception e){ + logger.error("Close plugin '{}'-ApplicationContext failure", getPluginWrapper().getPluginId(), e); + } + + // 关闭ClassClassLoader + try { + for (ClassLoader pluginClassLoader : pluginClassLoaders.values()) { + if (pluginClassLoader instanceof Closeable) { + try { + ((Closeable) pluginClassLoader).close(); + } catch (IOException e) { + logger.error("Close plugin '{}'-ClassLoader-'{}' failure", getPluginWrapper().getPluginId(), + pluginClassLoader.getClass().getName(), e); + } + } + } + } finally { + pluginClassLoaders.clear(); + } + + // 清除数据集合 try { extensionMap.clear(); classes.clear(); groupClasses.clear(); processorInfo.clear(); - pluginClassLoaders.clear(); pluginLoadResources.clear(); configSingletonObjects.clear(); } catch (Exception e){ logger.error("Clear plugin '{}' failure", getPluginWrapper().getPluginId(), e); - } finally { - PluginInfoContainers.removePluginApplicationContext(getPluginWrapper().getPluginId()); - closePluginApplicationContext(); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java index efdf1d9..63e321f 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java @@ -64,11 +64,16 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio @Value("${enableSwaggerRefresh:true}") private Boolean enableSwaggerRefresh; + /** + * 启用的插件id + */ + private Set enablePluginIds; + /** * 禁用的插件id, 禁用后系统不会启动该插件 * 如果禁用所有插件, 则Set集合中返回一个字符: * */ - public Set disablePluginIds; + private Set disablePluginIds; @Override public RuntimeMode environment() { @@ -94,6 +99,7 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio return enable; } + @Override public String uploadTempPath() { return super.uploadTempPath(); @@ -122,6 +128,12 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio } } + + @Override + public Set enablePluginIds() { + return enablePluginIds; + } + @Override public Set disablePluginIds() { return disablePluginIds; @@ -188,6 +200,14 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio this.enableSwaggerRefresh = enableSwaggerRefresh; } + public Set getEnablePluginIds() { + return enablePluginIds; + } + + public void setEnablePluginIds(Set enablePluginIds) { + this.enablePluginIds = enablePluginIds; + } + public Set getDisablePluginIds() { return disablePluginIds; } 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 52ada61..c5731d6 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 @@ -26,6 +26,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ private Boolean enablePluginIdRestPathPrefix; + private Set enablePluginIds; private Set disablePluginIds; private Boolean enableSwaggerRefresh; @@ -38,6 +39,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ this.backupPath = builder.backupPath; this.pluginRestPathPrefix = builder.pluginRestPathPrefix; this.enablePluginIdRestPathPrefix = builder.enablePluginIdRestPathPrefix; + this.enablePluginIds = builder.enablePluginIds; this.disablePluginIds = builder.disablePluginIds; if(builder.enable == null){ this.enable = true; @@ -68,6 +70,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ private String pluginRestPathPrefix; private Boolean enablePluginIdRestPathPrefix; + private Set enablePluginIds; private Set disablePluginIds; private Boolean enableSwaggerRefresh; @@ -111,6 +114,11 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ return this; } + public Builder enablePluginIds(Set enablePluginIds){ + this.enablePluginIds = enablePluginIds; + return this; + } + public Builder disablePluginIds(Set disablePluginIds){ this.disablePluginIds = disablePluginIds; return this; @@ -184,8 +192,21 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ return enable; } + @Override + public Set enablePluginIds() { + return enablePluginIds; + } + @Override public Set disablePluginIds() { return disablePluginIds; } + + @Override + public boolean enableSwaggerRefresh() { + if(enableSwaggerRefresh == null){ + super.enableSwaggerRefresh(); + } + return enableSwaggerRefresh; + } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java index 9a9b8c2..7f10702 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java @@ -35,6 +35,10 @@ public abstract class DefaultIntegrationConfiguration implements IntegrationConf return true; } + @Override + public Set enablePluginIds() { + return null; + } @Override public Set disablePluginIds() { 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 ddf3245..f4aa919 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 @@ -65,6 +65,12 @@ public interface IntegrationConfiguration { */ boolean enable(); + /** + * 启用的插件id + * @return Set + */ + Set enablePluginIds(); + /** * 禁用的插件id, 禁用后系统不会启动该插件 * 如果禁用所有插件, 则Set集合中返回一个字符: * diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/ConfigPluginStatusProvider.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/ConfigPluginStatusProvider.java index 75f39f0..ff16b48 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/ConfigPluginStatusProvider.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/ConfigPluginStatusProvider.java @@ -11,13 +11,18 @@ import java.util.Set; */ public class ConfigPluginStatusProvider implements PluginStatusProvider { + private Set enablePluginIds = new HashSet<>(); private Set disabledPlugins = new HashSet<>(); public ConfigPluginStatusProvider() { - this(null); + this(null, null); } - public ConfigPluginStatusProvider(Set disabledPluginIds) { + public ConfigPluginStatusProvider(Set enablePluginIds, + Set disabledPluginIds) { + if(enablePluginIds != null && !enablePluginIds.isEmpty()){ + this.enablePluginIds.addAll(enablePluginIds); + } if(disabledPluginIds != null && !disabledPluginIds.isEmpty()){ this.disabledPlugins.addAll(disabledPluginIds); } @@ -29,10 +34,11 @@ public class ConfigPluginStatusProvider implements PluginStatusProvider { if(disabledPlugins.contains("*")){ return true; } - if(pluginId == null || "".equals(pluginId)){ + if (disabledPlugins.contains(pluginId)) { return true; } - return disabledPlugins.contains(pluginId); + + return !enablePluginIds.isEmpty() && !enablePluginIds.contains(pluginId); } @Override @@ -41,6 +47,7 @@ public class ConfigPluginStatusProvider implements PluginStatusProvider { return; } disabledPlugins.add(pluginId); + enablePluginIds.remove(pluginId); } @Override @@ -49,5 +56,6 @@ public class ConfigPluginStatusProvider implements PluginStatusProvider { return; } disabledPlugins.remove(pluginId); + enablePluginIds.add(pluginId); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java index fe811ec..8e4002d 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java @@ -53,7 +53,9 @@ public class DefaultPf4jFactory implements Pf4jFactory { @Override protected PluginStatusProvider createPluginStatusProvider() { - return new ConfigPluginStatusProvider(configuration.disablePluginIds()); + return new ConfigPluginStatusProvider( + configuration.enablePluginIds(), + configuration.disablePluginIds()); } }; } else if(RuntimeMode.DEPLOYMENT == environment){ @@ -73,7 +75,9 @@ public class DefaultPf4jFactory implements Pf4jFactory { @Override protected PluginStatusProvider createPluginStatusProvider() { - return new ConfigPluginStatusProvider(configuration.disablePluginIds()); + return new ConfigPluginStatusProvider( + configuration.enablePluginIds(), + configuration.disablePluginIds()); } @Override -- Gitee From 30300fa8c41692ee1f983b5889f8c281b9dfc73f Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 14:05:48 +0800 Subject: [PATCH 11/17] =?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=8F=AF=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/config/PluginConfiguration.java | 3 +- .../factory/DefaultPluginFactory.java | 5 -- .../bean/PluginControllerPostProcessor.java | 37 ++++----- .../AutoIntegrationConfiguration.java | 14 ++++ .../integration/ConfigurationBuilder.java | 16 ++++ .../DefaultIntegrationConfiguration.java | 6 ++ .../integration/IntegrationConfiguration.java | 7 ++ .../integration/pf4j/DefaultPf4jFactory.java | 17 +++- .../pf4j/SortDependencyResolver.java | 81 +++++++++++++++++++ .../com/gitee/starblues/utils/AopUtils.java | 1 + 10 files changed, 155 insertions(+), 32 deletions(-) create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/SortDependencyResolver.java diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java index 6557abf..16eb1c9 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/PluginConfiguration.java @@ -1,12 +1,14 @@ package com.basic.example.main.config; import com.gitee.starblues.integration.DefaultIntegrationConfiguration; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.pf4j.RuntimeMode; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; +import java.util.List; import java.util.Set; @@ -124,7 +126,6 @@ public class PluginConfiguration extends DefaultIntegrationConfiguration { } - @Override public String toString() { return "PluginArgConfiguration{" + 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 5194a2a..772463b 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 @@ -7,14 +7,10 @@ import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.integration.listener.PluginListener; import com.gitee.starblues.integration.listener.PluginListenerFactory; import com.gitee.starblues.integration.listener.SwaggerListeningListener; -import com.gitee.starblues.utils.AopUtils; -import org.pf4j.PluginRuntimeException; import org.pf4j.PluginWrapper; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; -import java.io.Closeable; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -62,7 +58,6 @@ public class DefaultPluginFactory implements PluginFactory { this.pluginListenerFactory = pluginListenerFactory; } configuration = applicationContext.getBean(IntegrationConfiguration.class); - AopUtils.registered(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 4a12436..ac4f8c5 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 @@ -6,7 +6,6 @@ import com.gitee.starblues.factory.SpringBeanRegister; import com.gitee.starblues.factory.process.pipe.classs.group.ControllerGroup; import com.gitee.starblues.factory.process.post.PluginPostProcessor; import com.gitee.starblues.integration.IntegrationConfiguration; -import com.gitee.starblues.utils.AopUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; @@ -54,32 +53,24 @@ public class PluginControllerPostProcessor implements PluginPostProcessor { @Override public void registry(List pluginRegistryInfos) throws Exception { for (PluginRegistryInfo pluginRegistryInfo : pluginRegistryInfos) { - AopUtils.resolveAop(pluginRegistryInfo.getPluginWrapper()); - - try { - List> groupClasses = pluginRegistryInfo.getGroupClasses(ControllerGroup.GROUP_ID); - if(groupClasses == null || groupClasses.isEmpty()){ + List> groupClasses = pluginRegistryInfo.getGroupClasses(ControllerGroup.GROUP_ID); + if(groupClasses == null || groupClasses.isEmpty()){ + continue; + } + List controllerBeanWrappers = new ArrayList<>(); + for (Class groupClass : groupClasses) { + if(groupClass == null){ continue; } - List controllerBeanWrappers = new ArrayList<>(); - for (Class groupClass : groupClasses) { - if(groupClass == null){ - continue; - } - try { - ControllerBeanWrapper controllerBeanWrapper = registry(pluginRegistryInfo, groupClass); - controllerBeanWrappers.add(controllerBeanWrapper); - } catch (Exception e){ - pluginRegistryInfo.addProcessorInfo(getKey(pluginRegistryInfo), controllerBeanWrappers); - throw e; - } + try { + ControllerBeanWrapper controllerBeanWrapper = registry(pluginRegistryInfo, groupClass); + controllerBeanWrappers.add(controllerBeanWrapper); + } catch (Exception e){ + pluginRegistryInfo.addProcessorInfo(getKey(pluginRegistryInfo), controllerBeanWrappers); + throw e; } - - pluginRegistryInfo.addProcessorInfo(getKey(pluginRegistryInfo), controllerBeanWrappers); - } finally { - AopUtils.recoverAop(); } - + pluginRegistryInfo.addProcessorInfo(getKey(pluginRegistryInfo), controllerBeanWrappers); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java index 63e321f..0d142ed 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; +import java.util.List; import java.util.Set; /** @@ -75,6 +76,11 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio */ private Set disablePluginIds; + /** + * 设置初始化时插件启动的顺序 + */ + private List sortInitPluginIds; + @Override public RuntimeMode environment() { return RuntimeMode.byName(runMode); @@ -215,4 +221,12 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio public void setDisablePluginIds(Set disablePluginIds) { this.disablePluginIds = disablePluginIds; } + + public List getSortInitPluginIds() { + return sortInitPluginIds; + } + + public void setSortInitPluginIds(List sortInitPluginIds) { + this.sortInitPluginIds = sortInitPluginIds; + } } 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 c5731d6..6e973a7 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 @@ -3,6 +3,7 @@ package com.gitee.starblues.integration; import org.pf4j.RuntimeMode; import org.springframework.util.StringUtils; +import java.util.List; import java.util.Objects; import java.util.Set; @@ -28,6 +29,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ private Set enablePluginIds; private Set disablePluginIds; + private List sortInitPluginIds; private Boolean enableSwaggerRefresh; public ConfigurationBuilder(Builder builder) { @@ -41,6 +43,8 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ this.enablePluginIdRestPathPrefix = builder.enablePluginIdRestPathPrefix; this.enablePluginIds = builder.enablePluginIds; this.disablePluginIds = builder.disablePluginIds; + this.sortInitPluginIds = builder.sortInitPluginIds; + if(builder.enable == null){ this.enable = true; } else { @@ -72,6 +76,7 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ private Set enablePluginIds; private Set disablePluginIds; + private List sortInitPluginIds; private Boolean enableSwaggerRefresh; public Builder runtimeMode(RuntimeMode runtimeMode){ @@ -123,6 +128,12 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ this.disablePluginIds = disablePluginIds; return this; } + + public Builder sortInitPluginIds(List sortInitPluginIds){ + this.sortInitPluginIds = sortInitPluginIds; + return this; + } + public Builder enableSwaggerRefresh(Boolean enableSwaggerRefresh){ this.enableSwaggerRefresh = enableSwaggerRefresh; return this; @@ -202,6 +213,11 @@ public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ return disablePluginIds; } + @Override + public List sortInitPluginIds() { + return sortInitPluginIds; + } + @Override public boolean enableSwaggerRefresh() { if(enableSwaggerRefresh == null){ diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java index 7f10702..6a56d53 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationConfiguration.java @@ -1,5 +1,6 @@ package com.gitee.starblues.integration; +import java.util.List; import java.util.Set; /** @@ -49,4 +50,9 @@ public abstract class DefaultIntegrationConfiguration implements IntegrationConf public boolean enableSwaggerRefresh() { return true; } + + @Override + public List sortInitPluginIds() { + return null; + } } 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 f4aa919..a15d55f 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 @@ -2,6 +2,7 @@ package com.gitee.starblues.integration; import org.pf4j.RuntimeMode; +import java.util.List; import java.util.Set; @@ -84,4 +85,10 @@ public interface IntegrationConfiguration { */ boolean enableSwaggerRefresh(); + /** + * 设置初始化时插件启动的顺序. + * @return 有顺序的插件id + */ + List sortInitPluginIds(); + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java index 8e4002d..2294e88 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4jFactory.java @@ -5,6 +5,7 @@ import org.pf4j.*; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.Objects; /** @@ -30,10 +31,18 @@ public class DefaultPf4jFactory implements Pf4jFactory { if(environment == null){ throw new RuntimeException("Configuration RuntimeMode is null" + configuration.environment()); } + List sortInitPluginIds = configuration.sortInitPluginIds(); if(RuntimeMode.DEVELOPMENT == environment){ // 开发环境下的插件管理者 Path path = Paths.get(getDevPluginDir(configuration)); return new DefaultPluginManager(path){ + + @Override + protected void initialize() { + super.initialize(); + dependencyResolver = new SortDependencyResolver(sortInitPluginIds, versionManager); + } + @Override public RuntimeMode getRuntimeMode() { System.setProperty("pf4j.mode", RuntimeMode.DEVELOPMENT.toString()); @@ -57,15 +66,17 @@ public class DefaultPf4jFactory implements Pf4jFactory { configuration.enablePluginIds(), configuration.disablePluginIds()); } + }; } else if(RuntimeMode.DEPLOYMENT == environment){ // 运行环境下的插件管理者 Path path = Paths.get(getProdPluginDir(configuration)); return new DefaultPluginManager(path){ + @Override - protected PluginRepository createPluginRepository() { - return new CompoundPluginRepository() - .add(new JarPluginRepository(getPluginsRoot())); + protected void initialize() { + super.initialize(); + dependencyResolver = new SortDependencyResolver(sortInitPluginIds, versionManager); } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/SortDependencyResolver.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/SortDependencyResolver.java new file mode 100644 index 0000000..7e02bf4 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/SortDependencyResolver.java @@ -0,0 +1,81 @@ +package com.gitee.starblues.integration.pf4j; + +import org.pf4j.DependencyResolver; +import org.pf4j.PluginDescriptor; +import org.pf4j.VersionManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +/** + * @author starBlues + * @version 1.0 + */ +public class SortDependencyResolver extends DependencyResolver { + + private final static Logger LOGGER = LoggerFactory.getLogger(SortDependencyResolver.class); + + private final List sortInitPluginIds; + + public SortDependencyResolver(List sortInitPluginIds, VersionManager versionManager) { + super(versionManager); + this.sortInitPluginIds = sortInitPluginIds; + } + + @Override + public Result resolve(List plugins) { + Result resolve = super.resolve(plugins); + if(sortInitPluginIds == null || sortInitPluginIds.isEmpty()){ + return resolve; + } + List sortedPlugins = resolve.getSortedPlugins(); + List newSortPluginIds = new ArrayList<>(sortedPlugins.size()); + for (String sortPluginId : sortInitPluginIds) { + Iterator iterator = sortedPlugins.iterator(); + while (iterator.hasNext()){ + String id = iterator.next(); + if(Objects.equals(id, sortPluginId)){ + newSortPluginIds.add(id); + iterator.remove(); + } + } + } + if(!sortedPlugins.isEmpty()){ + newSortPluginIds.addAll(sortedPlugins); + } + + return getSortResult(resolve, newSortPluginIds); + } + + @SuppressWarnings("unchecked") + private Result getSortResult(Result resolve, List newSortPluginIds ){ + try { + Field sortedPluginsField = ReflectionUtils.findField(Result.class, "sortedPlugins"); + List sortedPlugins = null; + if(sortedPluginsField != null){ + if (!sortedPluginsField.isAccessible()) { + sortedPluginsField.setAccessible(true); + } + sortedPlugins = (List) sortedPluginsField.get(resolve); + } + if(sortedPlugins == null){ + return resolve; + } + sortedPlugins.clear(); + sortedPlugins.addAll(newSortPluginIds); + return resolve; + } catch (Exception e){ + LOGGER.error("Set plugin init sort failure. use default sort init plugin. " + e.getMessage()); + return resolve; + } + } + + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AopUtils.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AopUtils.java index 3269add..bd5774b 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AopUtils.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/AopUtils.java @@ -20,6 +20,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * @author starBlues * @version 1.0 */ +@Deprecated public class AopUtils { private static final Logger LOG = LoggerFactory.getLogger(AopUtils.class); -- Gitee From 17a9ee6645ac96b0709a6af0506d8c911cd76090 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 14:12:27 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E6=B5=8B=E8=AF=95=20@C?= =?UTF-8?q?onfiguration=20=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/plugin1/config/ConfigBean.java | 54 +++++++++++++++++++ .../example/plugin1/rest/HelloPlugin1.java | 9 ++++ 2 files changed, 63 insertions(+) create mode 100644 example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java new file mode 100644 index 0000000..23d56b9 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/config/ConfigBean.java @@ -0,0 +1,54 @@ +package com.basic.example.plugin1.config; + +import com.basic.example.main.config.PluginConfiguration; +import com.gitee.starblues.realize.PluginUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author starBlues + * @version 1.0 + */ +@Configuration +public class ConfigBean { + + @Bean + public ConfigBeanTest c(PluginUtils pluginUtils){ + PluginConfiguration mainBean = pluginUtils.getMainBean(PluginConfiguration.class); + System.out.println("configTest: mainBean=" + mainBean); + ConfigBeanTest configBeanTest = new ConfigBeanTest(); + configBeanTest.name = "hello"; + configBeanTest.age = 16; + return configBeanTest; + } + + public static class ConfigBeanTest{ + private String name; + private Integer age; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + @Override + public String toString() { + return "ConfigBeanTest{" + + "name='" + name + '\'' + + ", age=" + age + + '}'; + } + } + +} diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java index 9ed6eed..56c9aea 100644 --- a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/rest/HelloPlugin1.java @@ -1,5 +1,6 @@ package com.basic.example.plugin1.rest; +import com.basic.example.plugin1.config.ConfigBean; import com.basic.example.plugin1.config.PluginConfig1; import com.basic.example.plugin1.service.HelloService; import com.gitee.starblues.realize.PluginUtils; @@ -31,6 +32,9 @@ public class HelloPlugin1 { @Autowired private PluginUtils pluginUtils; + @Autowired + private ConfigBean.ConfigBeanTest configBeanTest; + @GetMapping("plugin1") @ApiOperation(value = "hello", notes = "hello") public String sya(){ @@ -59,4 +63,9 @@ public class HelloPlugin1 { return pluginUtils.getPluginDescriptor(); } + @GetMapping("configBeanTest") + public ConfigBean.ConfigBeanTest getConfigBeanTest(){ + return configBeanTest; + } + } -- Gitee From 23435f5533fa4ab19b1eab0a29a1c96ebb7b84c5 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 18:00:54 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20`ConfigBean`=20?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin1/config/PluginConfigBean.java | 28 ++++++++ .../main/config/PluginBeanConfig.java | 2 - .../pipe/PluginConfigBeanPipeProcessor.java | 64 +++++++++++++++++++ ...luginPipeApplicationContextProcessor.java} | 6 +- .../pipe/PluginPipeProcessorFactory.java | 4 +- .../pipe/bean/ConfigBeanRegistrar.java | 3 +- .../AutoIntegrationConfiguration.java | 38 ++++++++++- 7 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/PluginConfigBean.java create mode 100644 springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginConfigBeanPipeProcessor.java rename springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/{PluginApplicationContextProcessor.java => PluginPipeApplicationContextProcessor.java} (95%) diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/PluginConfigBean.java b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/PluginConfigBean.java new file mode 100644 index 0000000..9af63cd --- /dev/null +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/src/main/java/com/mybatis/plugin1/config/PluginConfigBean.java @@ -0,0 +1,28 @@ +package com.mybatis.plugin1.config; + +import com.gitee.starblues.realize.ConfigBean; + +/** + * @author starBlues + * @version 1.0 + */ +public class PluginConfigBean implements ConfigBean { + + private final Plugin1Config plugin1Config; + + public PluginConfigBean(Plugin1Config plugin1Config) { + this.plugin1Config = plugin1Config; + } + + @Override + public void initialize() throws Exception { + System.out.println("初始化Bean"); + System.out.println(plugin1Config); + } + + @Override + public void destroy() throws Exception { + System.out.println("销毁Bean"); + System.out.println(plugin1Config); + } +} diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java index b896a39..b9e39dd 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java +++ b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java @@ -17,7 +17,6 @@ import org.springframework.context.annotation.Configuration; @Configuration public class PluginBeanConfig { - /** * 定义插件应用。使用可以注入它操作插件。 * @return PluginApplication @@ -31,5 +30,4 @@ public class PluginBeanConfig { )); return pluginApplication; } - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginConfigBeanPipeProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginConfigBeanPipeProcessor.java new file mode 100644 index 0000000..52d4b94 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginConfigBeanPipeProcessor.java @@ -0,0 +1,64 @@ +package com.gitee.starblues.factory.process.pipe; + +import com.gitee.starblues.factory.PluginRegistryInfo; +import com.gitee.starblues.realize.ConfigBean; +import com.gitee.starblues.utils.PluginBeanUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author starBlues + * @version 1.0 + */ +public class PluginConfigBeanPipeProcessor implements PluginPipeProcessor{ + + private final static String KEY = "ConfigBeans"; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void initialize() throws Exception { + + } + + @Override + public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + List pluginBeans = PluginBeanUtils.getPluginBeans(pluginRegistryInfo.getPluginApplicationContext(), + ConfigBean.class); + if(pluginBeans.isEmpty()){ + return; + } + List successConfigBeans = new ArrayList<>(pluginBeans.size()); + for (ConfigBean pluginBean : pluginBeans) { + try { + pluginBean.initialize(); + successConfigBeans.add(pluginBean); + } catch (Exception e){ + logger.error("Plugin '{}' configBean '{}' initialize exception.", + pluginRegistryInfo.getPluginWrapper().getPluginId(), + pluginBean.getClass().getName(), e); + } + } + pluginRegistryInfo.addExtension(KEY, successConfigBeans); + } + + @Override + public void unRegistry(PluginRegistryInfo pluginRegistryInfo) throws Exception { + List pluginBeans = pluginRegistryInfo.getExtension(KEY); + if(pluginBeans == null || pluginBeans.isEmpty()){ + return; + } + for (ConfigBean pluginBean : pluginBeans) { + try { + pluginBean.destroy(); + } catch (Exception e){ + logger.error("Plugin '{}' configBean '{}' destroy exception.", + pluginRegistryInfo.getPluginWrapper().getPluginId(), + pluginBean.getClass().getName(), e); + } + } + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java similarity index 95% rename from springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java rename to springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java index 2d8b51b..ca2505c 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginApplicationContextProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/PluginPipeApplicationContextProcessor.java @@ -18,14 +18,14 @@ import java.util.*; * @author starBlues * @version 1.0 */ -public class PluginApplicationContextProcessor implements PluginPipeProcessor{ +public class PluginPipeApplicationContextProcessor implements PluginPipeProcessor{ - private final static Logger logger = LoggerFactory.getLogger(PluginApplicationContextProcessor.class); + private final static Logger logger = LoggerFactory.getLogger(PluginPipeApplicationContextProcessor.class); private final List pluginBeanDefinitionRegistrars = new ArrayList<>(); private final ApplicationContext mainApplicationContext; - public PluginApplicationContextProcessor(ApplicationContext mainApplicationContext) { + public PluginPipeApplicationContextProcessor(ApplicationContext mainApplicationContext) { this.mainApplicationContext = mainApplicationContext; } 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 04b4c2b..1c859a9 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 @@ -40,7 +40,9 @@ public class PluginPipeProcessorFactory implements PluginPipeProcessor { // 添加前置扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPreProcessorExtends()); // 插件的ApplicationContext处理者 - pluginPipeProcessors.add(new PluginApplicationContextProcessor(applicationContext)); + pluginPipeProcessors.add(new PluginPipeApplicationContextProcessor(applicationContext)); + // 插件ConfigBean处理者 + pluginPipeProcessors.add(new PluginConfigBeanPipeProcessor()); // 添加扩展 pluginPipeProcessors.addAll(ExtensionInitializer.getPipeProcessorExtends()); diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java index 0f33c7e..eff5e40 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/ConfigBeanRegistrar.java @@ -16,6 +16,8 @@ import java.util.*; */ public class ConfigBeanRegistrar implements PluginBeanRegistrar { + public final static String KEY = "ConfigBeanNames"; + public ConfigBeanRegistrar() { } @@ -36,5 +38,4 @@ public class ConfigBeanRegistrar implements PluginBeanRegistrar { } } - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java index 0d142ed..8ac3c56 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/AutoIntegrationConfiguration.java @@ -65,6 +65,18 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio @Value("${enableSwaggerRefresh:true}") private Boolean enableSwaggerRefresh; + /** + * 在卸载插件后, 备份插件的目录 + */ + @Value("${backupPath:}") + private String backupPath; + + /** + * 上传的插件所存储的临时目录 + */ + @Value("${uploadTempPath:}") + private String uploadTempPath; + /** * 启用的插件id */ @@ -108,12 +120,18 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio @Override public String uploadTempPath() { - return super.uploadTempPath(); + if(StringUtils.isNullOrEmpty(uploadTempPath)){ + return super.uploadTempPath(); + } + return uploadTempPath; } @Override public String backupPath() { - return super.backupPath(); + if(StringUtils.isNullOrEmpty(backupPath)){ + return super.backupPath(); + } + return backupPath; } @Override @@ -206,6 +224,22 @@ public class AutoIntegrationConfiguration extends DefaultIntegrationConfiguratio this.enableSwaggerRefresh = enableSwaggerRefresh; } + public String getBackupPath() { + return backupPath; + } + + public void setBackupPath(String backupPath) { + this.backupPath = backupPath; + } + + public String getUploadTempPath() { + return uploadTempPath; + } + + public void setUploadTempPath(String uploadTempPath) { + this.uploadTempPath = uploadTempPath; + } + public Set getEnablePluginIds() { return enablePluginIds; } -- Gitee From dc9336b210a02aa3ae4bed0ac53effb47efb2331 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 18:19:14 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/starblues/extension/AbstractExtension.java | 5 ----- .../gitee/starblues/extension/PluginControllerProcessor.java | 1 + .../process/post/bean/PluginControllerPostProcessor.java | 3 --- 3 files changed, 1 insertion(+), 8 deletions(-) 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 170afdf..43fc883 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 @@ -21,7 +21,6 @@ public abstract class AbstractExtension { protected PluginApplication pluginApplication; - public void setPluginApplication(PluginApplication pluginApplication) { this.pluginApplication = pluginApplication; } @@ -41,7 +40,6 @@ public abstract class AbstractExtension { public void initialize(ApplicationContext mainApplicationContext) throws Exception{ } - /** * 返回插件的资源加载者。 * 主要是加载插件中的某些资源,比如文件、图片等。 @@ -71,7 +69,6 @@ public abstract class AbstractExtension { return null; } - /** * 返回扩展的bean定义注册者扩展 * 该扩展主要是对每一个插件进行处理 @@ -82,8 +79,6 @@ public abstract class AbstractExtension { return null; } - - /** * 返回扩展的流插件处理者。 * 该扩展主要是对每一个插件进行处理 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/PluginControllerProcessor.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/PluginControllerProcessor.java index 7b1b431..2f92777 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/PluginControllerProcessor.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/extension/PluginControllerProcessor.java @@ -7,6 +7,7 @@ package com.gitee.starblues.extension; * @author starBlues * @version 1.0 */ +@Deprecated public interface PluginControllerProcessor { /** 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 ac4f8c5..1d9a3f1 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 @@ -1,8 +1,6 @@ package com.gitee.starblues.factory.process.post.bean; -import com.gitee.starblues.extension.PluginControllerProcessor; import com.gitee.starblues.factory.PluginRegistryInfo; -import com.gitee.starblues.factory.SpringBeanRegister; import com.gitee.starblues.factory.process.pipe.classs.group.ControllerGroup; import com.gitee.starblues.factory.process.post.PluginPostProcessor; import com.gitee.starblues.integration.IntegrationConfiguration; @@ -12,7 +10,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.util.ReflectionUtils; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -- Gitee From 8d2e4e9417807ffde88f6d27f01d4ec3f400e6f4 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 18:24:15 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 7 +++++-- .../README.md | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md index 6c328c6..a2bd040 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md @@ -77,11 +77,12 @@ public PluginApplication pluginApplication(){ - 如果集成`mybatis-plus`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootMybatisPlusConfig` - 如果集成`tkmybatis`, 则实现接口:`com.gitee.starblues.extension.mybatis.SpringBootTkMybatisConfig` +- 以上实现类添加注解`@ConfigDefinition` 例如集成mybatis-plus: ```java -@Component +@ConfigDefinition public class MybatisConfig implements SpringBootMybatisConfig { @Override @@ -102,7 +103,7 @@ public class MybatisConfig implements SpringBootMybatisConfig { ``` 该步骤主要定义插件中的Mapper xml的位置。该位置的定义规则如下: - +- 注意: 插件中的xml路径不能和主程序中的xml路径在`resources`相对一致, 比如文件名都为`mapper`, 建议使用不同名称区分开 ``` text xmlLocationsMatch: ? 匹配一个字符 @@ -205,6 +206,8 @@ public void oneselfConfig(Config config){ ### 版本升级 +#### 2.4.0 版本 +- 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 #### 2.2.5 版本 全新升级该扩展 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index 00f1de6..642a947 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -57,7 +57,7 @@ public PluginApplication pluginApplication(){ 例如: ```java -@Component +@ConfigDefinition public class ResourceConfig implements StaticResourceConfig { @Override public Set locations() { @@ -84,7 +84,7 @@ public class ResourceConfig implements StaticResourceConfig { 例如: ``` java -@Component +@ConfigDefinition public class ResourceConfig implements SpringBootThymeleafConfig { @Override @@ -99,6 +99,10 @@ public class ResourceConfig implements SpringBootThymeleafConfig { ### 版本升级 +#### 2.4.0 版本 +- 修改扩展功能中配置实现类,必须新增`@ConfigDefinition` 注解 +- 修复插件中的静态资源和主程序冲突的bug + #### 2.2.5 版本 1. 新增`Thymeleaf`模板引擎 2. 修改插件中扩展的配置方式 -- Gitee From 918be248c1aab1bc9e6b549d15b3f6db78de3d8c Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 18:28:05 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 9 +++++---- .../README.md | 4 +++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md index a2bd040..9c0c46b 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md @@ -1,4 +1,7 @@ -#扩展包 - 集成SpringBoot Mybatis +### 包含集成 +- 可集成`Mybatis` +- 可集成`Mybatis-Plus` +- 可集成`Tk-Mybatis` ### maven 仓库地址 @@ -224,6 +227,4 @@ public void oneselfConfig(Config config){ 2. 修复 Mapper.xml 中定义的 resultType 类型无法定义的bug。 #### 2.0.3 版本 -1. 修复Mapper无法注入的bug. (由于springboot-plugin-framework 2.0.3 版本升级导致) - - +1. 修复Mapper无法注入的bug. (由于springboot-plugin-framework 2.0.3 版本升级导致) \ No newline at end of file diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index 642a947..aa25fef 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -1,4 +1,6 @@ -#扩展包 - 集成SpringBoot Mybatis +### 包含内容 +- 可集成插件静态资源访问 +- 可集成`Thymeleaf` ### maven 仓库地址 -- Gitee From 6c313cc3531ab4de77d4ccd8b84033b0feb50615 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Sat, 23 Jan 2021 18:32:13 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../README.md | 10 ++++++---- .../README.md | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 738aded..393f63f 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ - 支持在插件中自定义`Mapper`接口、`Mapper xml` 以及对应的实体`bean` -- 支持集成`Mybatis-Plus`、`Tk-Mybatis` +- 支持集成``Mybatis`、`Mybatis-Plus`、`Tk-Mybatis` - 支持可在插件中独立配置数据源 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md index 9c0c46b..ecb5844 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/README.md @@ -1,7 +1,9 @@ -### 包含集成 -- 可集成`Mybatis` -- 可集成`Mybatis-Plus` -- 可集成`Tk-Mybatis` +### 特性 +- 支持在插件中自定义Mapper接口、Mapper xml 以及对应的实体bean +- 支持插件独立定义数据源 +- 支持集成 `Mybatis` +- 支持集成 `Mybatis-Plus` +- 支持集成`Tk-Mybatis` ### maven 仓库地址 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md index aa25fef..e6c74e1 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-resources/README.md @@ -1,6 +1,6 @@ -### 包含内容 -- 可集成插件静态资源访问 -- 可集成`Thymeleaf` +### 特性 +- 支持通过http访问插件中静态资源 +- 支持集成`Thymeleaf` ### maven 仓库地址 -- Gitee