1

我正在与PF4J(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 的类。

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

谢谢你的帮助!

4

2 回答 2

0

恐怕目前SpringComponentInjector还没有为这种用途做好准备。您必须创建自己的版本。

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

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

于 2016-02-25T09:50:23.500 回答
0

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

    @Override
    protected SpringBootstrap createSpringBootstrap() {
        return new SharedDataSourceSpringBootstrap(this, MdSimplePluginStarter.class)
            .addSharedBeanName("objectMapper")
            .addSharedBeanName("cacheService");
    }
于 2019-12-11T12:40:34.543 回答