这里牵扯到单利模式的线程安全的设计。
我们知道sping ioc注入的bean;一般都是无状态的【dao,service等,这种不会牵涉到值或者状态改变的情况】,也就是在多线程下可以基本保证线程安全的;但是,有些情况下可能是有状态的;有状态的bean ,是要注意线程安全的;spring是有考虑到这方面的需求的;prototype 原型类型,应运而生;
1. 首先说下spring多例模式的两种配置方式: 一个是代码添加注解的,一个是配置xml中bean的范围:
1.1 xml配置:
<bean id="virtualProductService" class="com.san.mpa.service.VirtualProductService" scope="prototype">
1.2 注解配置:
@Scope("prototype")
public class CustInfoList extends HttpServlet {}
2. 为什么要使用prototype,分析一下原因
2.1有状态会话bean :
每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
2.2无状态会话bean :
bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。
使用prototype后可以使并发调用在不同的实例中完成,不会产生线程安全的问题。