我正在处理使用DispatcherServlet
引导的Spring MVC Web应用程序。它创建了一个XmlWebApplicationContext
来管理整个应用程序:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
现在有些模块应该在运行时使用ContextSingletonBeanFactoryLocator
加载。因此,每个模块都有自己的ClasspathXmlApplicationContext
。为了使模块可以引用XmlWebApplicationContext
中的bean,它应该附加到XmlWebApplicationContext
以形成一个上下文层次结构,其中XmlWebApplicationContext
应该扮演父亲和{{1}的角色模块中子上下文的作用。不幸的是我无法使用
ClasspathXmlApplicationContext
因为到目前为止我没有办法给<beans>
<bean id="moduleContext"
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
...
</constructor-arg>
<constructor-arg ref="parentContext" />
</bean>
</beans>
这个名字WebApplicationContext
。我是否忽略了某些东西,或者是否有更好/更容易的方式以不同的方式实现同样的目标?
答案 0 :(得分:2)
如果您使用的是注释,则可以执行以下操作:
@Inject
private XmlWebApplicationContext context;
@Inject
private List<ClassPathXmlApplicationContext> childs;
@PostConstruct
public void refreshContext() {
for(ClassPathXmlApplicationContext appContext : childs) {
appContext.setParent(context);
}
context.refresh();
}
通过使用接口InitializingBean和ApplicationContextAware,您也可以在没有注释的情况下执行此操作。
编辑: childs
按类型自动装配,因此Spring将注入所有作为ClassPathXmlApplicationContext实例的bean。