Предоставление сервиса OSGi без реализации интерфейса - PullRequest
2 голосов
/ 27 февраля 2020

Образец 1

@Component(policy = ConfigurationPolicy.OPTIONAL, immediate = false)
public class ServiceImpl implement Service {

  @Override
  public void foo() {

  } 

  ...
}

Образец 2

@Component(policy = ConfigurationPolicy.OPTIONAL, immediate = false)
public class Service {

  public void foo() {
  } 
  ...
}

У меня есть компонент, который состоит из нескольких методов. Я хочу предоставить класс ServiceImpl, который реализует интерфейс службы в качестве службы OSGi (в примере 1). Однако интерфейс сервиса реализован одним классом. Согласно принципу дизайна YAGNI, создание интерфейса только для одного класса не требуется. Вместо этого предпочтительнее создать класс, у которого есть методы (в примере 2). Если я выберу первый пример, я буду игнорировать некоторые соглашения, включая YAGNI и именование классов (не суффикс impl, а спецификация c name). Если я выберу образец 2, он не подходит для среды OSGi. Я не совсем понимаю, что мне делать.

1 Ответ

2 голосов
/ 27 февраля 2020

Создание сервиса без интерфейса возможно и даже распространено в OSGi. Я часто использую его для подключения внутренних компонентов, которые не видны за пределами пакета.

Вам нужно только объявить, что ваш компонент экспортирует класс как службу.

@Component(service=Service.class)
public class Service {

  public void foo() {
  } 
  ...
}
...