在调查代码后我发现:
<bean id="TestBean" class="com.test.checkDate"
factory-method="getPreviousDate">
<constructor-arg value .............
...............................
怎么可能? 感谢。
答案 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}}