Внедрение зависимостей в чертежи

Я сталкивался со случаем, когда я хочу использовать Blueprint (Aries) для разрешения зависимости во время выполнения, и реализация определяется в том же пакете, который требует этого, и не будет использоваться в других пакетах. Я абстрагирую реализацию в этом комплекте, чтобы упростить имитацию зависимости при модульном тестировании. Если бы я поместил эту услугу в отдельный пакет, это привело бы к плохой сплоченности.

Во время выполнения Blueprint говорит, что ожидает зависимости. Как я могу использовать Blueprint для реализации внедрения зависимостей внутри пакета?

<!-- Interface -->
<reference id="modelEntityMapper" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />
<!-- Implementation defined within same bundle -->
<bean id="modelEntityMapperImpl" class="org.example.blog.rest.cxf.server.model.impl.ModelEntityMapperImpl" />
<service ref="modelEntityMapperImpl" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />

<!-- Object which has dependency -->
<bean id="posts" class="org.example.blog.rest.cxf.server.BlogResourceImpl">
        <property name="modelEntityMapper" ref="modelEntityMapper" />
</bean>

редактировать

Я только что попробовал предложение от @ christian-scheider, и Blueprint все еще ожидает какой-то сервис, чтобы удовлетворить ModelEntityMapper

XML

<!-- Interface -->
<reference id="modelEntityMapper" interface="org.example.blog.rest.cxf.server.model.ModelEntityMapper" />
<!-- Implementation defined within same bundle -->
<bean id="modelEntityMapperImpl" class="org.example.blog.rest.cxf.server.model.impl.ModelEntityMapperImpl" />

<!-- Object which has dependency -->
<bean id="posts" class="org.example.blog.rest.cxf.server.BlogResourceImpl">
        <property name="modelEntityMapper" ref="modelEntityMapperImpl" />
</bean>

Журнал

Bundle rest-cxf-server is waiting for dependencies [(objectClass=org.example.blog.rest.cxf.server.model.ModelEntityMapper)]

2 ответа

Решение

Мне не удалось найти подробную документацию на сайте Aries, связанную со ссылками в пакетах, поэтому я собираюсь сослаться на документацию по реализации Eclipse Gemini Blueprint (ранее Spring Dynamic Modules). См. Предупреждение в разделе 9.2.1.1 их документации. Да, технически это связано с их реализацией, но я думаю, что в Овне, скорее всего, похожая история.

Ошибочно объявлять обязательную ссылку на сервис, который также экспортируется тем же пакетом, это может привести к сбою создания контекста приложения из-за тупика или тайм-аута.

В двух словах, вы обычно либо импортируете (ссылаетесь) сервис OSGi, либо экспортируете сервис OSGi в одном пакете, обычно вы не пытаетесь сделать оба в одном пакете.

Если вы хотите, чтобы этот пакет экспортировал службу типа ModelEntityMapper, то вам нужно будет экспортировать его с service элемент. Когда другим бинам нужна ссылка в том же пакете, вы должны использовать ref атрибут, как будто вы его используете. В этом случае вам не понадобится reference элемент вообще, но вместо этого используйте service элемент.

Если вы не собираетесь использовать ModelEntityMapper боб вне этого пакета, вам не нужно использовать reference или же service элемент в конфигурации вообще. Вы должны быть в состоянии использовать его в ref атрибут, не экспортируя его как сервис OSGi - это, по сути, внутренний компонент этого пакета. В этом случае вы сможете удалить reference элемент в целом: <bean id="modelEntityMapperImpl" ... создаст бин внутри пакета, а <property name="modelEntityMapper" ref="modelEntityMapperImpl" /> Элемент должен иметь возможность использовать этот bean-компонент внутри пакета.

Если вы хотите импортировать ссылку типа ModelEntityMapper из OSGi, если доступно, иначе используйте внутренне определенный запасной вариант, который становится более сложным. Вы должны объявить необязательным reference и вставьте эту ссылку в ваш класс вместе с внутренним компонентом, а затем используйте логику по умолчанию, которая проверяет их доступность. В качестве альтернативы вы можете просто определить реализацию в отдельном пакете от интерфейса.

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

Другие вопросы по тегам