Я настроил контекст корневого приложения, используя ContextLoaderListener
и параметр инициализации контекста contextConfigLocation
.
Затем к корневому контексту обращается преобразователь переменных JSF (* .jsf). Работает нормально.
Теперь проблема в том, что запросы (* .do), проходящие через DispatcherServlet
, получат другой контекст приложения, а затем экземпляры одноэлементных bean-компонентов создаются дважды.
Мне не нужен другой контекст приложения для DispatcherServlet
, как я могу указать его для повторного использования существующего корневого контекста приложения, который загружается ContextLoaderListener
?
ПРИМЕЧАНИЕ
После прочтения справочных страниц в ответах я знаю, что существует разделение контекста между корневым контекстом и контекстом диспетчера, но ни одна из ссылок не говорит мне, куда идти. Итак, вот мое решение, которое может быть полезно для других людей, которые сталкиваются с аналогичным вопросом:
В XML конфигурации контекста для сервлета диспетчера: dispatcher-servlet.xml
, я продублировал определенные
, который уже определен в корневом контексте. Так что удали его. dispatcher-servlet.xml
должен определять только те bean-компоненты, используемые только для Spring MVC.
Все контроллеры уже просканированы и созданы в корневом контексте, однако Spring MVC по умолчанию не регистрирует контроллеры в корневом контексте для сопоставления запросов. Вы можете либо:
2.1. В корневом контексте исключите @Controller
из
и просканируйте @Controller
только в dispatcher-servlet.xml.
2.2. Или установите для свойства DefaultAnnotationHandlerMapping.detectHandlersInAncestorContexts
значение true:
(dispatcher-servlet.xml:)