如何在运行时在不同的上下文中引用Spring bean

时间:2015-11-16 16:01:39

标签: java spring spring-integration lazy-initialization

所有

我有一个applicationContext,其中的bean在我的应用程序启动时初始化 - 我将调用此父上下文。

我有另一个applicationContext(辅助) - 它在运行时部署到我的应用程序中 - 它们中的bean被手动读取并加载到我的父上下文中,我这样做先加载所有bean然后将它们注册为单例我的父上下文 - 下面显示了一个片段。这可以按预期工作。

ApplicationContext fileContext = new     FileSystemXmlApplicationContext("file:" + fileList.get(i).getPath());
Map<String, List> beansOfType = fileContext.getBeansOfType(List.class, false, false);
String[] beanNames = fileContext.getBeanDefinitionNames();
ConfigurableApplicationContext parentConfContext = (ConfigurableApplicationContext)parentContext;
BeanDefinitionRegistry beanReg = (BeanDefinitionRegistry)parentConfContext.getAutowireCapableBeanFactory();
for (String string : beanNames) {
try {
    beanReg.removeBeanDefinition(string);
} 
catch (NoSuchBeanDefinitionException e) {
// TODO Auto-generated catch block
}
parentConfContext.getBeanFactory().registerSingleton(string,     fileContext.getBean(string));
}

现在我想在我的辅助应用程序上下文中引用父上下文中的bean(我在父上下文中传递bean作为我的辅助上下文中的属性引用) - 但是当我这样做时,我得到一个'No bean命名'例外。这很明显,因为辅助上下文不知道父上下文。

我已尝试在次要上下文中将lazy-init =“true”设置为bean - 但这没有帮助 - 有人可以建议如何过来吗?

问候 d

2 个答案:

答案 0 :(得分:1)

如果你从子上下文中引用一些父bean,你只需要说一下关于你父母的子上下文:

ConfigurableApplicationContext parentConfContext = (ConfigurableApplicationContext)parentContext;

ApplicationContext fileContext = 
    new FileSystemXmlApplicationContext(new String[] {"file:" + fileList.get(i).getPath()}, 
                           parentConfContext);

答案 1 :(得分:0)

在Spring中,上下文是独立的。如果要在两个上下文中加载bean,则需要一个公共配置文件/类。

例如,您有第一个上下文的文件/类A和第二个上下文的文件/类B.然后,如果你有一个需要在A和B上下文中的bean,你需要一个带有该bean定义的第三个文件/类C.最后,您需要将文件/类C导入A和B。

https://spring.io/understanding/application-context