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.