如果bean是通过XML配置的,那么它的构造函数的输入参数总是相同的,所以即使我将范围声明为原型,类实例中的成员对于所有对象都是相同的?那么,它是如何原型的?
作为一个例子,如果我有一个构造函数采用整数参数的类:
A(int i){}
如果我通过XML bean配置它,那么参数i
的值不会被硬编码吗?或者有没有办法在每次需要实例化类时将不同的值传递给i
?
答案 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