怎么可以用工厂方法但没有工厂的春豆?

时间:2011-10-31 10:38:48

标签: java spring javabeans factory

在调查代码后我发现:

 <bean id="TestBean" class="com.test.checkDate"
 factory-method="getPreviousDate">
 <constructor-arg value .............

 ...............................

怎么可能? 感谢。

2 个答案:

答案 0 :(得分:24)

来自docs

  

bean定义中指定的构造函数参数将是   用于作为参数传递给ExampleBean的构造函数。   现在考虑一个变体,而不是使用构造函数,   Spring被告知调用静态工厂方法来返回实例   对象:

<bean id="exampleBean" class="examples.ExampleBean"
      factory-method="createInstance">
  <constructor-arg ref="anotherExampleBean"/>
  <constructor-arg ref="yetAnotherBean"/>
  <constructor-arg value="1"/> 
</bean>

<bean id="anotherExampleBean" class="examples.AnotherBean"/>
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>

public class ExampleBean {

    // a private constructor
    private ExampleBean(...) {
      ...
    }

    // a static factory method; the arguments to this method can be
    // considered the dependencies of the bean that is returned,
    // regardless of how those arguments are actually used.
    public static ExampleBean createInstance (
            AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) {

        ExampleBean eb = new ExampleBean (...);
        // some other operations...
            return eb;
    }
}
  

请注意,静态工厂方法的参数是通过提供的   constructor-arg元素,与构造函数完全相同   实际上已被使用。此外,重要的是要认识到的类型   由工厂方法返回的类不必是   与包含静态工厂方法的类相同的类型,   虽然在这个例子中它是。实例(非静态)工厂   方法将以基本相同的方式使用(除了   使用factory-bean属性而不是class属性),   所以这里不讨论细节。

答案 1 :(得分:1)

这只是意味着com.test.checkDate有一个名为getPreviousDate的静态方法。您的工厂创建对象是com.test.checkDate。我们不知道返回的对象是哪种类型,在配置中没有说,可能是java.util.Date

  

定义没有指定返回对象的类型(类),只指定包含工厂方法的类。

constructor-arg只是作为参数传递给getPreviousDate。由于该方法是静态的,因此不需要checkDate的实例。如果使用constructor-arg来调用一个技术上不是构造函数的方法听起来很有趣,那么认为静态方法确实构造了一个Object,因此它更容易记住。

因为在您的答案的早期版本中,您提到“没有工厂”,也许您正在考虑instantiation using an instance factory method的情况,这需要factory-bean属性,但这是{ {3}}