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

StackOverflow https://stackoverflow.com/questions/600095

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

я использую Весна фреймворк 3.0.Насколько я понимаю, мне не нужно импортировать ресурсы следующим образом:

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Об этом говорит Майк Нересон в своем блоге:

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

Другой вариант - просто добавить ваше основное приложение Context.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. Я всегда предпочитаю загружать через веб.xml.

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

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

Мы имеем дело с двумя типами контекстов:

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

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

@eljenso:Intrafest-servlet.xml XML-контекст веб-приложения будет использоваться, если приложение использует SPRING WEB 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>

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

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

Я автор модульные пружинные контексты.

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

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

  • контроль над зависимостями между модулями
  • контроль над тем, какие зерна экспортируются и где они используются
  • уменьшена возможность коллизий имен 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top