Могут ли bean-компоненты Blueprint автоматически внедрять службы @Reference?

Можно ли автоматически внедрять экземпляры, созданные с помощью тега Blueprint <bean>, со ссылками на службы, указанными с помощью механизма декларативных служб OSGi?

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component(service={})
public class DatabaseThing{
    @Reference
    public void setDataSource(DataSource ds){
    ...
    }

Если я создам экземпляр через immediate=true в @Component, тогда будет внедрена моя служба DataSource OSGi. Если я создам экземпляр с помощью схемы <bean class="DatabaseThing">, то автоинъекция не произойдет.

Я просмотрел исходный код Aries, и мне кажется, что сервисная инъекция специфична для org.apache.aries.blueprint.container.ServiceRecipe и не является частью ...BeanRecipe, который используется для создания экземпляра в стиле <bean>.


person Paul M    schedule 10.12.2015    source источник


Ответы (1)


Это не работает. Аннотации DS обрабатываются bnd, в результате чего создается XML-файл DS, который затем будет оцениваться felix scr во время выполнения. В этом случае полный жизненный цикл объекта контролируется scr.

Если вы дополнительно объявите bean-компонент blueprint для того же класса, он будет отдельным экземпляром. Blueprint может внедрять службы и bean-компоненты в этот экземпляр, но он полностью отключен от DS.

Если вашей основной задачей является использование аннотаций для внедрения чертежей, я рекомендую blueprint-maven- плагин. Это позволяет использовать аннотации CDI и Java EE в вашем коде. Они переводятся в blueprint.xml во время сборки. Таким образом, результат аналогичен DS, но работает по схеме.

person Christian Schneider    schedule 10.12.2015
comment
Большое спасибо, Кристиан - я так и думал, но ваше подтверждение приветствуется. Аннотации pax-cdi выглядят так, как будто они могут быть тем, что мне нужно — я просто хочу писать как можно меньше кода! - person Paul M; 11.12.2015
comment
Вы также можете заглянуть в Aries CDI. Он реализует новую спецификацию OSGi для интеграции OSGi и CDI. github.com/apache/aries/tree/trunk/cdi - person Christian Schneider; 04.12.2018