Разница между applicationContext.xml и spring-сервлет.xml в Spring Framework

  • Are applicationContext.xml и spring-servlet.xml связанные в любом случае в Spring Framework?
  • будут ли файлы свойств, объявленные в applicationContext.xml быть доступен для DispatcherServlet?
  • на соответствующей ноте, почему мне нужен *-servlet.xml на всех? Почему это недостаточно?

6 ответов


Spring позволяет определить несколько контекстов в иерархии родитель-потомок.

на applicationContext.xml определяет компоненты для "корневого контекста webapp", т. е. контекста, связанного с webapp.

на spring-servlet.xml (или как вы еще это называете) определяет бобы для контекста приложения одного сервлета. Их может быть много в webapp, по одному на весенний сервлет (например,spring1-servlet.xml для сервлета spring1, spring2-servlet.xml для сервлета spring2).

фасоль spring-servlet.xml can эталонные бобы в applicationContext.xml, но не наоборот.

все контроллеры Spring MVC должны идти в spring-servlet.xml контексте.

в самых простых случаях!--0--> контекст не нужен. Он обычно используется для хранения компонентов, которые совместно используются всеми сервлетами в webapp. Если у вас есть только один сервлет, тогда нет особого смысла, если у вас нет конкретного использования для него.


Сценарий 1

в клиентском приложении (Приложение не является веб-приложением, e.g может быть качели приложение)

private static ApplicationContext context = new  ClassPathXmlApplicationContext("test-client.xml");

context.getBean(name);

не нужно web.в XML. ApplicationContext как контейнер для получения службы bean. Нет необходимости в контейнере веб-сервера. В


еще один момент хочу добавить. В spring-servlet.xml мы включаем компонентную развертку для пакета регулятора. В следующем примере мы включаем аннотацию фильтра для пакета контроллера.

<!-- Scans for annotated @Controllers in the classpath -->
<context:component-scan base-package="org.test.web" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

на applicationcontext.xml мы добавляем фильтр для остального пакета исключая регулятора.

<context:component-scan base-package="org.test">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

простыми словами,

applicationContext.xml определяет бобы, которые являются общими для всех сервлетов. Если ваше приложение имеет более одного сервлета, то определение общих ресурсов в applicationContext.xml было бы больше смысла.

spring-servlet.xml определяет бобы, связанные только с этим сервлетом. Вот это сервлет диспетчера. Таким образом, ваши контроллеры Spring MVC должны быть определены в этом файле.

нет ничего плохого в определении всех зерен в spring-servlet.xml Если в веб-приложении выполняется только один сервлет.


контексты приложений предоставляют средства для разрешения текстовых сообщений, включая поддержку i18n этих сообщений. Контексты приложений предоставляют общий способ загрузки файловых ресурсов, таких как изображения. Контексты приложений могут публиковать события в бобах, зарегистрированных в качестве прослушивателей. Некоторые операции над контейнером или бобами в контейнере, которые должны обрабатываться программным способом с помощью фабрики бобов, могут обрабатываться декларативно в контексте приложения. Объект resourceloader поддержка: ресурсный интерфейс Spring-гибкая обобщенная абстракция для обработки низкоуровневых ресурсов. Контекст приложения сам по себе является ResourceLoader, поэтому предоставляет приложению доступ к экземплярам ресурсов, специфичным для развертывания. MessageSource поддержка: контекст приложения реализует MessageSource, интерфейс, используемый для получения локализованных сообщений, с фактической реализацией pluggable


в технологии сервлетов если вы хотите передать какой-либо вход в конкретный сервлет, вам нужно передать init param, как показано ниже кода.

 <servlet>
    <servlet-name>DBController</servlet-name>
    <servlet-class>com.test.controller.DBController</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>John</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>DBController</servlet-name>
    <url-pattern>/DBController</url-pattern>
</servlet-mapping>

если вы хотите передать некоторые в put, что является общим для всех сервлетов, то в это время вам нужно настроить контекстный параметр. Пример

 <context-param>
    <param-name>email</param-name>
    <param-value>admin@example.com</param-value>
</context-param>

так точно, когда мы работаем с Spring MVC, нам нужно предоставить некоторую информацию предопределенному сервлету, предоставленному Spring, который является DispatcherServlet через init парам. Таким образом, конфигурация как паров, здесь мы предоставляем spring-servlet.xml как параметр init для DispatcherServlet.

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Spring MVC App</display-name>

    <servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
</web-app>

снова нам нужен некоторый контекст param. Это применимо для всего приложения. Поэтому мы можем обеспечить корневой контекст, который applicationcontext.XML Конфигурация выглядит следующим образом:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationcontext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>