- Есть
applicationContext.xml
иspring-servlet.xml
связаны так или иначе в Spring Framework? - Будут
applicationContext.xml
ли доступны файлы свойств, объявленные вDispatcherServlet
? - На связанной ноте, зачем мне вообще нужен
*-servlet.xml
? ПочемуapplicationContext.xml
одного недостаточно?
373
Ответы:
Spring позволяет определять несколько контекстов в иерархии родитель-потомок.
applicationContext.xml
Определяет бобы для «корневого контекста WebAPP», то есть контекст , связанный с веб - приложение.spring-servlet.xml
(Или то , что вы называете это) определяет бобы для контекста приложения одного сервлета. В веб-приложении их может быть много, по одному на каждый сервлет Spring (например,spring1-servlet.xml
для сервлетаspring1
,spring2-servlet.xml
для сервлетаspring2
).Бобы
spring-servlet.xml
могут ссылаться на бобыapplicationContext.xml
, но не наоборот.Все контроллеры Spring MVC должны идти в
spring-servlet.xml
контексте.В большинстве простых случаев
applicationContext.xml
контекст не нужен. Обычно используется для хранения bean-компонентов, которые совместно используются всеми сервлетами в веб-приложении. Если у вас есть только один сервлет, то в этом нет особого смысла, если только вы не используете его специально.источник
Сценарий 1
В клиентском приложении (приложение не является веб-приложением, например может быть приложением Swing)
Нет необходимости в web.xml . ApplicationContext как контейнер для получения сервиса bean. Нет необходимости в контейнере веб-сервера. В test-client.xml может быть Simple bean без удаленного взаимодействия, bean с удаленным взаимодействием.
Вывод : в сценарии 1 applicationContext и
DispatcherServlet
не связаны между собой.Сценарий 2
В серверном приложении (приложение, развернутое на сервере, например, Tomcat). Доступ к услуге через удаленное взаимодействие из клиентской программы (например, приложение Swing)
Определить слушателя в web.xml
При запуске сервера
ContextLoaderListener
создает экземпляры bean-компонентов, определенных в applicationContext.xml .Предполагая, что вы определили следующее в applicationContext.xml :
Бины создаются из всех четырех файлов конфигурации test1.xml , test2.xml , test3.xml , test4.xml .
Вывод : в сценарии 2 applicationContext и
DispatcherServlet
не связаны.Сценарий 3
В веб-приложении с пружиной MVC.
В web.xml определите:
Когда Tomcat запускается, бины , определенные в springweb-servlet.xml , создаются.
DispatcherServlet
расширяетсяFrameworkServlet
. ВFrameworkServlet
бобовых инстанцирования происходит для Springweb. В нашем случае springweb - это FrameworkServlet.Вывод : в сценарии 3 applicationContext и
DispatcherServlet
не связаны.Сценарий 4
В веб-приложении с пружиной MVC. springweb-servlet.xml для сервлета и applicationContext.xml для доступа к бизнес-службе в программе сервера или для доступа к службе БД в другой программе сервера.
В web.xml определены следующие:
При запуске сервера
ContextLoaderListener
создает экземпляры bean-компонентов, определенных в applicationContext.xml ; при условии, что вы заявили здесь:Все бины создаются из всех четырех test1.xml , test2.xml , test3.xml , test4.xml . После завершения создания экземпляра bean-компонента, определенного в applicationContext.xml , создаются экземпляры bean-компонента , определенные в springweb-servlet.xml .
Итак, порядок создания экземпляров: корень (контекст приложения), затем FrameworkServlet.
Теперь должно быть понятно, почему они важны в каком сценарии.
источник
DispatcherServlet
не будет вызываться, если URL не заканчивается на .action?Еще один момент, который я хочу добавить. В
spring-servlet.xml
мы включаем компонент сканирования для пакета контроллера. В следующем примере мы включаем аннотацию фильтра для пакета контроллера.В
applicationcontext.xml
добавляем фильтр для оставшегося пакета, исключая контроллер.источник
@Controller
bean-компоненты в контексте сервлета (требуется Spring MVC).Проще говоря,
applicationContext.xml
определяет бины, которые являются общими для всех сервлетов. Если ваше приложение имеет более одного сервлета, то определение общих ресурсов вapplicationContext.xml
будет более целесообразным.spring-servlet.xml
определяет бины, которые связаны только с этим сервлетом. Вот это диспетчерский сервлет. Итак, ваши Spring MVC контроллеры должны быть определены в этом файле.Нет ничего плохого в определении всех bean-компонентов в том
spring-servlet.xml
случае, если в вашем веб-приложении запущен только один сервлет.источник
В технологии Servlet, если вы хотите передать какой-либо ввод определенному сервлету, вам нужно передать параметр init, как показано ниже.
Если вы хотите передать некоторые данные, которые являются общими для всех сервлетов, тогда вам нужно настроить контекстные параметры. пример
Точно так же, когда мы работаем с Spring MVC, нам нужно предоставлять некоторую информацию в предопределенный сервлет, предоставляемый Spring, то есть DispatcherServlet, через initm параметр. Таким образом, конфигурация выглядит следующим образом: здесь мы предоставляем spring-servlet.xml в качестве параметра init для DispatcherServlet.
Снова нам нужен контекстный параметр. Это применимо для всего приложения. Таким образом, мы можем предоставить корневой контекст applicationcontext.xml. Конфигурация выглядит следующим образом:
источник
Контексты приложения предоставляют средства для разрешения текстовых сообщений, включая поддержку i18n этих сообщений. Контексты приложения предоставляют общий способ загрузки файловых ресурсов, таких как изображения. Контексты приложения могут публиковать события в bean-компонентах, которые зарегистрированы как слушатели. Некоторые операции над контейнером или bean-компонентами в контейнере, которые должны выполняться программным способом с фабрикой bean-компонентов, могут быть декларативно обработаны в контексте приложения. Поддержка ResourceLoader. Ресурсный интерфейс Spring предоставляет гибкую универсальную абстракцию для обработки низкоуровневых ресурсов. Сам контекст приложения является ResourceLoader, следовательно, предоставляет приложению доступ к экземплярам ресурсов, специфичным для развертывания. Поддержка MessageSource: контекст приложения реализует MessageSource, интерфейс, используемый для получения локализованных сообщений,
источник