0

如果bean是通过XML配置的,那么其构造函数的输入参数总是相同的,所以即使我将范围声明为原型,类实例中的成员对于所有对象都是相同的?那么,它的原型是怎样的呢?

例如,如果我有一个类,其构造函数采用整数参数:

A(int i){}

如果我通过 XML bean 配置它,参数的值不会在i那里硬编码吗?i或者有没有一种方法可以在每次需要实例化类时传递不同的值?

4

3 回答 3

1

所有实例在创建后都是相同的。但是如果它们是有状态的,那么经过一些操作之后它们就不会一样了。

当然,如果您的 bean 是无状态的,我认为将其作为原型没有任何优势。

关于您的最后一个问题,使用 SpringEL,您可以例如调用一个每次返回不同值的方法。这样每个实例在创建后都是不同的。

于 2013-07-19T20:56:32.040 回答
1

您可以为同一个类声明任意数量的原型:

<bean id="beanNegative" class="MyBean" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="-1"/>
</bean>

<bean id="beanPositive" class="MyBean" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="1"/>
</bean>

<bean id="beanNeutral" class="MyBean" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="0"/>
</bean>

只有value="-1"、value="1"、value="0"和原型的名称发生了变化。

自然,从拥有多个类的实例的那一刻起,就不可能按类进行自动装配:您需要明确指定要在依赖 bean 中注入的原型实例。

另请注意,原型与单例的不同之处在于,每次从 spring 获取 bean 时,它都是一个新实例,而单例将为您的应用程序中的所有其他 bean 提供相同的实例。

最好的问候,Zied Hamdi - http://1vu.fr

于 2013-07-20T00:42:11.210 回答
1

直接使用 getBean 时可以提供值。要获得更优雅的解决方案,请在 spring 文档中查找“方法注入”。

<bean id="beanA" class="A" scope="prototype">
        <constructor-arg index="0" type="java.lang.Integer" value="null"/>
</bean>

A bean = (A) applicationContext.getBean("beanA", new Object[]{someInteger});
于 2013-07-19T20:56:22.237 回答