Spring:获取FactoryBean对象而不是FactoryBean.getObject()

时间:2009-10-31 18:16:07

标签: java spring factory spring-batch

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

长问题:我必须使用第三方基于Spring的库,这很难使用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获取了一个我必须在运行时“挂钩”的对象)。

任何想法都将受到赞赏。

2 个答案:

答案 0 :(得分:20)

这是&(&符号),而不是At符号,请参阅Spring Framework文档:Customizing instantiation logic using FactoryBeans

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

答案 1 :(得分:2)

您可以使用spring config中的&语法获取工厂bean本身:

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

而不是:

<property name="createdBean" ref="theFactoryBean" />