Доступ к контекстному файлу Spring для пакета OSGi из другого пакета - PullRequest
1 голос
/ 19 июля 2011

У меня есть приложение, которое существует в виде нескольких проектов Spring. XML-файл контекста Spring проекта A использует XML-файл контекста Spring B, используя

<import resource="classpath*:/META-INF/spring/BContext.xml" />

Однако, это я получаю FileNotFoundException. Я предполагаю, что это вызвано тем фактом, что ресурс не предоставляется пакетом проекта B. Я могу получить доступ к классам, но не к файлу.

При исследовании этой проблемы общим комментарием было использование сервисов OSGi и внедрение сервисов вместо попыток внедрить компоненты напрямую. Однако, поскольку это уже существующее приложение, я бы хотел избежать переподключения всего этого.

Есть ли способ сказать OSGi об экспорте ресурса? Я использую ServiceMix на Karaf.

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Загрузка контекста Spring и всех классов реализации из другого модуля является огромным нарушением инкапсуляции модуля. Если вы готовы сделать это, то для A и B нет никакого смысла вообще разделять пакеты, и вы могли бы также сделать их одним пакетом.

3 голосов
/ 20 июля 2011

Способ, которым вы должны это сделать, - это использовать OSGi Services.Вы можете зарегистрировать службу в Spring DM с помощью следующего (что обычно делается в отдельном файле osgi-context.xml, чтобы гарантировать, что база кода не зависит от OSGi в целях тестирования. В этом примере у вас будет компонент сидентификатор клиники, определенный в BContext.xml и называемый службой OSGi

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/osgi"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/osgi  
        http://www.springframework.org/schema/osgi/spring-osgi.xsd
        http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <service id="osgiClinic" ref="clinic" interface="org.springframework.petclinic.repository.Clinic" />

</beans:beans>

Затем в файле osgi-context.xml потребляющего пакета вы будете ссылаться на службу.есть компонент bean, который использует код из первого компонента.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/osgi"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/osgi  
        http://www.springframework.org/schema/osgi/spring-osgi.xsd
        http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <reference id="clinic" interface="org.springframework.petclinic.repository.Clinic"/>

</beans:beans>

Этот способ работы поможет вам подумать о зависимостях между вашими пакетами и экспортировать только те службы, которые необходимы для других пакетов..

3 голосов
/ 20 июля 2011

Это просто ресурс classpath, поэтому я предполагаю, что добавление соответствующей директивы Export-Package поможет. Это определенно не правильный способ сделать это, хотя. Путь к этому файлу контекста предполагает, что, возможно, проект, который содержит BContext.xml, уже настроен для работы с Spring Dynamic Modules. Если это так, то при запуске этого пакета Spring ApplicationContext экспортируется как сервис. Ищите это в своей консоли OSGi.

Редактировать: В ответ на обсуждение в комментариях:

Я никогда не пробовал это сам, но теоретически должно быть возможно использовать пространство имен osgi Spring DM, чтобы сделать ссылку bean-компонента на службу OSGi , которая является ApplicationContext проекта B. Затем, имея bean-компонент ApplicationContext, вы можете использовать обычную конфигурацию Spring для извлечения из него bean-компонентов, используя one из getBean () методы. Обратите внимание, что вы можете использовать <constructor-arg ... /> для указания аргументов для фабричного метода в конфигурации Spring, как показано в нижней части раздела с примерами .

...