spring自動注入是單例還是多例?單例如何注入多例?


   單例和多例的區別 :
 
單例多例需要搞明白這些問題:
     1. 什么是單例多例;
     2. 如何產生單例多例;
     3. 為什么要用單例多例
     4. 什么時候用單例,什么時候用多例;
 
1. 什么是單例、多例:
     所謂單例就是所有的請求都用一個對象來處理,比如我們常用的service和dao層的對象通常都是單例的,而多例則指每個請求用一個新的對象來處理,比如action;
 
     單例模式和多例模式說明:
     1. 單例模式和多例模式屬於對象模式。
     2. 單例模式的對象在整個系統中只有一份,多例模式可以有多個實例。
     3. 它們都不對外提供構造方法,即構造方法都為私有。
 
2. 如何產生單例、多例:
    在通用的SSH中,單例在spring中是默認的,如果要產生多例,則在配置文件的bean中添加scope="prototype";
 
3. 為什么用單例、多例:
    之所以用單例,是因為沒必要每個請求都新建一個對象,這樣子既浪費CPU又浪費內存;
   之所以用多例,是為了防止並發問題;即一個請求改變了對象的狀態,此時對象又處理另一個請求,而之前請求對對象狀態的改變導致了對象對另一個請求做了錯誤的處理;
    用單例和多例的標准只有一個:
    當對象含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;
 
4. 何時用單例?何時用多例?
    對於struts2來說,action必須用多例,因為action本身含有請求參數的值,即可改變的狀態;
    而對於STRUTS1來說,action則可用單例,因為請求參數的值是放在actionForm中,而非action中的;
    另外要說一下,並不是說service或dao一定是單例,標准同第3點所講的,就曾見過有的service中也包含了可改變的狀態,同時執行方法也依賴該狀態,但一樣用的單例,這樣就會出現隱藏的BUG,而並發的BUG通常很難重現和查找;
 
       spring生成對象默認是單例的。通過scope屬性可以更改為多例
 
<bean id="user" class="modle.User" scope="prototype">  </bean>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM