2013-05-21 2 views
1

У меня есть приложение spring-mvc, которое имеет автообученные бобы, используя <context:component-scan base-package="com.example.app" /> в конфигурации контекста DispatcherServlet.Как я могу получить компонент из контекста сервлета вместо корневого контекста?

У меня теперь есть ситуация, когда я хочу получить доступ к сервису bean из класса non bean, в частности, к реализации RequestContextAwareTag.

я могу получить доступ к фасоли, зарегистрированных в корневом контексте следующим образом:

ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(
     pageContext.getSession().getServletContext()); 
MyService svc = ctx.getBean(MyService.class); 

Если компонент зарегистрирован в диспетчерском контексте я получаю NoSuchBeanDefinitionException.

Если это возможно, я бы на самом деле предпочитаю мои @Service бобы должны быть зарегистрированы в корневом контексте без @Controller бобов подхватили, а затем имею @Controller бобы взял в диспетчерском контексте. Проблема с <context:component-scan/> - это выбор обоих.

Если это невозможно, мне нужен способ получить доступ к диспетчерам ApplicationContext для извлечения сервисных компонентов.

Любое руководство будет очень оценено.

+0

Вы пробовали реализации ApplicationContextAware и инстанцировании этот класс в файле конфигурации боба? – shazin

+0

К сожалению, это невозможно для тега, поскольку они созданы на каждой странице запроса тег используется. –

ответ

2

Мне удалось решить эту проблему, разделив две конфигурации component-scan с помощью exclude-filter и include-filter.

корневой контекст:

сервлетов контекст:

<mvc:annotation-driven/> 
<context:component-scan base-package="com.example.app"> 
    <context:include-filter 
    expression="org.springframework.stereotype.Controller" 
    type="annotation"/> 
</context:component-scan> 
+0

root-context означает, что компонент bean объявлен в web-xml с тегом «context-param»? – verystrongjoe

Смежные вопросы