2010-12-17 93 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