Какие механизмы расширения / плагина / провайдера можно использовать для расширения моего веб-приложения?
Я работаю над веб-приложением JavaEE, которое сможет извлекать данные из разных источников. Данные будут извлечены и сохранены в базе данных для последующей обработки и составления отчетов. Я начал с одного поставщика данных по умолчанию, охватывающего конкретный источник, но хотел бы спроектировать архитектуру приложения таким образом, чтобы я или даже другие могли писать плагины поставщиков данных / поставщиков данных для разных источников данных.
Поставщики услуг могут быть реализованы независимо от основного приложения и могут быть упакованы в отдельные банки. После удаления в путь к классам веб-приложений реализация поставщика будет распознаваться как поставщики услуг ядром приложения, которое запускает задание выборки данных.
Я ищу стандартный способ реализации этого SPI или точек расширения, но он не должен раздуть код моего приложения.
Я думал о "точках расширения OSGI", но это больше для приложений на платформе rcp, а мое - это веб-приложение. Так что я исключил это сейчас.
Моя вторая идея - это комбинация предопределенных интерфейсов провайдера, а затем использование пользовательских аннотаций "провайдера" для маркировки реализующих классов (провайдеров услуг).
Какие механизмы / подходы / рамки вы можете порекомендовать для решения этого архитектурного вопроса?
Большое спасибо заранее и ура, Майкл
1 ответ
Я бы использовал наблюдателя событий. Во время запуска приложения вы поднимаете DiscoverDataProviders
событие, которое имеет registerDataProvider(...)
метод. Расширительные банки могут наблюдать за событием и регистрировать себя.
См. http://docs.oracle.com/javaee/6/api/javax/enterprise/event/Observes.html