Внедрение зависимостей в чертежи
Я сталкивался со случаем, когда я хочу использовать 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 не имеет особого смысла.