2009-03-01 2 views
55

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

На данный момент у меня

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

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

<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 разделы?

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

Update 1:

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

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

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

ответ

47

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

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

Структура будет, при инициализации из в DispatcherServlet, искать файл с именем [сервлет-имя] -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> 

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

+0

+1 - моя установка выглядит точно так же, как это. Хотя я не думаю, что есть какие-то практические преимущества/недостатки этой установки, а также указание нескольких файлов конфигурации в web.xml - это просто похоже на семантику. –

+1

Я определенно считаю, что конфигурация по умолчанию выгодна: соглашение по конфигурации. Вместо того, чтобы указывать несколько файлов конфигурации с * extra config *, у вас есть только один файл конфигурации «верхнего уровня» по умолчанию *, который будет импортировать те же файлы, которые в противном случае вам нужно было бы указать в любом случае. – eljenso

+1

Когда вы используете импорт, будьте осторожны, чтобы не импортировать один и тот же файл несколько раз (импорт внутри импорта и т. Д.), Так как это приведет к созданию нескольких компонентов и приведет к затруднительным поискам ошибок. –

6

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

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

Простой пример, если вы не используете Spring Web MVC, но хотите utitlize SPRING МОК:

В web.xml:

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

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

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

25

Майк Nereson это сказать в своем блоге на сайте:

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

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

1. web.xml contextConfigLocation

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

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

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

<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 ресурс.

+10

Копирует статью http://blog.codehangover.com/load-multiple-contexts-into-spring/ без ссылки. –

11

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

: (. Родитель контекст Как правило, включают все JDBC (ОРМ, Hibernate) инициализация и другие пружинные конфигурации, связанные с безопасностью) корневого контекстом

: индивидуальный контекст сервлета (дочерний контекст.Типтически диспетчерский сервлет Контекст и инициализация всех компонентов, связанных с 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>

+0

Отличный ответ. Различие между корнем и ребенком является ключевым. – MrKiller21

1

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

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

Ключевые моменты, то есть

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

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

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

спасибо @SpaceTrucker! похоже, что вы создали именно то, что нам также нужно. не уверен, почему богатая весенняя община не создала нечто подобное раньше ... – ashirman

Смежные вопросы