Разница между applicationContext.xml и spring -servlet.xml в Spring Framework

  • Связаны ли applicationContext.xml и spring-servlet.xml в Spring Framework?
  • Доступны ли файлы свойств, объявленные в applicationContext.xml, DispatcherServlet?
  • В связи с примечанием, зачем мне вообще нужно *-servlet.xml? Почему недостаточно applicationContext.xml?
+315
06 сент. '10 в 14:05
источник поделиться
6 ответов

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

applicationContext.xml определяет beans для "корневого контекста веб-приложения", то есть контекст, связанный с webapp.

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

Beans в spring-servlet.xml может ссылаться на beans на applicationContext.xml, но не наоборот.

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

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

+371
06 сент. '10 в 14:10
источник

Связанные вопросы


Похожие вопросы

Сценарий 1

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

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

context.getBean(name);

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

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

Сценарий 2

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

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

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

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

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

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

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

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

Сценарий 3

В веб-приложении с spring 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 запускается, beans, определенный в springweb-servlet.xml, создается. DispatcherServlet продолжается FrameworkServlet. В FrameworkServlet bean создается экземпляр для springweb. В нашем случае springweb является FrameworkServlet.

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

Сценарий 4

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

В 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 создает экземпляр beans, определенный в applicationContext.xml; если вы заявили об этом:

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

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

Итак, порядок создания экземпляров - это корневой контекст приложения, а затем FrameworkServlet.

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

+85
11 апр. '13 в 4:58
источник

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

<!-- 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>
+51
18 июл. '12 в 4:11
источник

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

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

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

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

+9
07 апр. '15 в 5:23
источник

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

+3
06 авг. '14 в 15:51
источник

В сервлет-технологии, если вы хотите передать какой-либо вход на конкретный сервлет, вам необходимо передать значение параметра 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. Пример

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

SO точно так же, когда мы работаем с Spring MVC, нам нужно предоставить некоторую информацию в предопределенный сервлет, предоставленный Spring, который является DispatcherServlet через init param. Таким образом, конфигурация является парой, здесь мы предоставляем параметр 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>
0
20 сент. '17 в 11:49
источник

Посмотрите другие вопросы по меткам или Задайте вопрос