如果bean是通过XML配置的,那么其构造函数的输入参数总是相同的,所以即使我将范围声明为原型,类实例中的成员对于所有对象都是相同的?那么,它的原型是怎样的呢?
例如,如果我有一个类,其构造函数采用整数参数:
A(int i){}
如果我通过 XML bean 配置它,参数的值不会在i
那里硬编码吗?i
或者有没有一种方法可以在每次需要实例化类时传递不同的值?
所有实例在创建后都是相同的。但是如果它们是有状态的,那么经过一些操作之后它们就不会一样了。
当然,如果您的 bean 是无状态的,我认为将其作为原型没有任何优势。
关于您的最后一个问题,使用 SpringEL,您可以例如调用一个每次返回不同值的方法。这样每个实例在创建后都是不同的。
您可以为同一个类声明任意数量的原型:
<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
直接使用 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});