Разделение applicationContext на несколько файлов


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

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

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

мой 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и the context-param разделы?

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

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

я использую Весна фреймворк 3.0. Это мое понимание, что мне не нужно делать импорт ресурсов, как это:

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

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

5 56

5 ответов:

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

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

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

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

на

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

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

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

1. сеть.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>

выше использует возврат каретки. Кроме того, я мог просто положить в пространство.

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

ваш другой вариант - просто добавить свой основной applicationContext.XML к сети.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.

потому что это позволяет мне держать все контексты изолированными друг от друга другой. С помощью тестов мы можем загружать только те контексты, которые нам нужно запустить то испытание. Это делает разработку более модульной тоже в качестве компонентов остановиться!--4-->, так что в будущее я могу извлечь пакет или вертикальный слой и переместить его в свой собственный модуль.

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

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

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

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

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

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

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

в интернете.XML-код:

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

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

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

Я автор книги modular-spring-contexts.

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

ключевые моменты тогда являются

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

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

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

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

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