Code Bye

关于spring的scope="prototype"问题

<bean id=”product” class=”sys.pojo.Product” scope=”prototype”/>
<bean id=”cart” class=”sys.pojo.Cart” scope=”prototype”>
<property name=”product” ref=”product”/>
</bean>
<bean id=”productService” class=”sys.service.ProductService”>
<property name=”productDao” ref=”productDao”/>
<property name=”cart” ref=”cart”/>
</bean>
在Cart类中添加了product的setter和getter
在ProductService类中也添加了cart的setter和getter
在ProductService类的一个方法里使用cart,并设置属性,但是当再次调用这个方法的时候,原先设置的属性就被覆盖了,但是设置了scope=”prototype”,怎么还说单例?
解决方案

10

一般,JavaBean都不用交给spring管理吧,要用的时候直接new就行了,原因是它封装了业务数据。

10

这个可能是线程安全性的问题,在service方法中,不要把entity设为属性,原因是一般service都是单例,当多个并发调用的时候,就是存在覆盖属性值的问题。这是线程安全性的问题。
原因是你的service是单例的,每次调用的时候,你的cart就被覆盖了,虽然cart是prototype的,但是setter方法是在创建实例的时候,容器调用一次,所以你的service每次被调用,cart不会每次被创建一个新的实例。
不知道说清楚没有。
建议是entity不要设置为属性,每次用的时候最好是new一个。setter方法在容器初始化的时候只被调用一次。除非你在代码中context.getBean(),这样才会原型的每次都创建一个新的对象。

10

假如你非要用spring管理entity,那么就在需要的时候用context.getBean(),每次重新获得一个,这样容器才会每次给你创建一个新的对象。setter方法在容器初始化的时候只调用一次,你的service的属性cart其实一直都是一个。

10

或你的service也设置成prototype的,每次调用的时候,容器会创建一个新的service,这样它的属性才不会冲突,struts2的action就是这样做的,原因是它的属性封装了表单数据,所以每次调用是创建了一个新的action,这个是线程安全的东西。假如不是很理解,可以参考一下struts2的action的线程安全,网上搜一下理解一下就好了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于spring的scope="prototype"问题