Назначение и взаимосвязь различных контекстов в Spring
Я использую проект загрузки spring. Я хочу понять цель и отношение разных контекстов?
Например, spring Контекст безопасности, spring Контекст, контекст сервлета и т.д. (Есть ли еще какие-то контексты?)
Ответы
Ответ 1
Могут быть разные интерпретации, но вот как я это вижу:
-
Spring Контекст безопасности, в значении SecurityContext класс содержит аутентификацию, имя пользователя, полномочия (роли) и, возможно, другую информацию о текущем пользователе. Продолжительность такого контекста - текущий запрос, или контекст безопасности сохраняется между запросами, используя сеансы.
-
Spring Контекст, в значении ApplicationContext class, является центральной точкой работающего приложения Spring. Его основная цель состоит в том, чтобы содержать приложение singleton beans, но у него есть много других отличных функций (несколько упомянутых в другом ответе). Приложение может иметь несколько ApplicationContext, но самый распространенный и самый простой случай, он имеет только один. Веб-приложения обычно используют расширение WebApplicationContext, которое интегрирует его с контекстом сервлета.
-
Контекст сервлета, значение класса ServletContext - это контекст приложения веб-приложение Servlet. Всегда существует один экземпляр экземпляра webapp в контейнере сервлетов, таком как Tomcat. Это не часть Spring. Вы редко используете его непосредственно при использовании Spring. Но он находится в фоновом режиме.
"Контекст" - довольно общий термин, поэтому в вашей среде могут быть и другие контексты.
Ответ 2
Существует много "контекстов" и их загрузка зависит от того, как вы инициализируете свое приложение. Но обычно большинство приложений имеют один контекст, содержащий все beans и компоненты, которые требуется вашему приложению.
Например, если вы загрузили приложение с помощью сервлета, вы можете загрузить все с помощью "корневого контекста", который также загружает контекст сервлета в качестве его дочернего элемента.
Иерархия выглядит следующим образом "root" context
→ any 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
.