osgi #declarative-services
#osgi #декларативные службы
Вопрос:
У меня есть интерфейс сервиса Logger
и фабрика сервисов
interface LoggerFactory {
Logger createLogger(String name)
}
Мои компоненты используют его следующим образом:
@Component
public class User {
private Logger logger;
@Activate
public User(@Reference LoggerFactory loggerFactory) {
logger = loggerFactory.create("user")
}
}
Я хотел бы избавиться от LoggerFactory
и вместо этого иметь возможность извлекать мой регистратор следующим образом:
@Component
public class User {
@Reference(target = "(name=user)")
private Logger logger;
}
Я попытался создать прототипы реализаций регистратора, но SCR не создал регистраторы, как ожидалось. Это потому, что заводские компоненты всегда требуют configurationPID от ConfigAdmin?
Я также попытался зарегистрировать PrototypeServiceFactory для интерфейса Logger явно через контекст пакета, но безуспешно.
У меня сложилось впечатление, что это должно как-то работать с декларативными службами, поскольку другой вариант использования соответствует этому шаблону, поэтому это кажется распространенной проблемой: многие компоненты используют http-сервис, но с другим портом. Я хотел бы использовать целевой фильтр для ссылки вместо моей пользовательской фабрики.
1.) Как я могу этого добиться?
2.) Если это невозможно, есть ли альтернативы? Например, иметь какую-то другую фабрику сервисов, которая использует имя компонента в качестве имени регистратора?
3.) Если это может как-то сработать, могу ли я сделать целевой фильтр необязательным, который затем выбирает не случайный регистратор, а тот, который использует имя компонента?
Ответ №1:
Свойство target — это выражение фильтра LDAP, используемое для выбора службы из реестра служб OSGi. target = "(name=user)"
означает, что служба должна иметь свойство службы «name» со значением «user». Свойство target нельзя использовать для вызова службы с некоторым аргументом.
DS имеет специальную поддержку для службы журналов OSGi, но эта поддержка является специальной и обычно не применяется ни к одному произвольному сервису.