Разделение приложенияКонтекст для нескольких файлов

Каков правильный способ разделения конфигурации Spring на несколько xml файлов?

В данный момент у меня есть

  • /WEB-INF/foo-servlet.xml
  • /WEB-INF/foo-service.xml
  • /WEB-INF/foo-persistence.xml

My web.xml имеет следующее:

<servlet>
    <description>Spring MVC Dispatcher Servlet</description>
    <servlet-name>intrafest</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/foo-*.xml
        </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
            /WEB-INF/foo-*.xml
    </param-value>
</context-param>


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

Актуальные вопросы:

  • Этот подход правильный/лучший?
  • Нужно ли мне указывать места конфигурации как в разделах DispatcherServlet, так и context-param?

Что мне нужно иметь в виду, чтобы иметь возможность ссылаться на beans, определенный в foo-servlet.xml от foo-service.xml? Это связано с определением contextConfigLocation в web.xml?

Обновление 1:

Я использую Spring framework 3.0. Я понимаю, что мне не нужно делать импорт ресурсов следующим образом:

 <import resource="foo-services.xml"/> 

Это правильное предположение?

Ответ 1

Я нахожу следующую настройку самой легкой.

Использовать механизм загрузки файла конфигурации по умолчанию DispatcherServlet:

Структура будет при инициализации диспетчерской службы, найдите файл с именем [servlet-name] -servlet.xml в каталоге WEB-INF вашей сети приложения и создайте beans(переопределение определения любого beans, определенного с помощью одно и то же имя в глобальном масштабе).

В вашем случае просто создайте файл intrafest-servlet.xml в директории WEB-INF и не нужно указывать какую-либо конкретную информацию в web.xml.

В файле intrafest-servlet.xml вы можете использовать import для составления вашей конфигурации XML.

<beans>
  <bean id="bean1" class="..."/>
  <bean id="bean2" class="..."/>

  <import resource="foo-services.xml"/>
  <import resource="foo-persistence.xml"/>
</beans>

Обратите внимание, что команда Spring фактически предпочитает загружать несколько файлов конфигурации при создании (Web) ApplicationContext. Если вы все еще хотите это сделать, я думаю, вам не нужно указывать оба параметра контекста (context-param) и параметры инициализации сервлета (init-param). Один из них сделает это. Вы также можете использовать запятые, чтобы указать несколько мест конфигурации.

Ответ 2

Майк Нересон должен это сказать в своем блоге по адресу:

http://blog.codehangover.com/load-multiple-contexts-into-spring/

Есть несколько способов сделать это.

1. web.xml contextConfigLocation

Ваш первый вариант - загрузить их все в свое веб-приложение контекст через элемент ContextConfigLocation. Ты уже собираешься для вашего основного приложенияContext здесь, предполагая, что вы пишете веб-приложение. Все, что вам нужно сделать, это установить пробел между объявление следующего контекста.

  <context-param>
      <param-name> contextConfigLocation </param-name>
      <param-value>
          applicationContext1.xml
          applicationContext2.xml
      </param-value>
  </context-param>

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

В приведенном выше примере используется возврат каретки. В качестве альтернативы, вы можете просто добавить пространство.

  <context-param>
      <param-name> contextConfigLocation </param-name>
      <param-value> applicationContext1.xml applicationContext2.xml </param-value>
  </context-param>

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

2. Ресурс импорта applicationContext.xml

Другой вариант - просто добавить основной файл applicationContext.xml в web.xml, а затем использовать операции импорта в этом основном контексте.

В applicationContext.xml у вас может быть...

  <!-- hibernate configuration and mappings -->
  <import resource="applicationContext-hibernate.xml"/>

  <!-- ldap -->
  <import resource="applicationContext-ldap.xml"/>

  <!-- aspects -->
  <import resource="applicationContext-aspects.xml"/>

Какую стратегию вы должны использовать?

1. Я всегда предпочитаю загружать через web.xml.

Потому что это позволяет мне изолировать все контексты от каждого Другие. С помощью тестов мы можем загружать только те контексты, которые нам нужны для запуска эти испытания. Это делает разработку более модульной, так как компоненты оставайтесь loosely coupled, так что в будущем я могу извлечь пакет или вертикального слоя, и переместите его в собственный модуль.

2. Если вы загружаете контексты в non-web application, я бы использовал ресурс import.

Ответ 3

Есть два типа контекстов, с которыми мы имеем дело:

1: корневой контекст (исходный контекст). Обычно включают в себя всю инициализацию jdbc (ORM, Hibernate) и другую конфигурацию, связанную с безопасностью spring)

2: индивидуальный контекст сервлета (дочерний контекст. Типично Диспетчерский сервлет Контекст и инициализировать все beans, связанные с spring -mvc (контроллеры, сопоставление URL и т.д.)).

Вот пример web.xml, который включает в себя несколько файлов контекста приложения

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <display-name>Spring Web Application example</display-name>

    <!-- Configurations for the root application context (parent context) -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/jdbc/spring-jdbc.xml <!-- JDBC related context -->
            /WEB-INF/spring/security/spring-security-context.xml <!-- Spring Security related context -->
        </param-value>
    </context-param>

    <!-- Configurations for the DispatcherServlet application context (child context) -->
    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/spring/mvc/spring-mvc-servlet.xml
            </param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/admin/*</url-pattern>
    </servlet-mapping>

</web-app>

Ответ 4

@eljenso: intrafest-servlet.xml контекст webapplication xml будет использоваться, если приложение использует SPRING WEB MVC.

В противном случае конфигурация @kosoant прекрасна.

Простой пример, если вы не используете SPRING WEB MVC, но хотите utitlize SPRING IOC:

В web.xml:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
</context-param>

Затем ваш application-context.xml будет содержать: <import resource="foo-services.xml"/> эти операторы импорта загружают различные файлы контекста приложения и помещаются в основное приложение-context.xml.

Спасибо и надеюсь, что это поможет.

Ответ 5

Я автор modular-spring-contexts.

Это небольшая библиотека функций, позволяющая более модульную организацию контекстов spring, чем достигается с помощью Составление метаданных конфигурации на основе XML, modular-spring-contexts работает путем определения модулей, которые в основном представляют собой автономные контексты приложений и позволяют модулям импортировать beans из других модулей, которые экспортируются в их исходный модуль.

Затем ключевыми точками являются

  • контроль зависимостей между модулями
  • контроль, из которого beans экспортируется и где они используются
  • уменьшена вероятность именования столкновений beans

Простой пример будет выглядеть так:

Файл moduleDefinitions.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <module:module id="serverModule">
        <module:config location="/serverModule.xml" />
    </module:module>

    <module:module id="clientModule">
        <module:config location="/clientModule.xml" />
        <module:requires module="serverModule" />
    </module:module>

</beans>

Файл serverModule.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <bean id="serverSingleton" class="java.math.BigDecimal" scope="singleton">
        <constructor-arg index="0" value="123.45" />
        <meta key="exported" value="true"/>
    </bean>

</beans>

Файл clientModule.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <module:import id="importedSingleton" sourceModule="serverModule" sourceBean="serverSingleton" />

</beans>