当我像这样定义一个bean时:
<bean id="testBean2" class="test">
</bean>
<bean id="testBean" factory-bean="testBean2" factory-method="getter"/>
class test {
public void getter(){};
}不需要将bean定义为静态的。
但是,如果我像这样定义bean:
<bean id="testBean" class="test" factory-method="getter">
</bean>我收到一个Spring错误,要求bean是静态的,所以我需要将它更改为:
class test {
public static void getter(){};
}为什么会发生这种事?这两种实现不应该是静态的吗?
发布于 2013-11-29 17:40:30
您正在尝试创建用于创建bean的静态工厂(以及相关的方法)。
其代码如下所示:
public class BeanClass {
private static BeanClass instance = new BeanClass();
private BeanClass(){
}
public static BeanClass getter(){
return instance;
}
}您的spring上下文可以类似于:
<bean id="beanClassInstance" class="BeanClass" factory-method="getter"/>然后,这将使用静态工厂方法,而不是尝试通过构造函数实例化单个实例。
发布于 2013-11-28 17:18:11
在第一种情况下,您告诉Spring使用特定的bean (testBean2的实例)来提供另一个bean (testBean)的实例。
在第二个例子中,您要说明的是,bean testBean的类在其类test上有一个静态工厂方法来提供bean实例。
请注意,“工厂bean”是一个特殊的术语,指的是能够产生其他bean的bean。这些bean通常以FactoryBean实现的形式出现。
发布于 2013-11-28 17:28:39
由于您将工厂方法getter声明为位于要通过工厂方法实例化的bean testBean中。
见这里:
<bean id="testBean" class="test" factory-method="getter">在bean的实例存在之前,在spring之前访问该方法的唯一方法是静态的。
否则,该bean的一个实例就必须已经存在,将工厂方法转化为多余的东西。
https://stackoverflow.com/questions/20271535
复制相似问题