4 回答

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

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

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

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