当我像这样定义一个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(){};
}
为什么会这样?两个实现都不应该是静态的吗?
答案 0 :(得分:1)
您正在尝试创建一个静态工厂(使用相关方法)来创建bean。
代码类似于:
public class BeanClass {
private static BeanClass instance = new BeanClass();
private BeanClass(){
}
public static BeanClass getter(){
return instance;
}
}
您的春季背景可能类似于:
<bean id="beanClassInstance" class="BeanClass" factory-method="getter"/>
然后,这将使用静态工厂方法,而不是尝试通过构造函数实例化单例。
答案 1 :(得分:0)
在第一种情况下,您告诉Spring使用特定的bean(testBean2
的实例)来提供另一个bean的实例(testBean
)。
在第二种情况下,您告诉bean testBean
类在其类test
上有一个静态工厂方法来提供bean实例。
请注意,“factory bean”是一个特殊术语,指的是能够生成其他bean的bean。通常这些bean以FactoryBean
实现的形式出现。
答案 2 :(得分:0)
由于您声明工厂方法getter
位于您希望通过工厂方法实例化的bean testBean
中
见这里:
<bean id="testBean" class="test" factory-method="getter">
在bean的实例存在之前,spring可以访问该方法的唯一方法是静态的。
否则该bean的实例必须已经存在,将工厂方法变成多余的东西。