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

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

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

Могу ли я это сделать?

Ответы

Ответ 1

Из Spring Docs (v 2.5.5 Раздел 3.2.2.1.):

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

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

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

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

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

Ответ 2

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

classpath*:springconfig/spring-appname-*.xml

Ответ 3

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

<import resource="services.xml"/>

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

Ответ 4

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

GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("modelContext.xml"));
xmlReader.loadBeanDefinitions(new ClassPathResource("uiContext.xml"));
ctx.refresh();

Ответ 5

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

  <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

Ответ 6

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

Ответ 7

Да, вы можете использовать тег внутри файла "Мастер" bean. Но как насчет того, почему? Почему бы не перечислить файлы в контексте contextConfigLocation для массива wab.xml или als из bean factory?

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