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局部配置覆蓋全局配置。
注:通過斷點調試,可以驗證懶加載機制的執行過程