У нас есть приложение / коллекция приложений на основе весенней загрузки.Уже в первом предложении сложно описать его правильно, потому что с бизнес-точки зрения «вещь» - это одно приложение, а с технической точки зрения - как набор приложений весенней загрузки и сценариев обработки пакетных заданий одного бизнес-программного обеспечения.
Например, программное обеспечение состоит из приложения с загрузочной пружиной, предоставляющего rest-api, нескольких приложений с загрузочной пружиной, предоставляющих различные веб-сервисы, и нескольких пакетных заданий, выполняющих различные действия на основе приложений с загрузочной пружиной и других приложений.Теперь некоторые части кода используются только из одного из приложений весенней загрузки - так что это может быть легко размещено в этом конкретном приложении весенней загрузки.Но многие части кода используются из нескольких приложений с весенней загрузкой, но обычно меньше, чем половина приложений.Для этого бизнес-кода у нас есть центральный модуль, импортируемый всеми приложениями весенней загрузки.Добавление этого центрального модуля в приложение весенней загрузки увеличивает большое количество зависимостей (например, зависимость от системы CRM, зависимость от хранилища S3, зависимость для создания файлов Excel, зависимость от внешнего веб-сервиса, зависимость от кролика, ...).Чтобы избежать сотен зависимостей, мы определили многие из них как необязательные.Таким образом, каждое весеннее загрузочное приложение имеет только необходимые ему зависимости.
Проблема сейчас в центральном модуле с внедренными сервисами с бизнес-кодом.Эти услуги внедряются с помощью autowire.Например, приложение весенней загрузки, предоставляющее интерфейс веб-сервиса, не нуждается в сервисе для генерации файлов Excel и для этого не зависит от библиотек Excel и не нуждается в запуске сервиса генерации Excel.
Spring имеет возможность аннотировать сервисы с помощью @ConditionalOnClass и @ConditionalOnBean, но многие сервисы зависят не только от одного условия, но от двух или более.Итак, каков наилучший подход к структурированию сервисов, чтобы запускать их только при необходимости и / или при наличии необходимых зависимостей?
В настоящее время мы используем @ComponentScan с excludeFilters в каждом приложении весенней загрузки, но это подвержено ошибкам,Разделение центрального модуля на несколько модулей или микросервисов не вариант, потому что тогда модули содержат только от 1 до 5 классов.
Есть ли полезная практика для структурирования таких приложений?