diff --git a/README.md b/README.md index 19fea7c..7803cc5 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Components - **ExtensionsInjector** allows PF4J's extensions to be expose as Spring beans. - **SpringPlugin** your plugin extends this class if your plugin contains Spring beans - **SpringExtensionFactory** use this ExtensionFactory in your PluginManager if you have SpringPlugins +- **SpringPluginManager** a Spring aware PluginManager Using Maven ------------------- @@ -52,29 +53,12 @@ Create the Spring configuration (declare some beans) using annotations with: public class SpringConfiguration { @Bean - public PluginManager pluginManager() { - PluginManager pluginManager = new DefaultPluginManager() { - - @Override - protected ExtensionFactory createExtensionFactory() { - return new SpringExtensionFactory(this); - } - - }; - pluginManager.loadPlugins(); - - // start (active/resolved) the plugins - pluginManager.startPlugins(); - - return pluginManager; - } - - @Bean - public static ExtensionsInjector extensionsInjector() { - return new ExtensionsInjector(pluginManager()); + public SpringPluginManager pluginManager() { + return new SpringPluginManager(); } @Bean + @DependsOn("pluginManager") public Greetings greetings() { return new Greetings(); } diff --git a/demo/api/pom.xml b/demo/api/pom.xml index 57d0b31..a734be0 100644 --- a/demo/api/pom.xml +++ b/demo/api/pom.xml @@ -4,12 +4,12 @@ org.pf4j.demo pf4j-spring-demo-parent - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT 4.0.0 pf4j-spring-demo-api - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT jar Demo Api diff --git a/demo/app/pom.xml b/demo/app/pom.xml index b4610ec..ca4c7a5 100644 --- a/demo/app/pom.xml +++ b/demo/app/pom.xml @@ -4,12 +4,12 @@ org.pf4j.demo pf4j-spring-demo-parent - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT 4.0.0 pf4j-spring-demo-app - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT jar Demo App diff --git a/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java b/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java index c742127..bc5a85a 100644 --- a/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java +++ b/demo/app/src/main/java/org/pf4j/demo/WhazzupGreeting.java @@ -17,11 +17,13 @@ import org.pf4j.Extension; import org.pf4j.demo.api.Greeting; +import org.springframework.context.annotation.Scope; /** * @author Decebal Suiu */ @Extension +@Scope("prototype") public class WhazzupGreeting implements Greeting { @Override diff --git a/demo/app/src/main/resources/log4j.properties b/demo/app/src/main/resources/log4j.properties index f42e226..b7b7039 100644 --- a/demo/app/src/main/resources/log4j.properties +++ b/demo/app/src/main/resources/log4j.properties @@ -1,4 +1,4 @@ -log4j.rootLogger=DEBUG, Console +log4j.rootLogger=WARN, Console # # PF4J log diff --git a/demo/plugins/plugin1/pom.xml b/demo/plugins/plugin1/pom.xml index 080ab26..398f3f7 100644 --- a/demo/plugins/plugin1/pom.xml +++ b/demo/plugins/plugin1/pom.xml @@ -4,12 +4,12 @@ org.pf4j.demo pf4j-spring-demo-plugins - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT 4.0.0 pf4j-spring-demo-plugin1 - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT jar Demo Plugin #1 diff --git a/demo/plugins/plugin2/pom.xml b/demo/plugins/plugin2/pom.xml index a623434..39719b3 100644 --- a/demo/plugins/plugin2/pom.xml +++ b/demo/plugins/plugin2/pom.xml @@ -4,12 +4,12 @@ org.pf4j.demo pf4j-spring-demo-plugins - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT 4.0.0 pf4j-spring-demo-plugin2 - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT jar Demo Plugin #2 diff --git a/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java b/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java index 05d5030..944f38d 100644 --- a/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java +++ b/demo/plugins/plugin2/src/main/java/org/pf4j/demo/hello/HelloPlugin.java @@ -15,6 +15,7 @@ */ package org.pf4j.demo.hello; +import org.pf4j.spring.SpringPluginManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -48,6 +49,11 @@ public void stop() { @Override protected ApplicationContext createApplicationContext() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); + /* + // set the parent context (to access beans from application) + SpringPluginManager pluginManager = (SpringPluginManager) getWrapper().getPluginManager(); + applicationContext.setParent(pluginManager.getApplicationContext()); + */ applicationContext.setClassLoader(getWrapper().getPluginClassLoader()); applicationContext.register(SpringConfiguration.class); applicationContext.refresh(); diff --git a/demo/plugins/pom.xml b/demo/plugins/pom.xml index ebd8550..410e983 100644 --- a/demo/plugins/pom.xml +++ b/demo/plugins/pom.xml @@ -4,12 +4,12 @@ org.pf4j.demo pf4j-spring-demo-parent - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT 4.0.0 pf4j-spring-demo-plugins - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT pom Demo Plugins Parent diff --git a/demo/pom.xml b/demo/pom.xml index 1d78c8d..320d36e 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -4,13 +4,13 @@ org.pf4j pf4j-spring-parent - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT 4.0.0 org.pf4j.demo pf4j-spring-demo-parent - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT pom Demo Parent diff --git a/pf4j-spring/pom.xml b/pf4j-spring/pom.xml index 02c7c7d..3acb067 100644 --- a/pf4j-spring/pom.xml +++ b/pf4j-spring/pom.xml @@ -4,12 +4,12 @@ org.pf4j pf4j-spring-parent - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT 4.0.0 pf4j-spring - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT PF4J-Spring Parent PF4J-Spring Integration diff --git a/pf4j-spring/src/main/java/org/pf4j/spring/ExtensionsInjector.java b/pf4j-spring/src/main/java/org/pf4j/spring/ExtensionsInjector.java index 7cf5ab9..4a07530 100644 --- a/pf4j-spring/src/main/java/org/pf4j/spring/ExtensionsInjector.java +++ b/pf4j-spring/src/main/java/org/pf4j/spring/ExtensionsInjector.java @@ -19,7 +19,11 @@ import org.pf4j.PluginWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.annotation.Scope; import java.util.List; import java.util.Set; @@ -77,8 +81,20 @@ public void injectExtensions() { * Override this method if you wish other register strategy. */ protected void registerExtension(Class extensionClass) { - Object extension = pluginManager.getExtensionFactory().create(extensionClass); - beanFactory.registerSingleton(extension.getClass().getName(), extension); + String beanName = extensionClass.getName(); + + if (extensionClass.isAnnotationPresent(Scope.class)) { + String scope = extensionClass.getAnnotation(Scope.class).value(); + log.info("Registering {} with scope: {}", beanName, scope); + BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(extensionClass); + definitionBuilder.setScope(scope); + BeanDefinition definition = definitionBuilder.getBeanDefinition(); + ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(beanName, definition); + } else { + log.info("Registering {} as singleton", beanName); + Object extension = pluginManager.getExtensionFactory().create(extensionClass); + beanFactory.registerSingleton(extension.getClass().getName(), extension); + } } } diff --git a/pom.xml b/pom.xml index 286cb8a..87659ee 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ 4.0.0 org.pf4j pf4j-spring-parent - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT pom PF4J-Spring Parent PF4J-Spring Integration