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的作用域 還爲我們提供了 另外三種分別爲:
- prototype
原型模式 每次創建的都是新的實例對象。 - request
主要用於三層架構中的表現層使用 相當於 調用 request.setAttribute(“bean”,Bean); - 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垃圾回收進行進行銷燬的。