Java @SpringBean支持子ApplicationContext中的bean
我正在与的开发人员合作,为Wicket提供更好的插件功能。已经有一个pf4j spring和一个pf4j wicket项目来提供一些基本的集成。为了允许@SpringBean或@Inject注释在子上下文中访问插件bean,我们需要能够查找与特定类关联的ApplicationContext 例如,假设我在一个子(插件)ApplicationContext中有一个MyService bean,该插件还提供了一个面板,该面板需要通过@SpringBean注释来实现。Spring不允许父应用程序上下文在子上下文中查看bean,这是有充分理由的。因此,我们会得到一个异常,即无法找到bean,因为@SpringBean只在父上下文中查找bean。我们开发了一些代码,可以像这样查找子上下文:Java @SpringBean支持子ApplicationContext中的bean,java,spring,wicket,pf4j,Java,Spring,Wicket,Pf4j,我正在与的开发人员合作,为Wicket提供更好的插件功能。已经有一个pf4j spring和一个pf4j wicket项目来提供一些基本的集成。为了允许@SpringBean或@Inject注释在子上下文中访问插件bean,我们需要能够查找与特定类关联的ApplicationContext 例如,假设我在一个子(插件)ApplicationContext中有一个MyService bean,该插件还提供了一个面板,该面板需要通过@SpringBean注释来实现。Spring不允许父应用程序上下文
SpringPlugin plugin = (SpringPlugin)PluginManager.whichPlugin(MyService.class);
ApplicationContext pluginContext = plugin.getApplicationContext();
如何在SpringComponentInjector的自定义版本中修改或提供此功能?它使用ISpringContextLocator,但该上下文定位器未指定需要ApplicationContext的类
关于如何实现这一点有什么想法吗
谢谢你的帮助 恐怕current
SpringComponentInjector
不适合这种使用。您必须创建自己的版本
我看到的问题是,您必须拥有与插件数量相同的IComponentInstanceListener。或者创建一个复合ICIL,将每个插件委托给SpringBeanLocator。我认为复合材料会更好。然后,您必须确保pluginA中的面板不能使用springbeanlotorb定位的bean
<>如果你设法做到这一点,你在WikEt Spring中找到一些可以使你的版本更简单的东西,那么请让我们知道,我们会考虑你的建议!p> 恐怕current
SpringComponentInjector
不适合这种使用。您必须创建自己的版本
我看到的问题是,您必须拥有与插件数量相同的IComponentInstanceListener。或者创建一个复合ICIL,将每个插件委托给SpringBeanLocator。我认为复合材料会更好。然后,您必须确保pluginA中的面板不能使用springbeanlotorb定位的bean
<>如果你设法做到这一点,你在WikEt Spring中找到一些可以使你的版本更简单的东西,那么请让我们知道,我们会考虑你的建议!p> 看一看。它构建在pf4j之上,支持Spring引导,还提供了在主应用程序和插件之间共享bean的机制。它看起来像:
@Override
protected SpringBootstrap createSpringBootstrap() {
return new SharedDataSourceSpringBootstrap(this, MdSimplePluginStarter.class)
.addSharedBeanName("objectMapper")
.addSharedBeanName("cacheService");
}
看一看。它构建在pf4j之上,支持Spring引导,还提供了在主应用程序和插件之间共享bean的机制。它看起来像:
@Override
protected SpringBootstrap createSpringBootstrap() {
return new SharedDataSourceSpringBootstrap(this, MdSimplePluginStarter.class)
.addSharedBeanName("objectMapper")
.addSharedBeanName("cacheService");
}
谢谢martin-g。这与我采取的方法非常相似。我创建了一个ICIL,它基本上基于组件的类加载器路由请求。我确实制作了自己的wicket spring项目自定义版本,并修改了ISpringContextLocator.getApplicationContext以获取bean的类参数。幸运的是,无论在哪里,这都是可用的。我还在试验。如果我们有进展,我会告诉你的。谢谢你的回答。谢谢martin-g。这与我采取的方法非常相似。我创建了一个ICIL,它基本上基于组件的类加载器路由请求。我确实制作了自己的wicket spring项目自定义版本,并修改了ISpringContextLocator.getApplicationContext以获取bean的类参数。幸运的是,无论在哪里,这都是可用的。我还在试验。如果我们有进展,我会告诉你的。谢谢你的回答。