В чем разница между ApplicationContext и WebApplicationContext в Spring MVC?
в чем разница между контекстом приложения и контекстом веб-приложения?
Я знаю, что WebApplicationContext
используется для спринг 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-это контексты веб-приложений, это относится как к корневому контексту webapp, так и к контексту приложения сервлета.
кроме того, в зависимости от возможностей контекста веб-приложения может сделать ваше приложение немного сложнее протестировать, и вам может потребоваться использовать MockServletContext класс для тестирование.
разница между сервлетом и корневым контекстом Spring позволяет создавать многоуровневые иерархии контекста приложения, поэтому требуемый компонент будет извлечен из родительского контекста, если он отсутствует в текущем контексте приложения. В веб-приложениях по умолчанию существует два уровня иерархии: корневой и сервлетный контексты:.
Это позволяет запускать некоторые службы в качестве синглетов для всего приложения (Spring Security beans и основные службы доступа к базе данных обычно находятся здесь) и другие как отдельные службы в соответствующих сервлетах, чтобы избежать столкновения имен между бобами. Например, один контекст сервлета будет обслуживать веб-страницы, а другой будет реализовывать веб-службу без состояния.
это разделение двух уровней выходит из коробки, когда вы используете классы сервлетов spring: для настройки корневого контекста приложения вы должны использовать контекст-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, настроенных для обработки запросов. В таких scenrios, каждый DispatcherServlet будет иметь отдельный xxx-сервлет.в XML настроен. Но, applicationContext.xml будет общим для всех файлов конфигурации сервлетов. Spring по умолчанию загрузит файл с именем "xxx-servlet.xml " из вашей папки webapps WEB-INF, где xxx-это имя сервлета в web.XML. Если вы хотите изменить имя этого файла или изменить местоположение, добавьте initi-param с contextConfigLocation в качестве имени param.
возвращаясь к Дням сервлета, web.xml может иметь только одно <context-param>
, поэтому при загрузке приложения сервером создается только один объект контекста, и данные в этом контексте разделяются между всеми ресурсами (например, Сервлетами и JSPs). Это то же самое, что и имя драйвера базы данных в контексте, которое не изменится. Аналогичным образом, когда мы объявляем contextConfigLocation param в <contex-param>
Spring создает один объект контекста приложения.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.myApp.ApplicationContext</param-value>
</context-param>
вы можете иметь несколько сервлетов в приложение. Например, вы можете обрабатывать /secure/* запросы одним способом и / non-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
кстати servlet и корневой контекст и webApplicationContext: