Spring: Как организовать приложение + веб-контексты? - PullRequest
3 голосов
/ 23 октября 2010

Сценарий:

  1. Запустите приложение и загрузите ClassPathXmlApplicationContext в main (), это запустит веб-приложение Jetty.
  2. сервлет диспетчера, затем загрузит XmlWebApplicationContext
  3. Диспетчерский сервлет затем ищет WEB-INF/applicaitonContext.xml для загрузки в качестве корневого контекста

Я просто пытаюсь разобраться с контекстами.

  • Должен ли я использовать 3 контекста, как указано выше?
  • Должен ли я использовать первый контекст в качестве корневого контекста и не разрешать диспетчеру загружать по умолчанию WEB-INF/applicationContext?
  • Должен ли я создавать отношения родитель / ребенок между 1-м и 3-м контекстом?(это делается для меня между контекстами # 2 и # 3 сервлетом-диспетчером)

Мне просто пока не совсем понятно, как эти контексты связаны друг с другом, мне просто нужно краткое изложениена нем.

1 Ответ

7 голосов
/ 23 октября 2010

Контекст # 1 вообще не связан с другими контекстами, это просто деталь реализации того, как вы запускаете свой веб-сервер (Jetty). Контексты № 2 и № 3 несколько поясняются в справочной документации Spring .

  • Контекст # 2 загружен из WEB-INF/[servlet-name]-servlet.xml. Поскольку может быть много DispatcherServlets, в одном веб-приложении может быть несколько таких контекстов для разных сервлетов.
  • Контекст # 3 обычно загружается из WEB-INF/applicationContext.xml, и для его загрузки необходимо предпринять особые шаги (используйте ContextLoaderListener ). Этот загруженный контекст становится родительским контекстом (общим) всех определенных контекстов сервлета в конкретном веб-приложении. Таким образом, он подходит для загрузки bean-компонентов бизнес-служб и bean-компонентов доступа к базе данных.

Настройка, которую вы обрисовали, в порядке. На самом деле, я бы назвал это рекомендуемой установкой, поскольку она упрощает и приближает к тому, как создаются контексты Spring в типичном веб-приложении.

Тем не менее:

Вы можете избавиться от контекста # 3 , если вы не хотите хранить свои бизнес-компоненты в отдельном контексте. Тем не менее, я бы порекомендовал вам хранить их отдельно (вам может понадобиться перенести их на другой компьютер позже и сделать доступным через какой-то механизм удаленного взаимодействия).

Еще одна причина избавиться от контекста # 3 : вы можете поделиться своими бизнес-бинами между несколькими веб-приложениями. Для этого вам понадобится специальный подкласс Spring ContextLoader, а затем поработайте над тем, как Jetty запускает ваши веб-приложения. Я сделал это и могу при необходимости дать несколько советов.

Наконец, вы можете избавиться от контекста # 1 и заменить его старым школьным чистым Java-кодом, который загрузит Jetty. Это решение на 100% зависит от вас и зависит от ваших предпочтений. Для записи, я также хотел бы использовать отдельное Spring applicationContext для начальной загрузки Jetty.

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