Могу ли я составить файл конфигурации Spring из более мелких?

У меня есть несколько проектов, которые используют один проект для модели данных. Каждый из этих проектов имеет свой собственный файл applicationContext.xml с кучей повторяющихся данных.

Я хотел бы иметь файл modelContext.xml и еще один для моего ui.xml и т. д.

Я могу сделать это?


person Allain Lalonde    schedule 18.09.2008    source источник


Ответы (7)


Из документов Spring (v 2.5.5 Раздел 3.2 .2.1.):

Часто бывает полезно разделить определения контейнеров на несколько XML-файлов. Один из способов затем загрузить контекст приложения, настроенный из всех этих XML-фрагментов, — использовать конструктор контекста приложения, который принимает несколько местоположений ресурсов. С помощью фабрики компонентов средство чтения определений компонентов можно использовать несколько раз для чтения определений из каждого файла по очереди.

Как правило, команда Spring предпочитает описанный выше подход, поскольку файлы конфигурации контейнера остаются в неведении о том, что они объединяются с другими. Альтернативный подход заключается в использовании одного или нескольких вхождений элемента для загрузки определений bean-компонентов из другого файла (или файлов). Давайте посмотрим на образец:

<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>

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

В этом примере определения внешних компонентов загружаются из трех файлов: services.xml, messageSource.xml и themeSource.xml. Все пути расположения рассматриваются относительно файла определения, выполняющего импорт, поэтому services.xml в этом случае должен находиться в том же каталоге или пути к классам, что и файл, выполняющий импорт, а messageSource.xml и themeSource.xml должны находиться в ресурсах. расположение ниже расположения импортируемого файла. Как видите, косая черта в начале фактически игнорируется, но, учитывая, что они считаются относительными путями, вероятно, лучше вообще не использовать косую черту. Содержимое импортируемых файлов должно быть действительными файлами определений компонентов XML в соответствии со схемой Spring или DTD, включая элемент верхнего уровня.

person Nicholas Trandem    schedule 18.09.2008
comment
Абсолютно согласен с документацией Spring: агрегация файлов конфигурации каждый раз превосходит явный импорт. Если ни для чего иного, как для модульного тестирования. - person Boris Terzic; 18.09.2008

Мы делаем это в наших проектах на работе, используя загрузчик ресурсов classpath* в Spring. Для определенного приложения будут загружены все файлы контекста приложения, содержащие идентификатор приложения:

classpath*:springconfig/spring-appname-*.xml
person Asgeir S. Nilsen    schedule 18.09.2008
comment
Я в замешательстве. новый ClassPathResource(classpath*:springconfig/spring-appname-*.xml) — это то, что вы предлагаете? - person Allain Lalonde; 18.09.2008
comment
приходится не соглашаться. мы привыкли работать с этим подходом, и это всегда приводит к загрузке неправильного файла конфигурации. в нашем случае у нас были XML-файлы spring в специальной папке conf, но, очевидно, они также прятались внутри различных jar-файлов. этот подход загружает ВСЕ файлы конфигурации из любого места в пути к классам, переопределяя те, которые, по вашему мнению, загружены. - person ihadanny; 30.11.2011
comment
Важный контекст: имя приложения, конечно же, относится к приложению, которое мы создаем, а различные файлы контекста Spring находятся в модулях Maven, где наиболее конкретный модуль приложения наследует другие части от своих зависимостей. Кроме того, шаблон имени файла должен защитить вас от подбора случайных файлов. - person Asgeir S. Nilsen; 03.12.2011

Да, вы можете сделать это через элемент импорта.

<import resource="services.xml"/>

Атрибут ресурса каждого элемента является допустимым путем (например, classpath:foo.xml)

person enricopulatzo    schedule 18.09.2008

Учитывая то, на что Николас указал мне, я нашел это в документах. Это позволяет мне выбирать интересующие меня контексты компонентов во время выполнения.

GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("modelContext.xml"));
xmlReader.loadBeanDefinitions(new ClassPathResource("uiContext.xml"));
ctx.refresh();
person Allain Lalonde    schedule 18.09.2008

Вот что я сделал для одного из своих проектов. В вашем файле web.xml вы можете определить файлы bean-компонентов Spring, которые вы хотите использовать в своем приложении:

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      /WEB-INF/applicationContext.xml
      /WEB-INF/modelContext.xml
      /WEB-INF/ui.xml
    </param-value>
  </context-param>

Если это не определено в вашем web.xml, он автоматически ищет /WEB-INF/applicationContext.xml

person Michael    schedule 18.09.2008
comment
Я не использую Spring MVC, только IOC - person Allain Lalonde; 19.09.2008

Следует также отметить, что, хотя вы можете это сделать, если вы не большой поклонник XML, вы можете сделать много вещей в Spring 2.5 с аннотациями.

person bpapa    schedule 18.09.2008

Да, вы можете использовать тег внутри файла bean-компонента «Master». Но как насчет почему? Почему бы не перечислить файлы в параметре контекста contextConfigLocation массива wab.xml или als Locations фабрики компонентов?

Я думаю, что с несколькими файлами гораздо проще обращаться. Вы можете выбрать только некоторые из них для теста, просто добавить переименование или удалить часть приложения, и вы можете связать разные приложения с одними и теми же файлами конфигурации (версия веб-приложения и командной строки с некоторыми перекрывающимися определениями bean-компонентов).

person Arne Burmeister    schedule 19.09.2008