Spring Bean的作用域和生命週期

Spring Bean的作用域

我們知道Spring中的對象是通過Bean的的方式來進行管理的,Bean的作用域默認是單利的(singleton)
xml 中的配置如下:

<bean id="bean" class="cn.zhuoqianmingyue.ioc.scope.Bean" scope="singleton"></bean>

進行測試:
我們獲取3次Bean類的實例對象,通過打印對象的哈希值來進行判斷。
測試代碼如下:

public class ScopeTest {
	@Test
	public void singleton() {
		ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-scope.xml");
		Bean user = (Bean)appliction.getBean("bean");
		Bean user2 = (Bean)appliction.getBean("bean");
		Bean user3 = (Bean)appliction.getBean("bean");
		System.out.println(user.toString());
		System.out.println(user2.toString());
		System.out.println(user3.toString());
	}
}

測試結果:
在這裏插入圖片描述

通過上面代碼測試我們證實了Spring 配置 scope=“singleton” 創建實例對象默認是單例的。

在實際開發中可能我們需要實例對象不想設置成單利的 ,Spring的作用域 還爲我們提供了 另外三種分別爲:

  1. prototype
    原型模式 每次創建的都是新的實例對象。
  2. request
    主要用於三層架構中的表現層使用 相當於 調用 request.setAttribute(“bean”,Bean);
  3. session
    主要用於三層架構中的表現層使用 相當於 調用 request.getSession().setAttribute(“bean”,Bean);

Spring Bean的生命週期

我們拿人來舉例,生命週期就是 一個嬰兒從誕生到變老死亡的的過程。在Spring中由於Bean的實例化都是Spring框架來完成的,這個過程我們是無法進行干預的。但是Spring爲我們提供了2個回調方法 init-method 和destory-method。

接下來我們進行回調方法配置來觀察Spring的聲明週期執行過程:
首先創建名稱爲Bean類,創建init 和destroy方法代碼如下:

package cn.zhuoqianmingyue.ioc.scope;

public class Bean {
	
	public void init() {
		System.out.println("init......");
	}
	public void destroy() {
		System.out.println("destroy......");
	}
	
}

將Bean類配置到Spring配置文件中,並通過init-method 和destroy-method指定初始化和銷燬調用的方法。

<bean id="bean" class="cn.zhuoqianmingyue.ioc.scope.Bean" init-method="init" destroy-method="destroy"></bean>

進行測試:
首先我們測試初始化的操作,通過實例化Spring容器看看 init方法是否被調用。
測試代碼如下:

public class LifecycleTest {
	@Test
	public void beanLifecycleInit() {
		ApplicationContext application = new ClassPathXmlApplicationContext("ioc-lifecycle.xml");
	}
}

測試結果:
在這裏插入圖片描述
由於ApplicationContext 沒有提供容器關閉的操作,我們通過ClassPathXmlApplicationContext 來完成我們的容器關閉操作
測試代碼如下:

	@Test
	public void beanLifecycleInitAndDestroy() {
		ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("ioc-lifecycle.xml");
		Bean bean = (Bean)application.getBean("bean");
		application.close();
	}

測試結果:
在這裏插入圖片描述
Spring的Bean是在我們的容器初始化時進行創建,當我們的容器關閉或者銷燬時Bean會進行銷燬。

需要注意的是Bean的銷燬只能操作作用域是單利的Bean,對於非單利的Bean Spring只是負責創建,而銷燬的操作和我們普通new 出來的實例對象一樣通過JVM垃圾回收進行進行銷燬的。

查看源碼
下載源碼

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