1. 程式人生 > >Sping 中 singleton(單例)和 prototype(多例) 的理解

Sping 中 singleton(單例)和 prototype(多例) 的理解

Singleton:

當一個 bean 的作用域為 singleton(單例)時,IOC 容器中只會存在一個共享的 bean 例項,且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。也就是說,這個單一例項被儲存到單例快取中,以後所有針對該 bean 的後續請求和引用都返回這個快取的物件例項,IOC 容器中只存在一個該 bean。

Prototype:

每一次請求都會產生一個新的 bean 例項(相當於每個使用者所產生的 bean 例項都不同)。 對於 prototype 任何配置好的析構生命週期回撥方法都不會被呼叫,清除 prototype 作用域的物件釋放資源是客戶端程式碼的職責。 (可以使用 bean 的後置處理器,該處理器持有要被清除的 bean 的引用)

總結:

對有狀態的 bean 要使用 prototype 作用域 對無狀態的 bean 使用 singleton 作用域

有狀態的 bean :

每個使用者有自己特有的一個例項,一旦使用者呼叫結束或例項結束,bean 的生命期亦結束。

無狀態的 bean :

被所有使用者所共享,及時使用者呼叫結束或例項結束,bean 的生命期也不一定會停止。所有的變數受到所有呼叫它的使用者的影響(類似於靜態宣告)。

另:在 Spring boot 中,可以新增 @Scope(“prototype”) 改變為多例(預設為單例)