2010-08-09 38 views
16

比方說,我有以下Spring配置(春天的版本是3.0.3):如何注入FactoryBean而不是其產生的對象?

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="theFactoryBean" class="wax.MyFactoryBean"/> 

    <bean id="factoryBeanUser" class="wax.FactoryBeanUser"> 
     <!-- what should be placed here?--> 
    </bean> 

</beans> 

我有FactoryBean執行和其他一些實例的實例。我需要Spring注入其他實例FactoryBean,而不是它生成的對象。

有兩種可能的解決方法。

首先一個,明顯,malfunctional:

<bean id="factoryBeanUser" class="wax.FactoryBeanUser"> 
    <property name="myFactoryBean" ref="&theFactoryBean"/> 
</bean> 

有了這個配置春季拋出以下異常的開始:

[skipped irrelevant part] 
Caused by: org.xml.sax.SAXParseException: The reference to entity "theFactoryBean" must end with the ';' delimiter. 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) 
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1414) 

我發現這個解決方案Spring: Getting FactoryBean object instead of FactoryBean.getObject(),這個問題是maked作爲回答四人投了贊成票。所以我認爲這個解決方案可能會起作用,但是目前我的代碼有問題。

第二個,工作,但尷尬:

public class FactoryBeanUser implements ApplicationContextAware{ 

private MyFactoryBean myFactoryBean; 

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     myFactoryBean = (MyFactoryBean)applicationContext.getBean("&theFactoryBean"); 
    } 
} 

我的問題是有可能使第一種方法的功能或者我應該用第二種方式堅守?

+0

我不相信基準的名稱可以用符號開始。我會刪除它,然後重試。這種情況下的引用必須是工廠bean的bean名稱。 – duffymo 2010-08-09 15:21:29

+0

@duffymo如果你是對的,那麼投票回答其他類似主題的人是完全錯誤的:)無論如何,如果我將引用名稱更改爲工廠bean的名稱,Spring會注入'FactoryBean'產生的值。這實際上是'FactoryBean'的目的。 – wax 2010-08-09 15:39:04

+0

我想我也會在這裏學到一些東西;我從來沒有做過。我認爲應用程序的上下文是工廠 - 你還需要什麼? – duffymo 2010-08-09 15:50:09

回答

14

XML解析器似乎將&符號(&)解釋爲XML實體的開始。您可以嘗試使用ref="&amp;theFactoryBean"

spring docs不清楚這個語法是允許在xml文件中,還是隻能用程序查找。但是,然後xml配置被應用上下文使用,所以我假設&amp;應該工作(雖然它似乎不是一個特殊符號的最佳選擇)

這就是爲什麼我會建議另一件事 - 如果你確實需要工廠bean而不是其產品,創建另一個bean,它不實現FactoryBean,定義方法createObject()或類似的東西,並在需要它的所有工廠中使用它。

阿里納斯 - 更好的參考與版本的XSD包括:

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

+0

太棒了!有用。非常感謝你的幫助。 – wax 2010-08-09 15:42:02

+0

@wax - 只是爲了記錄 - '&'工作?或者其他建議? – Bozho 2010-08-09 15:46:40

+1

是的,'&'的作品。 我考慮過你提出的另一件事。在我的真實應用程序中,我已經有'BeanFactory'定義,需要稍微修改才能解決我的問題。這就是爲什麼我認爲重用它比創建另一個bean更好。 – wax 2010-08-09 17:41:31

相關問題