Почему DispatcherServlet создает другой контекст приложения?

Я настроил контекст корневого приложения, используя ContextLoaderListener и параметр инициализации контекста contextConfigLocation .

Затем к корневому контексту обращается преобразователь переменных JSF (* .jsf). Работает нормально.

Теперь проблема в том, что запросы (* .do), проходящие через DispatcherServlet , получат другой контекст приложения, а затем экземпляры одноэлементных bean-компонентов создаются дважды.

Мне не нужен другой контекст приложения для DispatcherServlet , как я могу указать его для повторного использования существующего корневого контекста приложения, который загружается ContextLoaderListener ?

ПРИМЕЧАНИЕ

После прочтения справочных страниц в ответах я знаю, что существует разделение контекста между корневым контекстом и контекстом диспетчера, но ни одна из ссылок не говорит мне, куда идти. Итак, вот мое решение, которое может быть полезно для других людей, которые сталкиваются с аналогичным вопросом:

  1. В XML конфигурации контекста для сервлета диспетчера: dispatcher-servlet.xml , я продублировал определенные , который уже определен в корневом контексте. Так что удали его. dispatcher-servlet.xml должен определять только те bean-компоненты, используемые только для Spring MVC.

  2. Все контроллеры уже просканированы и созданы в корневом контексте, однако Spring MVC по умолчанию не регистрирует контроллеры в корневом контексте для сопоставления запросов. Вы можете либо:

    2.1. В корневом контексте исключите @Controller из и просканируйте @Controller только в dispatcher-servlet.xml.

    2.2. Или установите для свойства DefaultAnnotationHandlerMapping.detectHandlersInAncestorContexts значение true:

     (dispatcher-servlet.xml:) 
     
      
      
      
     
25
задан Xiè Jìléi 21 October 2011 в 09:14
поделиться