bean的作用域、初始化和銷燬方法及生命週期

堅持每天寫博文,積累下開發中的點點滴滴

  • bean的作用域: bean對象可以存活多久的.
<bean id="" class="" scope="作用域"/>

singleton: 單例 ,在Spring IoC容器中僅存在一個Bean實例 (默認的scope)
prototype: 多例 ,每次從容器中調用Bean時,都返回一個新的實例,
request: 用於web開發,將Bean放入request範圍 ,request.setAttribute(“xxx”) , 在同一個request 獲得同一個Bean
session: 用於web開發,將Bean 放入Session範圍,在同一個Session 獲得同一個Bean
globalSession: 一般用於Porlet應用環境 , 分佈式系統存在全局session概念(單點登錄),如果不是porlet環境,globalSession 等同於Session
在開發中主要使用 scope=”singleton”、 scope=”prototype”.
對於MVC中的Action使用prototype類型,其他使用singleton


初始化和銷燬方法:
比如DataSource,SessionFactory最終都需要關閉資源:在Bean銷燬之前,都要調用close方法.

<bean id="someBean" class="......" 
        init-method="該類中初始化方法名" destroy-method="該類中銷燬方法名">
</bean>

init-method:bean生命週期初始化方法,對象創建後就進行調用
destroy-method:容器被銷燬的時候,如果bean被容器管理,會調用該方法。

如果bean的scope=”prototype”,那麼容器只負責創建和初始化,它並不會被spring容器管理銷燬。

  • 不使用Spring測試:演示Spring容器非正常關閉:

單元測試的線程很短.(獲取網絡信息,不要使用單元測試,使用主方法)

如何正常的關閉Spring容器:
AbstractApplicationContext:

@Test
    public void testLifeCycle2() throws Exception {
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(
                "cn/itcast/cd/day1/lifecycle/LifeCycleTest-context.xml");
        SomeBean bean = ctx.getBean("someBean", SomeBean.class);
        System.out.println(bean);
        //關閉上下文對象
        //ctx.close();
        //最好的方式:把Spring線程作爲JVM的子線程:Spring沒有運行完,JVM就不會終止.
        ctx.registerShutdownHook();
    }

這裏寫圖片描述

GC:垃圾回收

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