每次的總結,都是一種進步,把本身理解的東西記錄下來不容易,讓別人看懂更不容易。java
第一:基本概念:
安全
一、有狀態就是有數據存儲功能。有狀態對象(Stateful Bean),就是有實例變量的對象,能夠保存數據,是非線程安全的。在不一樣方法調用間不保留任何狀態。
二、無狀態就是一次操做,不能保存數據。無狀態對象(Stateless Bean),就是沒有實例變量的對象.不能保存數據,是不變類,是線程安全的。多線程
第二:看看代加深影響:less
/** * 有狀態bean,有state,user等屬性,而且user有存偖功能,是可變的。 * * @author Peter Wei * */ public class StatefulBean { public int state; // 因爲多線程環境下,user是引用對象,是非線程安全的 public User user; public int getState() { return state; } public void setState(int state) { this.state = state; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } /** * 無狀態bean,不能存偖數據。由於沒有任何屬性,因此是不可變的。只有一系統的方法操做。 * * @author Peter Wei * */ public class StatelessBeanService { // 雖然有billDao屬性,但billDao是沒有狀態信息的,是Stateless Bean. BillDao billDao; public BillDao getBillDao() { return billDao; } public void setBillDao(BillDao billDao) { this.billDao = billDao; } public List<User> findUser(String Id) { return null; } }
第三:Spring中的有狀態(Stateful)和無狀態(Stateless)
1.經過上面的分析,相信你們已經對有狀態和無狀態有了必定的理解。無狀態的Bean適合用不變模式,技術就是單例模式,這樣能夠共享實例,提升性能。有狀態的Bean,多線程環境下不安全,那麼適合用Prototype原型模式。Prototype: 每次對bean的請求都會建立一個新的bean實例。
2.默認狀況下,從Spring bean工廠所取得的實例爲singleton(scope屬性爲singleton),容器只存在一個共享的bean實例。
3.理解了二者的關係,那麼scope選擇的原則就很容易了:有狀態的bean都使用prototype做用域,而對無狀態的bean則應該使用singleton做用域。
4.如Service層、Dao層用默認singleton就行,雖然Service類也有dao這樣的屬性,但dao這些類都是沒有狀態信息的,也就是至關於不變(immutable)類,因此不影響。Struts2中的Action由於會有User、BizEntity這樣的實例對象,是有狀態信息的,在多線程環境下是不安全的,因此Struts2默認的實現是Prototype模式。在Spring中,Struts2的Action中,scope要配成prototype做用域。 性能
第四:Servlet是單例模式
1.Servlet體系結構是創建在Java多線程機制之上的,它的生命週期是由Web 容器負責的。一個Servlet類在Application中只有一個實例存在,也就是有多個線程在使用這個實例。這是單例模式的應用。無狀態的單例是線程安全的,但咱們若是在Servlet裏用了實例變量,那麼就變成有狀態了,是非線程安全的。以下面的用法就是不安全的,由於user,out都是有狀態信息的。
this
Out,Request,Response,Session,Config,Page,PageContext是線程安全的,Application在整個系統內被使用,因此不是線程安全的.spa
第五:SpringMvc默認是單例默認,Struts2默認的實現是Prototype模式。prototype