Spring框架自學之路(三)

在第一篇教程裡(Spring框架自學之路(一))我們學習了框架概述、為MyEclipse配置Spring的約束、IOC(DI) - 控制反轉(依賴注入)的實現原理以及入門案例。

在第二篇教程裡(Spring框架自學之路(二)),講解了IOC獲取對象的方式、別名標籤、Spring創建對象的方式等內容。下面緊接著開始Spring框架第三篇教程的學習。

步驟一:Spring IOC

7.單例和多例

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

Spring默認採用單例方式,減少了對象的創建,從而減少了內存的消耗。但是在實際開發中是存在多例的需求的,Spring也提供了選項可以將bean設置為多例模式。

<code>
<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>
/<beans>/<code>

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

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

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

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

8.懶加載機制

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

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

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

懶加載的配置方式:為指定bean配置懶加載

<code>
<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>
/<beans>/<code>

為全局配置懶加載

<code>
<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>
/<beans>/<code>

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

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

<code>
<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>
/<beans>
public class Cart {
public Cart() {
System.out.println("Cart init...");
}
}
@Test
/**
* SpringIOC 懶加載機制
*/
public void test10(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Cart cart1 = (Cart) context.getBean("cart");
Cart cart2 = (Cart) context.getBean("cart");
System.out.println(cart1 == cart2);
}/<code>

9.配置初始化和銷燬的方法

在Spring中如果某個bean在初始化之後 或 銷燬之前要做一些 額外操作可以為該bean配置初始化和銷燬的方法 ,在這些方法中完成要功能。

實驗:通過斷點調試模式,測試初始化方法 和 銷燬方法的執行

<code>public class ProdDao {
public ProdDao() {
System.out.println("ProdDao 被創建。。。");
}
public void init(){
System.out.println("init。。連接數據庫。。。。。");
}

public void destory(){
System.out.println("destory。。斷開數據庫。。。。。");
}
public void addProd(){
System.out.println("增加商品。。");
}
public void updateProd(){
System.out.println("修改商品。。");
}
public void delProd(){
System.out.println("刪除商品。。");
}
public void queryProd(){
System.out.println("查詢商品。。");
}
}

<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> init-method="init" destroy-method="destory">/<bean>
/<beans>
@Test
/**
* SpringIOC 初始化和 銷燬方法
*/
public void test11(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ProdDao prodDao = (ProdDao) context.getBean("prodDao");
prodDao.addProd();
context.close();
}/<code>

Spring中關鍵方法的執行順序:

在Spring創建bean對象時,先創建對象(通過無參構造或工廠),之後立即調用init方法來執行初始化操作,之後此bean就可以哪來調用其它普通方法,而在對象銷燬之前,spring容器調用其destory方法來執行銷燬操作。

關注公眾號【禿頭程序員】,不錯過Spring框架自學之路(四)


分享到:


相關文章: