Java Spring:获取FactoryBean对象而不是FactoryBean.getObject()
简短问题:如果我有推动FactoryBean接口的类,我如何从FactoryBean对象本身而不是从FactoryBean.getObject()获取 长问题:我必须使用基于第三方Spring的库,它几乎不使用FactoryBean接口。现在,我必须始终配置2个bean:Java Spring:获取FactoryBean对象而不是FactoryBean.getObject(),java,spring,factory,spring-batch,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"&g
<!-- 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”(与“XYZ2”相比)的bean的定义永远不会更改,但由于工厂的性质,我必须为每个配置复制代码。
名为“aName”的bean的定义总是新的(即每个配置都有自己的objectContext值)
我希望通过一个工厂bean来简化配置(删除“XYZ2”并去掉指向“aName”的链接):
不幸的是,这并不像我想象的那么简单。我假设在运行时将工厂(即示例中的XYZ bean)与必要的对象(即“aName”、“aName2”)粘合在一起。
这种方法不起作用,因为当我向Spring请求FactoryBean对象时,它返回给我FactoryBean.getObject(),由于缺少itemReader值,当时无法实例化它
我希望SpringSource预见到我的情况,我可以在运行时调用某个Home“hook”FactoryBean.getObject()来提供所有必要的属性
另一个让我有点不安的复杂性是工厂链(Factory1从Factory2获取一个我必须在运行时“钩住”的对象)
任何想法都将受到欢迎。您可以使用spring配置中的
&
语法获得工厂bean本身:
<property name="factoryBean" ref="&theFactoryBean" />
与之相反:
<property name="createdBean" ref="theFactoryBean" />
它是&
(与符号),而不是At符号,请参见Spring框架文档:
你真的检查过了吗?我尝试过这种方法,但失败了,出现了如下异常:由:org.xml.sax.saxpasseeption引起:对实体“theFactoryBean”的引用必须以“;”结尾分隔符。@wax:谢谢,你当然是对的,XML必须正确转义。我已经纠正了,只是不要在EL表达式中尝试这个。我有一个bug:){&;theFactoryBean}不起作用:(它不象你描述的那样起作用。正确答案如下。
<property name="createdBean" ref="theFactoryBean" />
<property name="factoryBean" ref="&theFactoryBean" />