Сначала немного фона:
Я работаю над некоторым прототипом кода webapp, основанным на Apache Sling, который основан на OSGI и работает на Apache Felix. Я по-прежнему относительно новичок в OSGI, хотя я думаю, что уже понял большинство концепций. Однако, что меня озадачивает, так это то, что я не смог найти "полную" схему внедрения зависимостей (DI). Я успешно использовал рудиментарный DI, используя Declarative Services (DS). Но я понимаю, что DS используется для ссылки - как я могу это поставить? - OSGI зарегистрировал сервисы и компоненты вместе. И для этого он отлично работает, но я лично использую рамки DI, такие как Guice, чтобы объединить все графические объекты и поместить объекты в правильные области (подумайте @RequestScoped
или @SessionScoped
например). Однако ни одна из конкретных структур OSGI, на которые я смотрел, похоже, поддерживает эту концепцию.
Я начал читать о чертежах OSGI и iPOJO, но эти рамки, похоже, больше связанные с подключением служб OSGI, а не с предоставлением полного решения DI. Я должен признать, что я еще не сделал никаких образцов, поэтому мое впечатление может быть неправильным.
Являясь расширением для Guice, я экспериментировал с Peaberry, однако мне очень трудно найти документацию, и, хотя я получил базовую работу DI, много функциональных возможностей guice-servlet (автоматический ввод в фильтры, сервлеты и т.д.) вообще не работало.
Итак, мои вопросы таковы:
- Как декларативные службы сравниваются с "традиционными" DI, такими как Guice или Spring? Решают ли они одну и ту же проблему или они направлены на различные проблемы?
- Все решения OSGI, которые я видел до сих пор, не имеют концепции областей для DI. Например, Guice + guice-servlet имеет зависящие от запросов зависимости, которые делают записи веб-приложений действительно чистыми и легкими. Я просто пропустил это в документах или эти проблемы не охвачены ни одной из этих фреймворков?
- Являются JSR 330 и OSGI основаны на DI двух разных мирах? iPOJO, например, приносит свои собственные аннотации и Felix SCR Annotations, кажется, совсем другой мир.
- Есть ли у кого-нибудь опыт создания OSGI-систем и DI? Может быть, даже пример кода на github?
- Кто-нибудь использует разные технологии, такие как Guice и iPOJO, или это просто сумасшедшая идея?
Извините за довольно длинный вопрос.
Любая обратная связь очень приветствуется.
Обновление
Инъекция с областью: инъекция с областью - это полезный механизм, позволяющий автоматически вводить объекты из определенного жизненного цикла. Подумайте, например, некоторые из вашего кода полагаются на объект сеанса Hibernate, который создается как часть фильтра сервлета. Пометив зависимость, контейнер автоматически перестроит граф объекта. Может быть, есть только разные подходы к этому?
JSR 330 против DS: из всех ваших превосходных ответов я вижу, что это две разные вещи. Это ставит вопрос, как обращаться с сторонними библиотеками и фреймворками, использующими аннотации JSR 330 при использовании в контексте OSGI? Какой хороший подход? Запуск контейнера JSR 330 в Bundle?
Я ценю все ваши ответы, вы были очень полезны!