如何将一个 blueprint.xml 中的单例 bean 注入到另一个 blueprint.xml 中?
How can I inject a singleton bean from one blueprint.xml into a separate blueprint.xml?
我有一个 Java class 用作多个其他 class 代表实体(在我的示例中,苹果品种)的注册表。这有两个主要步骤:
实体在蓝图A中定义。 registry 也被填充到 blueprintA 中。我的理解是,蓝图会自动处理正确的顺序,作为其依赖注入过程的一部分(并跨 blueprint.xml 个文件)。
A resource class 被创建并注入注册表作为构造函数的参数或作为参数注入 属性 setter。就我而言,我使用了一个 bean setter.
蓝图A
<?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>
蓝图B
<?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 实现,但这个问题与它们无关。如果相关,我可以根据要求输入一些代码。
因为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>
我有一个 Java class 用作多个其他 class 代表实体(在我的示例中,苹果品种)的注册表。这有两个主要步骤:
实体在蓝图A中定义。 registry 也被填充到 blueprintA 中。我的理解是,蓝图会自动处理正确的顺序,作为其依赖注入过程的一部分(并跨 blueprint.xml 个文件)。
A resource class 被创建并注入注册表作为构造函数的参数或作为参数注入 属性 setter。就我而言,我使用了一个 bean setter.
蓝图A
<?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>
蓝图B
<?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 实现,但这个问题与它们无关。如果相关,我可以根据要求输入一些代码。
因为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>