В чем разница между 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 позволяет создавать многоуровневые иерархии контекста приложения, поэтому требуемый компонент будет извлечен из родительского контекста, если он отсутствует в текущем контексте приложения. В веб-приложениях по умолчанию существует два уровня иерархии: корневой и сервлетный контексты:Servlet and root context.

Это позволяет запускать некоторые службы в качестве синглетов для всего приложения (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:

Typical context hierarchy in Spring Web MVC