Как вы делаете многомодульную конфигурацию пружины? - PullRequest
24 голосов
/ 14 апреля 2009

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

Хотя у нас есть полуприличное решение, но мне действительно интересно, как правильно / оптимально организовать XML-файлы в этом сценарии? Используете ли вы импорт между модулями или есть какой-то другой способ? Вы размещаете все xml-файлы в одном месте или распространяете их в соответствии с графиком зависимостей? Как ваше решение обрабатывает контексты частичной пружины (типичные интеграционные тесты)?

Мне бы также хотелось, чтобы это было организовано таким образом, чтобы я мог оптимально использовать поддержку пружин в моей среде IDE (IDEA и несколько пользователей затмения).

Ответы [ 2 ]

22 голосов
/ 23 апреля 2009

Мы используем импорт с подстановочными символами в модулях, чтобы позволить другим модулям добавлять бины в модуль, объявляющий импорт:

<import resource="classpath*:com/acme/**/*-core-support.xml" />

Модульность

Модули, которые хотят внести свой вклад в «хост», просто должны поместить файлы с правильными именами в src/main/resources/com/acme, чтобы в этом случае они были собраны автоматически. Если вы используете сканирование пути к классам (к <context:component-scan /> это станет еще проще).

Еще одна вещь, которая помогает в этом отношении, - это небольшое расширение Spring, которое собирает bean-компоненты определенного типа и снова публикует их в ApplicationContext. Делая что-то вроде этого:

<plugin:list id="beanList" class="com.acme.MyCoolPluginInterface" />

<bean class="com.acme.MyPluginHost">
   <property name="plugins" ref="beanList" />
</bean>

В сочетании с импортом с подстановочными символами это будет:

  1. Соберите все компоненты, найденные в ApplicationContext, которые реализуют MyCoolPluginInterface, и оберните их в список, зарегистрированный как beanList в ApplicationContext.
  2. Разрешить MyPluginHost ссылаться на этот список.

Фактически, теперь вы можете просто расширить свое приложение, добавив подключаемые модули в classpath (он же зависимость в Maven).

Это крошечное расширение Spring называется Spring Plugin и публикуется под лицензией Apache 2. См. http://github.com/SpringSource/spring-plugin для получения дополнительной информации. Есть также более продвинутый пример проекта на Github, который показывает, как это работает и улучшает модульность на GitHub. Приложение представляет собой пример кода для моего "Упс! Куда делась моя архитектура?" презентацию, которую вы можете посмотреть слайды здесь или посмотреть запись здесь .

Различные среды

Обычно мы настраиваем наши приложения для работы в целевой среде (с использованием поиска JNDI и прочего). Конечно, вы хотели бы использовать стандартные механизмы PropertyPlaceholderConfigurer для вывода конфигурации, которая должна быть затронута администраторами или будет изменяться в различных средах.

Для интеграционных тестов у нас обычно есть дополнительные файлы конфигурации в src/main/test, которые загружаются дополнительно к обычным файлам конфигурации , переопределяя критические компоненты, которые связывают конфигурацию с окружающей средой. Например. если у вас есть источник данных в вашем обычном конфигурационном файле

 <jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" />

вы бы переопределили это в вашем test-context.xml, используя

 <bean id="dataSource" class="...DataSource" />
    <!-- config -->
 </bean>

и импорт этого после исходного в тестовом классе

 @ConfigurationContext(locations = {"app-context.xml", "test-context.xml"})
 public FooBarIntegrationtest {
   // ...
 }
2 голосов
/ 14 апреля 2009

Мы просто создаем контекст приложения из нескольких файлов конфигурации XML в зависимости от использования.

Например, для тестирования без сервера контекст создается с использованием всех файлов конфигурации в каждом сервисном модуле.

При развертывании мы получаем доступ к сервисам через Spring Remoting, и, таким образом, клиент использует контекст приложения, который инициализируется через конфигурацию XML, которая определяет прокси-компоненты, которые обеспечивают удаленное взаимодействие. Между тем службы сконфигурированы теми же XML-файлами, которые используются в тестовых примерах, но контекст приложения теперь загружается либо DispatcherServlet, либо EJB, либо MDB.

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

Невозможно прокомментировать поддержку IDE, поскольку мы еще не используем ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...