衆所周知,spring管理對象通常都是單例的,故bean的scope屬性也默認singleton,可是它還有一個值是prototype,以前查過資料,網上說「有狀態的bean都使用Prototype做用域,而對無狀態的bean則應該使用singleton做用域」,對於這句話至今不理解什麼是有無狀態。spring
以前接觸的springmvc的項目(默認使用單例,本身也沒在乎),從後臺傳遞數據到前臺頁面,直接放到request或者model中就能夠了,可是,最近看到struts的傳值方式,須要在action中定義成員變量去接收參數(Action接收參數的3種方式(屬性,域模型,模型驅動)),若是使用單例模式,數據共享,那麼就存在數據安全問題,因此須要使用scope=「prototype」,爲每個線程提供一個實例。安全
小結下:多線程
一、singleton模式指的是對某個對象的徹底共享,包括代碼空間和數據空間,而prototype則每次請求都建立一個新的對象,成員變量不共享,保證線程安全。mvc
二、 springmvc基於方法開發的(經過形參接收參數),struts2基於類開發[struts2是基於原型對應的,每一次請求,實例化一個對象]的(經過成員變量接收參數)。url
springmvc將url和controller方法映射。映射成功後springmvc生成一個Handler對象,對象中只包括 了一個method。由於是方法的形參 方法執行結束,形參數據銷燬。spa
三、所以springmvc能夠進行單例開發,而且建議使用單例開發,struts2經過類的成員變量接收參數,多線程訪問共享成員變量,沒法使用單例,只能使用多例。.net