Spring конфигурация в мультимодульном проекте

Я новичок в Spring и получил ситуацию, когда один проект с несколькими модулями, включая один веб-модуль. Веб-модуль использует Spring MVC, но мне было интересно, могу ли я иметь основную конфигурацию Spring на уровне проекта, которая заботится обо всем проекте, так что я могу воспользоваться всеми преимуществами инфраструктуры Spring.

main
   -module1
   -module2
   -web
      +spring3.1, spring-security

Какова была бы лучшая настройка для этого случая?

Ответ 1

Макет сборки и время выполнения CLASSPATH - это две разные вещи. Даже если вы определяете отдельные файлы applicationContext.xml или @Configuration в разных модулях, они могут быть объединены в один CLASSPATH.

То, что module1 и module2 могут объявлять свои собственные контексты, но поскольку CLASSPATH объединяется во время выполнения, будет создан только один основной контекст. Также, если вы решите использовать сканирование CLASSPATH в одном модуле, он может выбрать классы (beans), аннотированные с помощью @Service в других модулях.

В модуле web, который также должен иметь зависимости от основных библиотек Spring, также будет зависеть от spring-web, MVC и spring-security. Этот модуль создаст дочерний web контекст, который имеет доступ к основному контексту, но не наоборот.

Очевидно, у вас должна быть только одна копия каждой библиотеки в вашем uber-JAR (ear?)

Ответ 2

У нас есть такая архитектура, где я работаю. Мы решили использовать ContextLoaderListener (Spring Event Listener) в веб-модуле.

Затем, в serverApplicationContext.xml, мы импортируем все файлы контекстов модулей:

<import resource="classpath*:module1ApplicationContext.xml" />
<import resource="classpath*:module2ApplicationContext.xml" />
...

Таким образом, вы используете загрузку контекста spring во время инициализации контекста веб-приложения.