В чем разница между ApplicationContext и WebApplicationContext в Spring MVC?
В чем разница между контекстом приложения и контекстом веб-приложения?
Я знаю что WebApplicationContext
используется для приложений, ориентированных на архитектуру Spring MVC?
Я хочу знать, какая польза от ApplicationContext
в приложениях MVC? И какие бобы определены в ApplicationContext
?
4 ответа
Контекст веб-приложения расширенный контекст приложения, который предназначен для работы со стандартным javax.servlet.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 в приложении Spring сервлета, являются контекстами веб-приложения, это относится как к контексту корневого веб-приложения, так и к контексту приложения сервлета.
Кроме того, в зависимости от возможностей контекста веб-приложения тестирование приложения может быть немного сложнее, и вам может понадобиться использовать класс MockServletContext для тестирования.
Различие между сервлетом и корневым контекстом Spring позволяет создавать многоуровневые иерархии контекста приложения, поэтому требуемый компонент будет выбран из родительского контекста, если он отсутствует в текущем контексте приложения. В веб-приложениях по умолчанию есть два уровня иерархии, контексты root и сервлета: ,
Это позволяет вам запускать некоторые сервисы как синглтоны для всего приложения (здесь обычно находятся bean-компоненты Spring Security и базовые сервисы доступа к базам данных), а другие как отдельные сервисы в соответствующих сервлетах, чтобы избежать конфликта имен между bean-компонентами. Например, один контекст сервлета будет обслуживать веб-страницы, а другой будет реализовывать веб-службу без сохранения состояния.
Это двухуровневое разделение возникает сразу после использования классов сервлетов Spring: для настройки контекста корневого приложения вы должны использовать тег context-param в вашем файле web.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, который объявлен в web.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-servlet.xml в Spring Framework
ApplicationContext applicationContext.xml является конфигурацией корневого контекста для каждого веб-приложения. Spring загружает файл applicationContext.xml и создает ApplicationContext для всего приложения. Для каждого веб-приложения будет только один контекст приложения. Если вы явно не объявляете имя файла конфигурации контекста в файле web.xml с помощью параметра contextConfigLocation, Spring выполнит поиск applicationContext.xml в папке WEB-INF и сгенерирует исключение FileNotFoundException, если не удалось найти этот файл.
WebApplicationContext Помимо ApplicationContext, в одном веб-приложении может быть несколько WebApplicationContext. Проще говоря, каждый DispatcherServlet связан с одним WebApplicationContext. Файл xxx-servlet.xml относится к DispatcherServlet, и в веб-приложении может быть настроено несколько DispatcherServlet для обработки запросов. В таких сценариях для каждого DispatcherServlet будет настроен отдельный файл xxx-servlet.xml. Но applicationContext.xml будет общим для всех файлов конфигурации сервлета. Spring по умолчанию загрузит файл с именем "xxx-servlet.xml" из папки WEB-INF вашего веб-приложения, где xxx - это имя сервлета в web.xml. Если вы хотите изменить имя этого файла или изменить местоположение, добавьте initi-param с contextConfigLocation в качестве имени параметра.
Принятый ответ исчерпан, но на это есть официальное объяснение:
WebApplicationContext является расширением простого ApplicationContext, который имеет некоторые дополнительные функции, необходимые для веб-приложений. Он отличается от обычного ApplicationContext тем, что способен разрешать темы (см. "Использование тем") и знает, с каким сервлетом он связан (имея ссылку на ServletContext). WebApplicationContext связан с ServletContext, и с помощью статических методов в классе RequestContextUtils вы всегда можете найти WebApplicationContext, если вам нужен доступ к нему.
Цитируется из ссылки на веб-фреймворк Spring
Кстати, сервлет и корневой контекст оба являются webApplicationContext:
Возвращаясь к дням сервлетов, в web.xml может быть только один <context-param>
Таким образом, создается только один объект контекста, когда сервер загружает приложение, и данные в этом контексте распределяются между всеми ресурсами (например, сервлетами и JSP). Это то же самое, что иметь имя драйвера базы данных в контексте, которое не изменится. Аналогичным образом, когда мы объявляем contextConfigLocation param в <contex-param>
Spring создает один объект Application Context.
<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>
ApplicationContext (корневой контекст приложения). Каждое веб-приложение Spring MVC имеет файл applicationContext.xml, который настроен как корневой каталог конфигурации контекста. Spring загружает этот файл и создает applicationContext для всего приложения. Этот файл загружается ContextLoaderListener, который настроен как параметр контекста в файле web.xml. И будет только один applicationContext для каждого веб-приложения.
WebApplicationContext: WebApplicationContext - это контекст приложения с веб-интерфейсом, т. Е. Он содержит информацию о контексте сервлета. Одно веб-приложение может иметь несколько WebApplicationContext, и каждый сервлет Dispatcher (являющийся фронт-контроллером архитектуры Spring MVC) связан с WebApplicationContext. Файл конфигурации webApplicationContext *-servlet.xml специфичен для DispatcherServlet. А поскольку в веб-приложении может быть настроено несколько сервлетов-диспетчеров для обслуживания нескольких запросов, в веб-приложении может быть несколько файлов webApplicationContext.
Контекст веб-приложения, указанный WebApplicationContext
интерфейс, это контекст приложения Spring для веб-приложений. Он имеет все свойства обычного контекста приложения Spring, учитывая, что WebApplicationContext
интерфейс расширяет ApplicationContext
интерфейс и добавить метод для получения стандартного API сервлета ServletContext
для веб-приложения.
В дополнение к стандартным областям применения бобов Spring singleton
а также prototype
В контексте веб-приложения доступны три дополнительные области:
request
- ограничивает определение одного бина жизненным циклом одного HTTP-запроса; то есть каждый HTTP-запрос имеет свой собственный экземпляр компонента, созданного на основе определения одного компонентаsession
- ограничивает определение одного бина жизненным циклом сеанса HTTPapplication
- определяет единственное определение bean-компонента для жизненного циклаServletContext