Spring Bean生命周期


1.spring Bean生命周期

Bean的作用域可以通過Bean標簽的scope屬性進行設置,Bean的作用域包括:
默認情況下scope="singleton",那么該Bean是單例,任何人獲取該Bean實例的都為同一個實例;
scope="prototype",任何一個實例都是新的實例;
scope="request",在WEB應用程序中,每一個實例的作用域都為request范圍;
scope="session",在WEB應用程序中,每一個實例的作用域都為session范圍;

  一個典型的Bean配置是這樣的:<bean id="user" class="..." scope="singleton"/>,其中的scope表明這個bean是不是單例,默認為單例。

2.Bean可以通過指定屬性init-method指定初始化后執行的方法,以及通過指定屬性destroy-method銷毀時執行的方法。

  語法:<bean ....   destroy-method="銷毀時調用的方法名" init-method="初始化后執行的方法名"/>

3.惡漢模式和懶漢模式

同jvm的單例模式一樣,spring容器的單例模式同樣分為這兩種。默認情況下spring singleton為惡漢模式。

惡漢模式:啟動Spring容器時(即實例化容器時),為所有的Spring配置文件中定義的bean都生成一個實例;

懶漢模式:在第一個請求是才生成一個實例,以后的請求都是調用這個實例,可以通過顯示的聲明將其設置為懶漢模式,如下:

<beans default-lazy-init="true">

4.Spring單例Bean和單例模式的區別

Spring單例Bean和單例模式的最大區別在於他們關聯的環境不同,單例模式是指在一個JVM進程中僅有一個實例,二Spring單例是指一個Spring Bean容器(ApplicationContext)中僅有一個實例。

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

// 基於懶漢模式實現

// 在一個JVM實例中始終只有一個實例

Runtime.getRuntime() == Runtime.getRuntime()

與此相比,Spring的單例Bean是預期容器(ApplicationContext)模切相關的,所以在一個JVM進程中,所以在一個JVM進程中,如果有多個Spring容器,及時是到哪里bean,一定會創建多個實例,代碼示例如下:

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

  下面使其對應的配置文件:

<!-- 即使聲明了為單例,只要有多個容器,也一定會創建多個實例 -->
<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