Как я могу внедрить синглтон-бин из одного blueprint.xml в отдельный blueprint.xml? - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть класс Java, который служит реестром нескольких других классов, которые представляют сущности (в моем примере, разновидности яблок). Для этого есть два основных шага:

  1. сущности определены в blueprintA. Реестр также заполняется в blueprintA. Насколько я понимаю, проект автоматически обрабатывает правильный порядок как часть процесса внедрения зависимостей (и между файлами blueprint.xml).

  2. Класс resource создается и в него вводится реестр в качестве аргумента конструктора или аргумента для установщика свойства. В моем случае я использовал средство для установки бобов.

blueprintA

<?xml version="1.0" encoding="UTF-8" ?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <bean id="AppleRegistry" class="com.domain.AppleRegistry" activation="lazy" scope="singleton">
        <property name="apples">
            <set value-type="com.domain.apple.IApple">
                <ref component-id="macintosh" />
                <ref component-id="baldwin" />
                <ref component-id="stayman" />
                <ref component-id="crispin" />
            </set>
        </property>
    </bean>

    <bean id="macintosh" class="com.domain.apple.IApple"/>
    <bean id="baldwin" class="com.domain.apple.IApple"/>
    <bean id="stayman" class="com.domain.apple.IApple"/>
    <bean id="crispin" class="com.domain.apple.IApple"/>

</blueprint>

blueprintB

<?xml version="1.0" encoding="UTF-8" ?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <bean id="AppleResource" class="com.domain.api.AppleResource" scope="singleton">
        <property name="appleRegistry">
            <ref component-id="AppleRegistry" />
        </property>
    </bean>

</blueprint>

Я ожидаю, что мой код будет работать, но я получаю ошибки в журнале, в том числе:

Unable to load com.domain.api.AppleResource from recipe BeanRecipe[name='AppleResource'], trying to load a nested class com.domain.api$AppleResource

Я знаю, что я пропустил реализации bean-компонентов, но этот вопрос не о них. Я мог бы напечатать некоторый код по запросу, если они будут актуальны.

1 Ответ

0 голосов
/ 15 апреля 2019

Поскольку AppleRegistry и AppleResource являются менеджерами высшего уровня, Blueprint не может автоматически определять зависимость между ними (например, неявные зависимости суб-менеджеров).Он должен быть явно объявлен:

  • depends-on="com.domain.OtherTopLevelManager"

Пример

<bean id="AppleResource" class="com.domain.api.AppleResource" scope="singleton" depends-on="AppleRegistry">
        <property name="appleRegistry">
            <ref component-id="AppleRegistry" />
        </property>
</bean>
...