2010-12-17 123 views
0

我可以從一個靜態工廠對象創建一個對象,像這樣:創建一個從靜態工廠方法工廠,然後調用靜態工廠方法上的ID

<bean id="myFactory" class="com.myco.MyFactory1" factory-method="createFactory"> 
    <constructor-arg value="aString" /> 
</bean> 

現在我想用id「myFactory」調用其 靜態 「createFactory」方法。

在java中是這樣的:

ObjectFactory objectFactory = MyFactory.createFactory().createFactory(); //Last createFactory method returns type ObjectFactory 
+3

不理解。你想要像MyFactory.createFactory()。createFactory()'? – Bozho 2010-12-17 21:30:50

+0

是的,MyFactory.createFactory()。createFactory()。我會更新這個問題來反映這一點。 – Quaternion 2010-12-17 21:38:44

+1

也許你需要澄清你想要完成的事情。如果createFactory創建工廠,那麼爲什麼要創建另一個工廠?你不是已經擁有了嗎? – Jay 2010-12-17 22:03:25

回答

2

您可以在bean實例上調用工廠方法,但在這種情況下,工廠方法不能是靜態的。

<bean id="myFactory2" factory-bean="myFactory" factory-method="createFactory"> 

</bean> 

無論如何,我同意其他人。您需要詳細說明要求。如果你的第一個com.myco.MyFactory1返回了com.myco.MyFactory1的一個實例,調用它的createInstance方法沒什麼意義。在返回相同的類時,將調用相同的靜態方法。

如果您的第一個工廠com.myco.MyFactory1返回不同類的實例,則可以使用上面的代碼調用這些工廠的方法。但請記住,在這種情況下它們必須是非靜態的。

UPDATE:

有可能通過調用另一個bean實例的靜態方法,如下所示創建新實例。

<bean id="myFactory2" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject"><ref local="myFactory"/></property> 
    <property name="targetMethod"><value>createFactory</value></property> 
</bean> 

不過,你應該重新考慮你的設計。

+0

+1。我忘了'工廠bean' :) – Bozho 2010-12-17 22:25:18

+0

我嘗試了一個工廠bean,但顯然沒有正確的。 – Quaternion 2010-12-17 22:44:45

+0

這回答了這個問題,不幸的是我的問題是錯誤的:我現在需要問從靜態工廠方法創建工廠,然後致電靜態工廠方法在該ID。按照您提供的內容,我仍然有錯誤。 – Quaternion 2010-12-17 22:54:58

2

這是無效的Java代碼。它假定你的MyFactory有兩個同名的方法 - 一個是static,另一個是非靜態的。這是不可能的。

如果要調用相同的靜態方法兩次,或另一個對象調用一個方法 - 好了,你可以很容易地調用它只有一次/合併這兩個調用,到一個,說createObjectFactory()

此外,看起來很奇怪創造一個因素反過來創造一個工廠反過來創造另一個工廠。聽起來像一個糟糕的設計(過度設計)。

+0

難道MyFactory不能實例化一個FooFactory,它有一個靜態方法來創建我真正需要的對象? – Quaternion 2010-12-17 22:06:22

+0

是的,我包括了一個關於這方面的更新。擁有3家工廠只是錯誤 – Bozho 2010-12-17 22:24:27