@SpringBean支持子ApplicationSetext中的bean

时间:2016-02-24 17:10:39

标签: java spring wicket pf4j

我正与PF4J(Plugin Framework for Java)的开发人员合作,为Wicket提供更好的插件功能。已经有一个pf4j-spring和一个pf4j-wicket项目来提供一些基本的集成。为了允许@SpringBean或@Inject注释访问子上下文中的插件bean,我们需要能够查找与特定类关联的ApplicationContext。

例如,假设我在子(插件)ApplicationContext中有一个MyService bean,该插件还提供了一个需要通过@SpringBean注释的面板。 Spring不允许父ApplicationContext在子上下文中查看bean,并且有充分的理由。因此,我们会得到一个异常,说无法找到bean,因为@SpringBean只查找父上下文中的bean。我们已经开发了一些代码来查找子上下文:

SpringPlugin plugin = (SpringPlugin)PluginManager.whichPlugin(MyService.class);
ApplicationContext pluginContext = plugin.getApplicationContext();

如何在SpringComponentInjector的自定义版本中修改或提供此功能?它使用ISpringContextLocator但该上下文定位器不指定它需要ApplicationContext的类。

关于如何实现这一目标的任何想法?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我担心目前SpringComponentInjector没有为这种用法做好准备。您必须创建自己的版本。

我看到的问题是你必须拥有与插件一样多的IComponentInstantiationListeners。或者创建一个复合ICIL,为每个插件委托SpringBeanLocators。我认为复合材料会更好。然后你必须确保pluginA中的Panel不能使用SpringBeanLocatorB所在的bean。

如果你设法做到并且你在wicket-spring中发现了一些可以更通用的东西来帮助你简化你的版本那么请告诉我们,我们会考虑你的建议!

答案 1 :(得分:0)

看看sbp。它构建在pf4j之上以支持Spring Boot,并且还提供了在主应用程序和插件之间共享bean的机制。看起来像:

    @Override
    protected SpringBootstrap createSpringBootstrap() {
        return new SharedDataSourceSpringBootstrap(this, MdSimplePluginStarter.class)
            .addSharedBeanName("objectMapper")
            .addSharedBeanName("cacheService");
    }