有人可以帮我理解Spring如何用于创建原型实例吗?

时间:2013-07-19 20:34:40

标签: java spring

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

作为一个例子,如果我有一个构造函数采用整数参数的类:

A(int i){}

如果我通过XML bean配置它,那么参数i的值不会被硬编码吗?或者有没有办法在每次需要实例化类时将不同的值传递给i

3 个答案:

答案 0 :(得分:1)

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

<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});

答案 1 :(得分:1)

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

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

关于你的上一个问题,使用SpringEL,你可以调用一个每次都返回不同值的方法。这样每个实例在创建后都会有所不同。

答案 2 :(得分: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>

值=“ - 1”,值=“1”,值=“0”,原型名称发生变化。

当然,从类不仅仅是该类的实例开始,就不可能按类进行自动连接:您需要明确指定要在依赖bean中注入的原型实例。

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

最诚挚的问候, 齐德哈姆迪 - http://1vu.fr