Я придумал следующее решение (к вопросам № 2 и № 3), чтобы иметь возможность применять мои рекомендации по проектированию и продолжать использовать конфигурацию на основе аннотаций:
- Каждый зависимый проект (модуль Maven) имеет свой собственный
ApplicationContext
- Каждый зависимый контекст приложения проекта определен в
beanRefContext.xml
- Эти контексты приложения загружаются в иерархии с использованием механизма иерархии контекста Spring.
- Этот шаг на самом деле не полностью поддерживается Spring и требует дополнительной работы
- Поскольку мое приложение является многоуровневым, я мог отключить CGLib на всех своих модулях, кроме слоя JMX (я могу жить с ним :-)).
Вышеуказанные шаги также позволили мне сократить время выполнения тестов с поддержкой Spring (каждый модуль загружал только подмножество bean-компонентов).
В качестве практического руководства (для вопроса № 1), если интерфейс имеет более одной реализации, я размещаю @Primary
на широко используемых одном и других клиентах, требующих другой реализации, связываем компонент с помощью @Qualifier
.