Spring中單例多例及懶加載機制

1.單例和多例

Spring容器管理的bean在默認情況下是單例的,也即,一個bean只會創建一個對象,存在內置 map中,之後無論獲取多少次該bean,都返回同一個對象。

Spring默認採用單例方式,減少了對象的創建,從而減少了內存的消耗。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--
        scope:
            singleton - 單例,默認值
                容器創建時創建對象並保存到容器內部
                自後無論獲取多少次,都是從容器內部中獲取該對象返回,所以得到的將是同一個對象
                直到容器被銷燬時,對象被移除出容器
            prototype - 多例
                容器初始化時,不會創建多例對象,只是將多例bean信息保存
                每次獲取多例對象時,都會根據保存的bean信息創建新的對象並返回
                且這些對象不會保存到容器內部的map中
                對象何時被銷燬完全取決於用戶程序本身
    -->
    <bean id="cart" class="cn.ww.domain.Cart" scope="prototype"/>
</beans>

 

但是在實際開發中是存在多例的需求的(如購物車,用戶的訂單等),Spring也提供了選項可以將bean設置爲多例模式。

bean在單例模式下的生命週期:

bean在單例模式下,spring容器啓動時解析xml發現該bean標籤後,直接創建該bean的對象存入內部map中保存,此後無論調用多少次getBean()獲取該bean都是從map中獲取該對象返回,一直是一個對象。此對象一直被Spring容器持有,直到容器退出時,隨着容器的退出對象被銷燬。

bean在多例模式下的生命週期:

bean在多例模式下,spring容器啓動時解析xml發現該bean標籤後,只是將該bean進行管理,並不會創建對象,此後每次使用 getBean()獲取該bean時,spring都會重新創建該對象返回,每次都是一個新的對象這個對象spring容器並不會持有,什麼銷燬取決於使用該對象的用戶自己什麼時候銷燬該對象。

注:通過斷點調試模式 ,可以觀察spring單例和多例的bean執行構造的過程

scope="singleton" 時,調試結果如下,容器創建時就創建了對象

                

               當 scope="prototype" 時,調試結果如下,獲取bean時對象才創建

                

2. 懶加載機制

Spring默認會在容器初始化的過程中,解析xml,並將單例的bean創建並保存到map中,這樣的機制在bean比較少時問題不大,但一旦bean非常多時,spring需要在啓動的過程中花費大量的時間來創建bean 花費大量的空間存儲bean,導致程序啓動越來越慢,佔用內存越來越大,但這些bean可能很久都用不上,這種在啓動時在時間和空間上的浪費顯得非常的不值得。

所以Spring提供了懶加載機制。所謂的懶加載機制就是可以規定指定的bean不在啓動時立即創建,而是在後續第一次用到時才創建,從而減輕在啓動過程中對時間和內存的消耗。

懶加載機制只對單例bean有作用,對於多例bean設置懶加載沒有意義

懶加載只是延後了對象創建的時機,對象仍然是單例的。

懶加載的配置方式:

爲指定bean配置懶加載

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"

        >

        

        <bean id="cart" class="cn.tedu.beans.Cart" lazy-init="true"></bean>

        

</beans>

爲全局配置懶加載(當需要設置的懶加載的bean過多時,不用一個個的去設置可以設置default-lazy-init="true",不設置默認爲false)

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"

        default-lazy-init="true"

        >

        

        <bean id="cart" class="cn.tedu.beans.Cart"></bean>

        

</beans>

**如果同時設定全局和指定bean的懶加載機制,且配置不相同,則對於該bean局部配置覆蓋全局配置。

 注:通過斷點調試,可以驗證懶加載機制的執行過程

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章