为什么在Spring中将方法声明为静态?

时间:2013-11-28 17:07:49

标签: java spring

当我像这样定义一个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(){};
    }

为什么会这样?两个实现都不应该是静态的吗?

3 个答案:

答案 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的实例必须已经存在,将工厂方法变成多余的东西。