简短的问题: 如果我有实现 FactoryBean 接口的类,我如何从 FactoryBean 对象本身而不是 FactoryBean.getObject() 获取?

长问题: 我必须使用基于 Spring 的第 3 方库,该库几乎不使用 FactoryBean 接口。现在我总是必须配置 2 个 bean:

<!-- Case 1-->
<bean id="XYZ" class="FactoryBean1" scope="prototype">
    <property name="steps">
        <bean class="FactoryBean2">
            <property name="itemReader" ref="aName"/>
        </bean>
    </property>
</bean>

<bean id="aName" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.ABC"/>
    </property>
</bean>

<!-- Case 2-->
<bean id="XYZ2" class="FactoryBean1" scope="prototype">
    <property name="steps">
        <bean class="FactoryBean2">
            <property name="itemReader" ref="aName2"/>
        </bean>
    </property>
</bean>

<bean id="aName2" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.QWE"/>
    </property>
</bean>

实际上,名称为“XYZ”的 bean 的定义(与“XYZ2”相比)永远不会改变,但由于工厂性质,我必须复制每个配置的代码。名称为“aName”的 bean 的定义始终是新的(即每个配置都有自己的 objectContext 值)。

我想简化配置,使用单个工厂 bean(删除“XYZ2”并删除到“aName”的链接):

<bean id="XYZ" class="FactoryBean1" scope="prototype">
    <property name="steps">
        <bean class="FactoryBean2"/>
    </property>
</bean>

<bean id="aName" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.ABC"/>
    </property>
</bean>


<bean id="aName2" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.QWE"/>
    </property>
</bean>

不幸的是,事情并不像我想象的那么简单。我想粘合工厂(即示例中的 XYZ bean)以及必要的对象(即“aName”、“aName2”)在运行时。该方法不起作用,因为当我向 Spring 请求 FactoryBean 对象时,它返回给我 FactoryBean.getObject() ,由于缺少 itemReader 值,当时无法实例化该对象。

我希望 SpringSource 预见到我的情况,我可以在某个地方“挂钩” FactoryBean.getObject() 调用以在运行时提供所有必要的属性。

另一个让我有点不安的复杂性是工厂链(Factory1 从 Factory2 获取一个对象,我必须在运行时“挂钩”该对象)。

任何想法将不胜感激。

有帮助吗?

解决方案

这是 & (与符号),而不是 At 符号,请参阅 Spring 框架文档: 使用FactoryBeans自定义实例化逻辑

<property name="factoryBean" ref="&amp;theFactoryBean" />

其他提示

您可以使用&语法在Spring配置得到了工厂bean本身:

<property name="factoryBean" ref="&theFactoryBean" />

,而不是:

<property name="createdBean" ref="theFactoryBean" />
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top