В чем разница между ApplicationContext и WebApplicationContext в Spring MVC?
в чем разница между контекстом приложения и контекстом веб-приложения?
Я знаю, что WebApplicationContext
используется для приложений, ориентированных на архитектуру Spring MVC?
Я хочу знать, что использование ApplicationContext
в приложения MVC? А какие бобы определены в ApplicationContext
?
4 ответа:
контекст веб-приложения расширенный контекст приложения, который предназначен для работы со стандартом javax.сервлет.Объекта servletcontext так что он может общаться с контейнером.
public interface WebApplicationContext extends ApplicationContext { ServletContext getServletContext(); }
бобы, созданные в WebApplicationContext, также смогут использовать ServletContext, если они реализуют интерфейс ServletContextAware
package org.springframework.web.context; public interface ServletContextAware extends Aware { void setServletContext(ServletContext servletContext); }
есть много вещей, которые можно сделать с экземпляром ServletContext, например, доступ к WEB-INF ресурсы (xml-конфигурации и т. д.) путем вызова метода getResourceAsStream (). Обычно все контексты приложений, определенные в web.xml в приложении servlet Spring-это контексты веб-приложений, это относится как к корневому контексту веб-приложения, так и к контексту приложения сервлета.
кроме того, в зависимости от возможностей контекста веб-приложения может сделать ваше приложение немного сложнее проверить, и вам может потребоваться использовать MockServletContext класс для тестирование.
разница между сервлетом и корневым контекстом Spring позволяет создавать многоуровневые иерархии контекста приложения, поэтому требуемый компонент будет извлечен из родительского контекста, если он отсутствует в текущем контексте приложения. В веб-приложениях по умолчанию есть два уровня иерархии, корневой и сервлет контексты:.
Это позволяет запускать некоторые службы в качестве синглетов для всего приложения (Spring Security beans и основные службы доступа к базе данных обычно находятся здесь)и другие как отдельные службы в соответствующих сервлетах, чтобы избежать конфликтов имен между компонентами. Например, один контекст сервлета будет обслуживать веб-страницы, а другой будет реализовывать веб-службу без состояния.
это двухуровневое разделение выходит из коробки, когда вы используете классы сервлетов spring: для настройки корневого контекста приложения вы должны использовать context-param тег в сеть.xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/root-context.xml /WEB-INF/applicationContext-security.xml </param-value> </context-param>
(корневой контекст приложения создается ContextLoaderListener который объявлен в интернете.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
) и сервлет тег для контекстов приложения сервлета
<servlet> <servlet-name>myservlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>app-servlet.xml</param-value> </init-param> </servlet>
обратите внимание, что если init-param будет опущен, то spring будет использовать myservlet-servlet.xml в этом примере.
Читайте также: разница между applicationContext.xml и spring-сервлет.xml весной Рамки
ApplicationContext applicationContext.xml - это корневая конфигурация контекста для каждого веб-приложения. Весна нагрузок applicationContext.xml-файл и создает ApplicationContext для всего приложения. В каждом веб-приложении будет только один контекст приложения. Если вы явно не объявляете имя файла конфигурации контекста в web.xml используя параметр contextConfigLocation, Spring будет искать applicationContext.xml в папке WEB-INF и бросить FileNotFoundException, если не удалось найти этот файл.
WebApplicationContext Помимо ApplicationContext, в одном веб-приложении может быть несколько WebApplicationContext. Проще говоря, каждый DispatcherServlet связан с одним WebApplicationContext. ХХХ-сервлет.xml-файл специфичен для DispatcherServlet, и веб-приложение может иметь несколько DispatcherServlet, настроенных для обработки запросов. В таких сценариях каждый DispatcherServlet был бы отдельный xxx-сервлет.xml настроен. Но, applicationContext.xml будет общим для всех файлов конфигурации сервлетов. Весна будет по умолчанию загружать файл с именем " xxx-сервлет.xml " из папки webapps WEB-INF, где xxx-это имя сервлета в web.XML. Если вы хотите изменить имя этого файла или изменить расположение, добавьте initi-param с contextConfigLocation в качестве имени param.
возвращаясь к Дням сервлетов, web.xml может иметь только один
<context-param>
, поэтому при загрузке приложения сервером создается только один объект контекста, и данные в этом контексте совместно используются всеми ресурсами (например, Сервлетами и JSP). Это то же самое как имя драйвера базы данных в контексте, который не изменится. Аналогичным образом, когда мы объявляем contextConfigLocation param в<contex-param>
Spring создает один объект контекста приложения.<context-param> <param-name>contextConfigLocation</param-name> <param-value>com.myApp.ApplicationContext</param-value> </context-param>
вы можете иметь несколько сервлетов в приложение. Например, вы, возможно, захотите, чтобы справиться /безопасное/* запросы в одну сторону и не seucre/* в другую сторону. Для каждого из этих сервлетов вы можете иметь объект контекста, который является WebApplicationContext.
<servlet> <servlet-name>SecureSpringDispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextClass</param-name> <param-value>com.myapp.secure.SecureContext</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>SecureSpringDispatcher</servlet-name> <url-pattern>/secure/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>NonSecureSpringDispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextClass</param-name> <param-value>com.myapp.non-secure.NonSecureContext</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>NonSecureSpringDispatcher</servlet-name> <url-pattern>/non-secure/*</url-patten> </servlet-mapping>
принятый ответ закончен, но есть официальное объяснение по этому поводу:
WebApplicationContext является расширением простого ApplicationContext, который имеет некоторые дополнительные функции, необходимые для веб-приложений. Он отличается от обычного ApplicationContext тем, что он способен разрешать темы (см. Использование тем), и что он знает, с каким сервлетом он связан (имея ссылку на ServletContext). WebApplicationContext привязан в ServletContext, и с помощью статических методов в классе RequestContextUtils вы всегда можете найти WebApplicationContext, если вам нужен доступ к нему.
взято с Spring Web framework reference
кстати сервлет и корневой контексти webApplicationContext: