Spring Контекстная иерархия с контекстом веб-приложения

Я имею дело с веб-приложением Spring MVC, которое загрузилось с помощью DispatcherServlet. Он создает 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. Чтобы модуль мог ссылаться на beans на XmlWebApplicationContext, он должен быть привязан к XmlWebApplicationContext для формирования контекстной иерархии, в которой XmlWebApplicationContext должен играть роль родителя и ClasspathXmlApplicationContext модуля. роль детского контекста. К сожалению, я не могу подключить их, используя

<beans>
    <bean id="moduleContext"
        class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            ...
        </constructor-arg>
        <constructor-arg ref="parentContext" />
    </bean>
</beans>

потому что я не нашел пути до сих пор, чтобы дать WebApplicationContext имя parentContext. Я что-то пропустил или есть лучший/более простой способ добиться того же по-другому?

Ответ 1

Если вы используете аннотации, вы можете сделать это:

@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 является autwired по типу, поэтому Spring будет вводить все bean, которые являются экземпляром ClassPaспасибоmlApplicationContext.