Коренные и дочерние контексты Прежде чем читать дальше, пожалуйста, поймите, что -
Spring может иметь несколько контекстов одновременно. Одним из них будет корневой контекст, а все остальные контексты будут дочерними контекстами.
Все дочерние контексты могут получить доступ к bean-компонентам, определенным в корневом контексте; но обратное не верно. Корневой контекст не может получить доступ к дочерним контекстам bean.
ApplicationContext:
applicationContext.xml - это корневая контекстная конфигурация для каждого веб-приложения. Spring загружает файл applicationContext.xml и создает ApplicationContext для всего приложения. В каждом веб-приложении будет только один контекст приложения. Если вы явно не объявляете имя файла конфигурации контекста в файле web.xml с помощью параметра contextConfigLocation, Spring выполнит поиск applicationContext.xml в папке WEB-INF и сгенерирует исключение FileNotFoundException, если не удалось найти этот файл.
ContextLoaderListener Выполняет фактическую работу инициализации для контекста корневого приложения. Считывает контекстный параметр «contextConfigLocation» и передает его значение экземпляру контекста, анализируя его в потенциально множественных файловых путях, которые могут быть разделены любым количеством запятых и пробелов, например «WEB-INF / applicationContext1.xml, WEB-INF / applicationContext2.xml». ContextLoaderListener является необязательным. Просто чтобы подчеркнуть: вы можете загрузить приложение Spring без какой-либо настройки ContextLoaderListener, просто базовый минимум web.xml с DispatcherServlet.
DispatcherServlet DispatcherServlet по сути является сервлетом (он расширяет HttpServlet), основной целью которого является обработка входящих веб-запросов, соответствующих настроенному шаблону URL. Он принимает входящий URI и находит правильную комбинацию контроллера и вида. Так что это передний контроллер.
Когда вы определяете DispatcherServlet в весенней конфигурации, вы предоставляете XML-файл с записями классов контроллеров, отображений представлений и т. Д., Используя атрибут contextConfigLocation.
WebApplicationContext Помимо ApplicationContext, в одном веб-приложении может быть несколько WebApplicationContext. Проще говоря, каждый DispatcherServlet связан с одним WebApplicationContext. Файл xxx-servlet.xml специфичен для DispatcherServlet, и веб-приложение может иметь более одного DispatcherServlet, настроенного для обработки запросов. В таких сценариях для каждого DispatcherServlet будет настроен отдельный файл xxx-servlet.xml. Но applicationContext.xml будет общим для всех файлов конфигурации сервлета. Spring по умолчанию загрузит файл с именем «xxx-servlet.xml» из папки WEB-INF вашего веб-приложения, где xxx - это имя сервлета в web.xml. Если вы хотите изменить имя этого файла или изменить местоположение, добавьте initi-param с contextConfigLocation в качестве имени параметра.
Сравнение и связь между ними:
ContextLoaderListener против DispatcherServlet
ContextLoaderListener создает корневой контекст приложения. Записи DispatcherServlet создают один дочерний контекст приложения для каждой записи сервлета. Дочерние контексты могут обращаться к bean-компонентам, определенным в корневом контексте. Бины в корневом контексте не могут получить доступ к бинам в дочерних контекстах (напрямую). Все контексты добавляются в ServletContext. Вы можете получить доступ к корневому контексту, используя класс WebApplicationContextUtils.
После прочтения документации Spring, следующее понимание:
a) Контексты приложения являются иерархическими, как и WebApplicationContexts. Обратитесь к документации здесь.
b) ContextLoaderListener создает корневой контекст веб-приложения для веб-приложения и помещает его в ServletContext. Этот контекст может использоваться для загрузки и выгрузки bean-компонентов, управляемых пружиной, независимо от того, какая технология используется на уровне контроллера (Struts или Spring MVC).
c) DispatcherServlet создает свой собственный WebApplicationContext, и обработчики / контроллеры / view-resolvers управляются этим контекстом.
d) Когда ContextLoaderListener используется в тандеме с DispatcherServlet, сначала создается корневой контекст веб-приложения, как было сказано ранее, а дочерний контекст также создается DispatcherSerlvet и присоединяется к корневому контексту приложения. Обратитесь к документации здесь.
Когда мы работаем с Spring MVC и также используем Spring на уровне сервисов, мы предоставляем два контекста приложения. Первый настраивается с использованием ContextLoaderListener, а другой - с помощью DispatcherServlet.
Как правило, вы определяете все связанные с MVC компоненты (контроллер и представления и т. Д.) В контексте DispatcherServlet, а также все сквозные компоненты, такие как безопасность, транзакции, службы и т. Д., В корневом контексте с помощью ContextLoaderListener.
Обратитесь к этому для получения более подробной информации:
https://siddharthnawani.blogspot.com/2019/10/contextloaderlistener-vs.html