Comments (2)
@ramymagdy
Your code is OK but I don't like that we cannot extract something reusable components (for example ExtensionsInjector
, SpringPluginManager
) that can be used out of the box by someone else.
I tried to move forward the project in this direction.
For example the new version for ExtensionInjector
could be:
public class ExtensionsInjector {
private static final Logger log = LoggerFactory.getLogger(ExtensionsInjector.class);
private final PluginManager pluginManager;
public ExtensionsInjector(PluginManager pluginManager) {
this.pluginManager = pluginManager;
}
@PostConstruct
public void injectExtensions(SingletonBeanRegistry beanRegistry) {
ExtensionFactory extensionFactory = pluginManager.getExtensionFactory();
// add extensions from classpath (non plugin)
Set<String> extensionClassNames = pluginManager.getExtensionClassNames(null);
for (String extensionClassName : extensionClassNames) {
try {
log.debug("Register extension '{}' as bean", extensionClassName);
Class<?> extensionClass = getClass().getClassLoader().loadClass(extensionClassName);
registerExtension(extensionFactory.create(extensionClass), beanRegistry);
} catch (ClassNotFoundException e) {
log.error(e.getMessage(), e);
}
}
// add extensions for each started plugin
List<PluginWrapper> startedPlugins = pluginManager.getStartedPlugins();
for (PluginWrapper plugin : startedPlugins) {
log.debug("Registering extensions of the plugin '{}' as beans", plugin.getPluginId());
extensionClassNames = pluginManager.getExtensionClassNames(plugin.getPluginId());
for (String extensionClassName : extensionClassNames) {
try {
log.debug("Register extension '{}' as bean", extensionClassName);
Class<?> extensionClass = plugin.getPluginClassLoader().loadClass(extensionClassName);
registerExtension(extensionFactory.create(extensionClass), beanRegistry);
} catch (ClassNotFoundException e) {
log.error(e.getMessage(), e);
}
}
}
}
protected void registerExtension(Object extension, SingletonBeanRegistry beanRegistry) {
beanRegistry.registerSingleton(extension.getClass().getName(), extension);
}
}
Also tried to create a SpringPluginManager
that it's a decorator (see decorator/wrapper pattern) over a PluginManager
and that comes with a concrete implementation (SpringExtensionFactory
) for createExtensionFactory()
method.
I am not a Spring expert and from this reason I don't know how to resolve the problem in an elegant and simple mode.
from pf4j-spring.
I think that actual code (4fc56f8) resolve this issue.
from pf4j-spring.
Related Issues (20)
- Concrete bean could not be received from the application context HOT 1
- SpringPlugin start/stop/start results in Exception HOT 2
- Loading plugin on-runtime : Ambiguous hander methods mapped & ConcurrentModificationException when unregistering routes
- I use it SpringPluginManager, It seems to be a single case. HOT 4
- How to update the βList<Greeting>β while some plugins unloaded and deleted? HOT 4
- How to add integration tests for the plugin?
- self contained example HOT 1
- Jpa in plug-in not working HOT 1
- Hi author, Can I send a pull request to PF4J-Spring to support the Spring parent-child context οΌ
- Injecting beans from plugin in application doesn't work HOT 2
- run exception on pf4j-spring demo
- pf4j plugin needs to refresh and detect changes automatically with spring HOT 6
- How to get this repo versions release notes? HOT 2
- Problems with Using Pf4j-Spring HOT 1
- The real implementation cannot be accessed through the api interface. HOT 2
- When 'spring-boot-devtools' is introduced in the project, the extensions are not available. HOT 2
- How do you extend with kafka HOT 1
- Retrieve Resource from Inside Plugin HOT 1
- When will plan support Spring6.x ? HOT 6
- Is there a plan to release version 0.9.0 or 0.8.1 to incorporate the changes from commit 5d26e9b? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. πππ
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google β€οΈ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pf4j-spring.