具有Web应用程序上下文的Spring上下文层次结构

时间:2011-05-18 12:23:47

标签: java spring spring-mvc

我正在处理使用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。我是否忽略了某些东西,或者是否有更好/更容易的方式以不同的方式实现同​​样的目标?

1 个答案:

答案 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。