Я ищу Руководство по правильной архитектуре этого в SpringBoot.
В основе моего проекта у меня есть приложение SpringBoot, которое будет настроено при запускевремя через значение свойства, которое будет определенным AdapterType my.adapter.type
Для этого примера возможными значениями являются:
Modem
Turkey
Computer
Beef
На пути к классам будет существовать jar файл с пакетом: org.myapp.adapters
. В этом пакете находятся различные классы Spring @Component
, каждый из которых реализует интерфейс SystemAdapter
, который задает type
(один из перечисленных выше типов) и метод getType()
.
Приложение будет использовать
@ComponentScan(basePackages = {"org.myapp.adapters"})
при запуске, чтобы узнать, какие адаптеры существуют, и затем вызовет метод getType()
на каждом адаптере, чтобы определить, к какому типу он относится.
Далее SystemAdapterFactory
будетсопоставить значение свойства my.adapater.type
с типом, возвращаемым методами getType()
Бинов, возвращающих правильный адаптер для заданного указанного типа.
Цель состоит в том, чтобы обеспечить интерфейс SystemAdapter
иEnum jar для других команд, которые могут написать свои собственные библиотеки SystemAdapater. Затем при запуске мы можем поменять DefaultAdapaters.jar , скажем, FoodAdapaters.jar
Используя аннотацию @ComponentScan
и предположив, что адаптеры находятся в правильной упаковкеЯ думаю, что мы можем менять реализации на лету - без необходимости компилировать основной класс.
Где я сталкиваюсь с путаницей, это как на самом деле настроить Gradle и SpringBoot, чтобы делать то, что я хочу. Похоже, что задание по умолчанию bootJar компилируется в кучу файлов .class
- и поэтому я не знаю, как на самом деле построить это решение.
Я думаю, мне нужно 3 отдельныхпроекты (или модули)
Application
Interface
AdapterImplementation
Я считаю, что если я использую конфигурацию загрузчика свойств в моем проекте Application
:
bootJar {
manifest {
attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
}
}
Теоретически я должен быть в состоянии перейти в другой Jarфайлы в classPath во время выполнения, и он их заберет.
Основополагающим принципом проектирования здесь является то, что если я смогу загрузить (во время выполнения) другой файл jar реализации и получить его работа без необходимости связываться с основным приложением.
Так что мои вопросы:
1) Правильный ли я подход к тому, как структурировать и, возможно, заставить это работать
2) Есть ли другой метод, который мы пропустили, который упростил бы все?
Спасибо