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

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

Ответ 1

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. Если у вас есть только один сервлет, тогда на самом деле нет особого смысла, если у вас нет конкретного использования для него.

Ответ 2

Сценарий 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.

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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