SCR Apache Felix позволяет объявлять (через аннотации или XML) компоненты, которые затем будут созданы, подключены к их зависимостям и зарегистрированы как службы OSGi.
Также можно пропустить часть регистрации службы и просто заставить SCR создать компонент (указав @ scr.component, но опуская @ scr.service). Я думал, что это может быть полезно только для внедрения зависимостей (внутри пакета), но как использовать компоненты? Сервисы могут быть введены с помощью scr.reference, но это не работает для не-сервисов (или работает)?
Прямой доступ к SCR API работает, но прямой разговор с контейнерными службами как бы побеждает цель DI.




Я думаю, вы можете вводить только службы OSGI. Если вы хотите использовать инъекцию зависимостей, возможно, вам стоит проверить Google Guice. К сожалению, я не знаю, работает ли он из коробки внутри контейнера OSGI.
Что касается компонентов SCR, если компонент предоставляет функциональные возможности, которые вы хотите использовать в другом компоненте, я думаю, что его следует раскрыть с помощью службы.
DS отлично подходит для этого. «если компонент предоставляет функциональные возможности, которые вы хотите использовать в другом компоненте, я думаю, что он должен быть раскрыт с помощью службы» - именно так. Если вам нужна «внутренняя-связка-зависимость-инъекция», вам может потребоваться настроить Компонент с частным классом реализации (а не с общедоступным интерфейсом) в качестве предоставленной службы и ссылаться на эту службу из вашего пакета в другом компоненте. Таким образом, сервис находится в глобальном реестре сервисов, но никакой другой пакет никогда не получит к нему доступ, потому что он не сможет загрузить класс.
Peaberry (code.google.com/p/peaberry) - это адаптация Guice для работы с OSGi.