Назначение и взаимосвязь различных контекстов в Spring

Я использую проект загрузки spring. Я хочу понять цель и отношение разных контекстов?

Например, spring Контекст безопасности, spring Контекст, контекст сервлета и т.д. (Есть ли еще какие-то контексты?)

Ответы

Ответ 1

Могут быть разные интерпретации, но вот как я это вижу:

  • Spring Контекст безопасности, в значении SecurityContext класс содержит аутентификацию, имя пользователя, полномочия (роли) и, возможно, другую информацию о текущем пользователе. Продолжительность такого контекста - текущий запрос, или контекст безопасности сохраняется между запросами, используя сеансы.

  • Spring Контекст, в значении ApplicationContext class, является центральной точкой работающего приложения Spring. Его основная цель состоит в том, чтобы содержать приложение singleton beans, но у него есть много других отличных функций (несколько упомянутых в другом ответе). Приложение может иметь несколько ApplicationContext, но самый распространенный и самый простой случай, он имеет только один. Веб-приложения обычно используют расширение WebApplicationContext, которое интегрирует его с контекстом сервлета.

  • Контекст сервлета, значение класса ServletContext - это контекст приложения веб-приложение Servlet. Всегда существует один экземпляр экземпляра webapp в контейнере сервлетов, таком как Tomcat. Это не часть Spring. Вы редко используете его непосредственно при использовании Spring. Но он находится в фоновом режиме.

"Контекст" - довольно общий термин, поэтому в вашей среде могут быть и другие контексты.

Ответ 2

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

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

Иерархия выглядит следующим образом "root" contextany other context. Это просто.

Описание здесь, в Spring Docs ApplicationContext:

  • Bean factory методы доступа к компонентам приложения. (Приятный разговор о вещах, которые вам нужны в вашем приложении, без использования new() под названием инъекции зависимостей)
  • Возможность загрузки файловых ресурсов в общем виде. (Внешняя конфигурация с свойствами и profiles)
  • Возможность публикации событий зарегистрированным слушателям. (Причудливый разговор о том, "когда что-то происходит", читайте о шаблоне наблюдателя)
  • Возможность разрешать сообщения для поддержки интернационализации. (Файлы, которые содержат все строки, используемые в вашем приложении, чтобы они могли отображаться на разных языках, читайте MessageSource)
  • Наследование из родительского контекста. (Как я уже говорил, вашему приложению нужен "контекст", и именно здесь он начинается.)

Когда вы используете загрузку Spring, по умолчанию существует только один контекст: ApplicationContext. Это будет содержать все ваши вещи (Beans) и компоненты, которые вам нужны.

Infact, что красота использования Spring загрузки, минимальной конфигурации и упрощенной конфигурации. Если вы считаете, что вам нужны несколько Контекстов, я бы настоятельно рекомендовал вам использовать profiles.

В конечном итоге "Контекст" создается и определяется вашим Приложением, думайте об этом как о конфигурации (будь то XML или Java), которая определяет ваше приложение. что "в нем" и что "нужно" для работы.

Если вы хотите попытаться понять его больше, я бы попросил вас прочитать его с самого начала и начать с Введение в Spring.

Ответ 3

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

ServletContext

ServletContext является частью технологии сервлетов. Многие основы основаны на этой технологии (JSF, Spring, Struts и многие другие). ServletContext содержит функциональные возможности для связи с его контейнером Servlet (например, Tomcat, Glassfish и т.д.). Основные вещи, которые ServletContext обеспечивают:

  • получить приложение Начальные параметры;
  • получить информацию о диспетчеризации запроса;
  • добавить или удалить сервлеты, фильтры и прослушиватели;
  • получить или установить атрибуты контейнера;
  • сообщения о времени выполнения журнала;
  • получите дополнительную информацию, такую ​​как "Путь к приложению", "Контейнерная версия" и т.д.

Как вы видите, есть только базовые функции, которые могут быть полезны в любом месте приложения, если вы будете работать с технологией Servlet (например, разработать на основе этого еще один mvc-framework).

ApplicationContext

ApplicationContext является основным интерфейсом приложения Spring framework. Он имеет множество реализаций. Одна из них загружает конфигурацию из xml файла (ClassPaспасибоmlApplicationContext), другая загружает конфигурацию на основе аннотаций (AnnotationConfigApplicationContext) и так далее. Основные вещи, которые ApplicationContext обеспечивают:

  • bean factory, возможность создания новых beans на основе определений bean;
  • загружать ресурсы из разных источников (файловая система, файлы jar, url и т.д.);
  • возможность публикации и прослушивания событий;
  • разрешать сообщения из пакетов сообщений;

Опять же, инициализированный при запуске, эта базовая функциональность может быть полезна практически в любом месте вашего приложения. Вот почему он собрал контекст. Многие классы используются в фоновом режиме, чтобы обеспечить эти возможности, но все, что вам нужно знать, использовать эту функциональность - просто ApplicationContext.

SecurityContext

SecurityContext обеспечивает доступ к данным аутентификации. Вы можете получить имя аутентифицированного пользователя, роли и другие данные. Эта информация, инициализированная модулем безопасности, может потребоваться во многих местах. Компоненты, которые используют эту информацию, ничего не знают о классах модуля безопасности. Они просто получают всю необходимую информацию от SecurityContext.