Чтобы отдать предпочтение определенным реализациям служб перед другими, я написал настраиваемую версию java.util.ServiceLoader
(добавляет приоритет и включенный/отключенный флаг к реализациям через файлы настроек для кода, отличного от OSGi).
Клиент был доволен и хотел такой же настройки для реализаций службы OSGi. Разработанное решение основано на вызове getServiceReferences(Class<S> clazz, String filter)
на < a href="https://osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html" rel="nofollow noreferrer">BundleContext
и использует фильтр null
для получения всех реализаций.
Тем не менее возиться с OSGi на таком низком уровне оставляет неприятный осадок. Там много стандартного кода (например, обязательные подтипы BundleActivator
) и используемый подход также будет мешать плавному переходу на декларативные сервисы и какой-то момент времени.
Я также читал о свойстве SERVICE_RANKING
, но сравнил к файлам предпочтений из описанного выше подхода, у него есть недостаток, заключающийся в том, что каждая реализация устанавливает свое собственное свойство ранжирования, и впоследствии невозможно изменить ранжирование.
Итак, мой вопрос: каковы веские аргументы против этого низкоуровневого подхода? Почему вместо этого следует использовать декларативные службы?
SERVICE_RANKING
вместе с политикой ранжирования, например. стандартный код имеет рейтинг ‹ 100, код клиента (что более важно) имеет рейтинг › 1000. Возможно ли это? - person mike   schedule 16.11.2017