Spring Context Hierarchy с контекстом веб-приложения - PullRequest
10 голосов
/ 18 мая 2011

Я имею дело с веб-приложением 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.Чтобы модуль мог ссылаться на bean-компоненты из 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 Ответ

2 голосов
/ 18 мая 2011

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

@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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...