В чем разница между ApplicationContext и WebApplicationContext в Spring MVC?


в чем разница между контекстом приложения и контекстом веб-приложения?

Я знаю, что WebApplicationContext используется для приложений, ориентированных на архитектуру Spring MVC?

Я хочу знать, что использование ApplicationContext в приложения MVC? А какие бобы определены в ApplicationContext?

4 160

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

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

Typical context hierarchy in Spring Web MVC