Понимание контекстов в Spring MVC

Я новичок в spring, и я создаю простое веб-приложение. Я читал о контекстах в spring MVC.

Я использую плагин STS для eclipse. Я создал Spring Проект MVC с использованием плагина.

Теперь у меня есть три xml-документа в проекте: web.xml, root-context.xml и servlet-context.xml. Они были созданы STS для меня.

  • В web.xml диспетчерский сервлет указывает на servlet-context.xml, и я понимаю, что задача сервлетов диспетчера заключается в создании контекста веб-приложения, который знает, как разрешать представления и является местом для контроллера beans существовать. Правильно ли я понимаю? Если да, то какая другая работа выполняется в этом контексте?

  • Теперь есть файл с именем root-context.xml, который имеет компонентное сканирование на моем проекте по умолчанию. Мое понимание заключается в том, что этот контекст должен иметь глобальный beans, который может использовать множество сервлетов. Правильно ли я понимаю? Что еще это делает? Какой контекст создается с помощью этого файла?

  • Теперь я продолжаю работу над проектом, и у меня есть несколько файлов * -context.xml(dao-context.xml, security-context.xml и т.д.), которые загружаются с помощью contextLoaderListner (в web.xml), Это хорошая идея? Или все должно идти в servlet-context.xml? Я думаю, что неплохо иметь разные контексты, поскольку это разделяет беспокойство. Комментарии? Кроме того, какой контекст создается из этих файлов * -context.xml? Каково правильное расположение папок для этих файлов?

  • Web.xml предназначен для контейнера сервлета, такого как tomcat и т.д., и все остальные файлы xml в проекте предназначены для контейнера spring. Это верно? Все эти файлы разделены, чтобы обеспечить разделение беспокойства?

  • Сколько контекстов приложений и контекстов веб-приложений существует в текущем сценарии?

Зачем кому-то нужно больше одного сервлера диспетчера?

Зачем кому-то нужен более одного контекста приложения?

Мысли? Комментарии? Поправки? Лучшие практики?

Ответ 1

Вся эта идея заключается в том, чтобы обрабатывать различные архитектурные уровни в типичном веб-приложении и обеспечивать механизм наследования/переопределения для beans через контексты. Каждый тип контекста в Spring относится к другому архитектурному уровню, например, к веб-уровню, уровню обслуживания и т.д.

В веб-приложении на основе Spring может быть настроено несколько сервлетов диспетчера (хотя в большинстве случаев его единственный сервлет, но диспетчерский сервлет - сервлет, тем не менее, и может быть несколько настроено в web.xml). Они могут быть настроены для обработки разных шаблонов URL. Таким образом, очевидно, что каждый из них является другим сервлетом и, следовательно, может иметь другой контекст веб-приложения Spring. Каждый из них может содержать различные конфигурации для веб-уровня Spring, такие как контроллеры, перехватчики, средства просмотра представлений, реляторы локали и т.д., Поскольку они обычно относятся к веб-уровню приложения. Все эти конфигурации и beans являются закрытыми для каждого сервлета диспетчера, поэтому они не видны друг другу. Следовательно, наличие отдельного контекста веб-приложения Spring имеет смысл включить эту конфиденциальность. Однако существуют другие beans, которые предназначены для совместного использования, поэтому относятся к корневому контексту. Таким образом, все связанные вещи принадлежат корневому контексту, и его можно считать глобальным для этого веб-приложения.

Каждый сервлет диспетчера наследует все beans, определенные в корневом контексте. Однако важно отметить, что общий beans может быть переопределен соответствующим диспетчерским сервлетом beans. Таким образом, в веб-приложениях корневой контекст можно рассматривать как нечто, которое унаследовано, но может быть переопределено.

Ответ 2

Хорошо spring не заставляет вас иметь xml файлы таким образом, вы можете очень хорошо работать со всеми, используя только один файл xml, который будет servlet-context.xml и использовать только сервлет диспетчера. Как правило, для определения вашей службы beans или dao beans существуют разные файлы, поэтому это в основном зависит от дизайна вашего приложения, например, если вы используете spring безопасность, вы можете добавить еще один XML файл, например security-context.xml, как я уже сказал, это зависит от дизайна. Вы действительно можете полностью исключить прослушиватель контекстного загрузчика и все еще управлять всем, используя диспетчерский сервлет. Ваш вопрос слишком широк, поскольку вы новичок в spring, возможно, вам следует получить более подробную информацию о контейнерах spring и решить, что вам подходит. Обычно я использую свой servlet-context.xml в WEB-INF и другой конфигурации, такой как service-context.xml в classpath, опять же это не строгое правило, как мне это подходит.