4 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
Spring中的單例豆和單例模式有很大不同。Singleton模式表示,每個(gè)類加載器將只創(chuàng)建一個(gè)特定類的一個(gè)實(shí)例。
Spring單例的范圍被描述為“每個(gè)容器每個(gè)bean”。對于每個(gè)Spring IoC容器,單個(gè)對象實(shí)例的bean定義范圍就是這樣。Spring的默認(rèn)范圍是Singleton。
即使默認(rèn)范圍是單例,您也可以通過指定<bean ../>element 的scope屬性來更改bean的范圍。
<bean id=".." class=".." scope="prototype" />

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
Spring中的Singleton范圍表示Spring上下文中的單個(gè)實(shí)例
。Spring容器僅一次又一次返回同一實(shí)例,以供后續(xù)調(diào)用以獲取Bean。
而且,無論bean的類是否被編碼為singleton,spring都不會打擾;實(shí)際上,如果該類被編碼為其構(gòu)造函數(shù)為private的singleton,Spring則使用BeanUtils.instantiateClass(此處為Javadoc )將構(gòu)造函數(shù)設(shè)置為可訪問并調(diào)用它。
或者,我們可以像這樣在bean定義中使用factory-method屬性
<bean id="exampleBean" class="example.Singleton" factory-method="getInstance"/>

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
讓我們以最簡單的示例為例:您有一個(gè)應(yīng)用程序,而僅使用默認(rèn)的類加載器。您有一個(gè)類,無論出于何種原因,您都決定該類在應(yīng)用程序中不應(yīng)有多個(gè)實(shí)例。(考慮一個(gè)由幾個(gè)人共同處理應(yīng)用程序的場景)。
如果您不使用Spring框架,則Singleton模式可確保您的應(yīng)用程序中一個(gè)類的實(shí)例不超過一個(gè)。那是因?yàn)闃?gòu)造函數(shù)是私有的,所以無法通過執(zhí)行“ new”來實(shí)例化類的實(shí)例。獲取該類實(shí)例的唯一方法是調(diào)用該類的某些靜態(tài)方法(通常稱為“ getInstance”),該方法始終返回相同的實(shí)例。
說您在應(yīng)用程序中使用Spring框架,僅意味著除了獲取類實(shí)例的常規(guī)方法(返回類實(shí)例的新方法或靜態(tài)方法)之外,您還可以要求Spring幫助您該類的實(shí)例,Spring會確保即使您未使用Singleton模式編寫該類,只要您向其要求該類的實(shí)例,它將始終返回相同的實(shí)例。換句話說,即使該類具有公共構(gòu)造函數(shù),如果您始終向Spring請求該類的實(shí)例,則Spring在應(yīng)用程序生命周期內(nèi)只會調(diào)用該構(gòu)造函數(shù)一次。
通常,如果使用Spring,則應(yīng)僅使用Spring創(chuàng)建實(shí)例,并且可以為該類提供一個(gè)公共構(gòu)造函數(shù)。但是,如果您的構(gòu)造函數(shù)不是私有的,那么您實(shí)際上并不會通過繞過Spring來阻止任何人直接創(chuàng)建該類的新實(shí)例。
如果您確實(shí)想要該類的單個(gè)實(shí)例,即使您在應(yīng)用程序中使用Spring并將Spring中的類定義為單例,那么確保該類的唯一方法就是也使用Singleton模式實(shí)現(xiàn)該類。這樣可以確保只有一個(gè)實(shí)例,無論人們使用Spring獲取實(shí)例還是繞過Spring。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
在Spring中,Singleton作用域意味著該bean將僅由Spring實(shí)例化一次。與原型范圍(每次都有新實(shí)例)相反,請求范圍(每個(gè)請求一次),會話范圍(每個(gè)HTTP會話一次)。
從技術(shù)上講,單例范圍與單例設(shè)計(jì)模式有關(guān)。您無需將bean實(shí)施為單例即可將它們放入單例范圍。
添加回答
舉報(bào)