Внедрение зависимостей времени выполнения с помощью Spring

В моем текущем проекте используется Spring, и наш архитектор решил разрешить Spring управлять службами, репозиториями и Factory объектами, но НЕ объектами домена. Мы внимательно следим за развитием домена. Причиной не использования Spring для объектов домена является то, что Spring допускает только статическую зависимость. То, что я подразумеваю под действием статической зависимости, заключается в том, что зависимости указаны внутри xml-конфигурации, и они становятся "замороженными".

Возможно, я ошибаюсь, но сейчас я понимаю, что хотя мой домен использует интерфейсы для взаимодействия с объектами, но конфигурация Spring xml заставляет меня указывать конкретную зависимость. поэтому все конкретные зависимости должны быть разрешены во время развертывания. Иногда это невозможно. Большинство наших usecases основаны на введении определенного типа на основе данных времени выполнения или сообщения, полученного от конечного пользователя.

Большая часть нашего дизайна соответствует шаблону команды. поэтому, когда мы получаем команду, мы хотели бы построить нашу модель домена и на основе данных, полученных от команды, мы вводим определенный набор типов в наш совокупный корневой объект. Следовательно, из-за отсутствия возможности Spring построить модель домена на основе данных времени выполнения мы вынуждены использовать статические методы Factory, сборщики и шаблоны Factory.

Может кто-нибудь, пожалуйста, сообщите, имеет ли проблема Spring описанный выше сценарий?

Я мог бы использовать AOP для ввода зависимостей, но тогда я не использую инфраструктуру Spring.

Ответ 1

Я предлагаю вам прочитать раздел в документах Spring, касающихся Использование AspectJ для зависимой инъекции объектов домена с помощью Spring.

Интересно, что вы сказали: "Я мог бы использовать AOP для инъекций зависимостей, но тогда я не использую инфраструктуру Spring", считая, что АОП является основной частью инфраструктуры Spring. Они отлично сочетаются.

Вышеупомянутая ссылка позволяет Spring AOP прозрачно вставлять зависимости в объекты домена, которые создаются без прямой привязки к инфраструктуре Spring (например, с помощью оператора new). Он очень умный, но требует некоторого глубокого обучения при загрузке.

Ответ 2

Spring Вставка/конфигурация зависимостей предназначена только для настройки низкоуровневой технической инфраструктуры, такой как источники данных, управление транзакциями, удаленное соединение, точки подключения сервлетов и т.д.

Вы используете spring для маршрутизации между техническими API-интерфейсами и вашими службами, а внутри этих служб вы просто пишете нормальный Java-код. Сохранение spring вдали от вашей модели домена и реализаций служб - это хорошо. Для начала вы не хотите привязывать бизнес-логику приложения к одной структуре или допускать "утечку" технических проблем низкого уровня в вашу модель домена приложения. Java-код намного проще модифицировать в среде IDE, чем spring XML config, поэтому сохранение бизнес-логики в Java позволяет быстрее выполнять новые функции и упрощать работу приложения. Java гораздо более выразителен, чем формат spring XML, поэтому вы можете более четко моделировать концепции домена, если придерживаетесь простой Java.

Ответ 3

Spring инъекция зависимостей (и вообще инъекция зависимостей) в основном заключается в объединении сервисов, хранилищ и фабрик и т.д. Она не должна непосредственно обрабатывать вещи, которые необходимо выполнять динамически в ответ на команды и т.д., которые включает в себя большинство материалов с объектами домена. Вместо этого он обеспечивает контроль над тем, как это делается, позволяя вам подключаться к объектам, которые вы хотите использовать для их выполнения.