spring的bean單例和單例設計模式


Spring單例Bean與單例模式的區別在於他們關聯的環境不一樣,單例模式是指在一個jvm進程中僅有一個實例,而Spring單例是指一個Spring Bean容器(ApplicationContext)中僅有一個實例。

單例設計模式,在一個JVM進程中(理論上,一個運行的Java程序,就必定有自己獨立的JVM)僅有一個實例,於是無論在程序的何處獲取實例,始終都返回同一個對象,以Java內置的Runtime為例(現在枚舉是單例模式的最佳實踐),無論何時獲取,下面的判斷始終為真:

//  基於懶漢模式實現
//  在一個JVM實例中始終只有一個實例
Runtime.getRuntime() == Runtime.getRuntime()

與此相比,Spring的單例Bean是與其容器(ApplicationContext)密切相關的,所以在一個JVM進程中,如果有多個Spring容器,即使是單例bean,也一定會創建多個實例,代碼示例如下:

//  第一個Spring Bean容器
ApplicationContext context_1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Person peo1= context_1.getBean("yiifaa", Person.class);
//  第二個Spring Bean容器
ApplicationContext context_2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Person peo2= context_2.getBean("yiifaa", Person.class);
//  這里絕對不會相等,因為創建了多個實例
System.out.println(peo1== peo2);

Spring的配置文件:

<!-- 即使聲明了為單例,只要有多個容器,也一定會創建多個實例 -->
<bean id="yiifaa" class="com.stixu.anno.Person" scope="singleton">
    <constructor-arg name="username">
        <value>yiifaa</value>
    </constructor-arg>
</bean>

總結

Spring的單例bean與Spring bean管理容器密切相關,每個容器都會創建自己獨有的實例,所以與GOF設計模式中的單例模式相差極大,但在實際應用中,如果將對象的生命周期完全交給Spring管理(不在其他地方通過new、反射等方式創建),其實也能達到單例模式的效果

 


免責聲明!

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



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