@SpringBean 支持子 ApplicationContext 中的 bean

@SpringBean support for bean in child ApplicationContext

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

关于如何实现这一点有什么想法吗?

感谢您的帮助!

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

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

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

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

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