如何将一个blueprint.xml中的单例bean注入到单独的blueprint.xml中?

时间:2019-04-14 14:27:36

标签: java dependency-injection blueprint-osgi

我有一个Java类,它充当代表实体(在我的示例中是各种苹果)的多个其他类的注册表。有两个主要步骤:

  1. 实体在blueprintA中定义。 注册表也填充在blueprintA中。我的理解是,蓝图作为其依赖项注入过程的一部分(以及整个blueprint.xml文件)自动处理正确的顺序。

  2. 创建一个资源类,并将注册表作为构造函数的参数或属性设置器的参数注入。就我而言,我使用了一个bean setter。

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 :(得分:0)

由于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>