Разбиение applicationContext на несколько файлов - PullRequest
57 голосов
/ 01 марта 2009

Как правильно разделить конфигурацию 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?

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

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

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

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

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

Ответы [ 5 ]

47 голосов
/ 01 марта 2009

Я считаю следующую настройку самой простой.

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

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

В вашем случае просто создайте файл 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). Один из двух подойдет. Вы также можете использовать запятые, чтобы указать несколько мест конфигурации.

27 голосов
/ 24 декабря 2013

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

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

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

1. web.xml contextConfigLocation

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

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

13 голосов
/ 24 февраля 2015

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

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

2 : отдельный контекст сервлета (дочерний контекст. Как правило, контекст сервлета Dispatcher и инициализация всех bean-компонентов, связанных с 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>
6 голосов
/ 17 марта 2011

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

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

Простой пример, если вы не используете SPRING WEB MVC, но хотите использовать 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"/> эти операторы импорта для загрузки различных файлов контекста приложения и помещения их в основной файл application-context.xml.

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

1 голос
/ 07 июня 2016

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

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

В этом случае ключевыми являются

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

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

Файл 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>
...