Разница между applicationContext.xml и spring-servlet.xml в Spring Framework - PullRequest
351 голосов
/ 06 сентября 2010
  • Связаны ли applicationContext.xml и spring-servlet.xml в Spring Framework?
  • Будут ли файлы свойств, объявленные в applicationContext.xml, доступны для DispatcherServlet?
  • В связанной заметке, зачем вообще нужен *-servlet.xml?Почему одного applicationContext.xml недостаточно?

Ответы [ 6 ]

417 голосов
/ 06 сентября 2010

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

applicationContext.xml определяет компоненты для «корневого контекста веб-приложения», то есть контекста, связанного с веб-приложением.

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

Бины в spring-servlet.xml могут ссылаться на бины вapplicationContext.xml, но не наоборот.

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

В большинстве простых случаев контекст applicationContext.xml не требуется.Обычно используется для хранения bean-компонентов, которые совместно используются всеми сервлетами в веб-приложении.Если у вас есть только один сервлет, то в этом нет особого смысла, если только вы не используете его специально.

101 голосов
/ 11 апреля 2013

Сценарий 1

В клиентском приложении (приложение не является веб-приложением, например может быть Swing-приложением)

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

context.getBean(name);

Нет необходимости web.xml .ApplicationContext как контейнер для получения сервиса bean.Нет необходимости в контейнере веб-сервера.В test-client.xml может быть простой бин без удаленного взаимодействия, бин с удаленным взаимодействием.

Вывод : в сценарии 1 applicationContext и DispatcherServlet не связаны.

Сценарий 2

В серверном приложении (приложение, развернутое на сервере, например Tomcat).Доступ к сервису через удаленное взаимодействие из клиентской программы (например, приложения Swing)

Определение прослушивателя в web.xml

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

При запуске сервера ContextLoaderListener создает компоненты, определенные в applicationContext.xml .

Предполагается, что вы определили следующее в applicationContext.xml :

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Бины создаются из всех четырех файлов конфигурации test1.xml , test2.xml , test3.xml , test4.xml .

Заключение: в сценарии 2 applicationContext и DispatcherServlet не связаны.

сценарий 3

В веб-приложении с пружиной MVC.

В web.xml define:

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

Когда запускается Tomcat, создаются бины, определенные в springweb-servlet.xml .DispatcherServlet расширяется FrameworkServletFrameworkServlet создается экземпляр боба для Springweb.В нашем случае springweb - это FrameworkServlet.

Вывод : в сценарии 3 applicationContext и DispatcherServlet не связаны.

сценарий 4

В веб-приложении с пружиной MVC. springweb-servlet.xml для сервлета и applicationContext.xml для доступа к бизнес-службе в программе сервера или для доступа к службе БД в другой программе сервера.

In web.xml определены следующие параметры:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

При запуске сервера ContextLoaderListener создает компоненты, определенные в applicationContext.xml ;при условии, что вы заявили здесь:

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Все бины создаются из всех четырех test1.xml , test2.xml , test3.xml , test4.xml .После завершения создания экземпляра bean-компонента, определенного в applicationContext.xml , создаются экземпляры bean-компонента, определенные в springweb-servlet.xml .

Таким образом, порядок создания экземпляров root является контекстом приложения,затем FrameworkServlet.

Теперь понятно, почему они важны для какого сценария.

53 голосов
/ 18 июля 2012

Еще один момент, который я хочу добавить. В 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>
10 голосов
/ 07 апреля 2015

Проще говоря,

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

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

Нет ничего плохого в определении всех bean-компонентов в spring-servlet.xml, если вы используете только один сервлет в своем веб-приложении.

5 голосов
/ 20 сентября 2017

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

 <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>

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

 <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>

Опять нам нужен контекстный параметр. Это применимо для всего приложения. Таким образом, мы можем предоставить корневой контекст, который является 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>
4 голосов
/ 06 августа 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...