回覆列表
  • 1 # 藍風24

    1.例項化bean的三種方法:

    (1) 構造器

    對應類

    public PersonServiceBean(String name, IDaoBean personDao) {

    this.name = name;

    this.personDao = personDao;

    }

    (2) 靜態工廠:

    對應類

    public static PersonServiceBean createInstance(){

    return new PersonServiceBean();

    }

    (3) 例項工廠:

    沒有靜態方法,因此配置時,先例項化工廠,在例項化需要的bean。

    對應類

    public PersonServiceBean createInstance(){

    return new PersonServiceBean();

    }

    2. bean的作用域

    預設情況為單例方式:scope=”singleton”

    singleton

    單例項作用域,這是Spring容器預設的作用域,使用singleton作用域生成的是單例項,在整個Bean容器中僅保留一個例項物件供所有呼叫者共享引用。單例模式對於那些無會話狀態的Bean(如輔助工具類、DAO元件、業務邏輯元件等)是最理想的選擇。

    prototype

    原型模式,這是多例項作用域,針對每次不同的請求,Bean容器均會生成一個全新的Bean例項以供呼叫者使用。prototype作用域非常適用於那些需要保持會話狀態的Bean例項,有一點值得注意的就是,Spring不能對一個prototype

    Bean的整個生命週期負責,容器在初始化、裝配好一個prototype例項後,將它交給客戶端,隨後就對該prototype例項不聞不問了。因此,客戶端要負責prototype例項的生命週期管理。

    request

    針對每次HTTP請求,Spring容器會根據Bean的定義建立一個全新的Bean例項,

    且該Bean例項僅在當前HTTP request內有效,因此可以根據需要放心地更改所建例項的內部狀態,

    而其他請求中根據Bean定義建立的例項,將不會看到這些特定於某個請求的狀態變化。

    當處理請求結束,request作用域的Bean例項將被銷燬。該作用域僅在基於web的Spring

    ApplicationContext情形下有效。

    session

    針對某個HTTP

    Session,Spring容器會根據Bean定義建立一個全新的Bean例項,且該Bean例項僅在當前HTTP Session內有效。

    與request作用域一樣,我們可以根據需要放心地更改所建立例項的內部狀態,而別的HTTP Session中根據Bean定義建立的例項,

    將不會看到這些特定於某個HTTP Session的狀態變化。 當HTTP Session最終被廢棄的時候,在該HTTP

    Session作用域內的Bean例項也會被廢棄掉。該作用域僅在基於Web的Spring ApplicationContext情形下有效。

    global session

    global

    session作用域類似於標準的HTTP

    Session作用域,不過它僅僅在基於portlet的Web應用中才有意義。portlet規範定義了全域性Session的概念,它被所有構成某個portlet

    Web應用的各種不同的portlet所共享。在global session作用域中定義的Bean被限定於全域性portlet

    Session的生命週期範圍內。如果我們是在編寫一個標準的基於Servlet的Web應用,並且定義了一個或多個具有global

    session作用域的Bean,系統會使用標準的HTTP Session作用域,並且不會引起任何錯誤。該作用域僅在基於Web的Spring

    ApplicationContext情形下有效。

    3. bean的生命週期

    (1)什麼時候例項化?

    對於單例的形式,在容器例項化的時候對bean進行例項化的。http://www.cdtarena.com

    ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});

    單例項可以透過lazy-init=”true”,在getBean時進行例項化。

    在beans裡面default-lazy-init=”true”對所有bean進行延遲處理。

    對於prototype,則是在getBean的時候被例項化的。

    (2)在bean被例項化之後執行資源操作等方法:

    Init-method=””

    (3)在bean銷燬之前執行的方法:

    Destroy-method=””

    什麼時候被銷燬?隨著spring容器被關閉時被銷燬。

    呼叫spring容器的close方法來正常關閉。以前是隨著應用程式執行完而關閉。

    在Spring裝載配置檔案後,Spring工廠例項化完成,開始處理

    (1)使用預設構造方法或指定構造引數進行Bean例項化。

    (2)根據property標籤的配置呼叫Bean例項中的相關set方法完成屬性的賦值。

    (3)如果Bean實現了BeanNameAware介面,則呼叫setBeanName()方法傳入當前Bean的ID。

    (4)如果Bean實現了BeanFactoryAware介面,則呼叫setBeanFactory()方法傳入當前工廠例項的引用。

    (5)如果Bean實現了ApplicationContextAware介面,則呼叫setApplicationContext()方法傳入當前ApplicationContext例項的引用。

    (6)如果有BeanPostProcessor與當前Bean關聯,則與之關聯的物件的postProcess- BeforeInitialzation()方法將被呼叫。

    (7)如果在配置檔案中配置Bean時設定了init-method屬性,則呼叫該屬性指定的初始化方法。

    (8)如果有BeanPostProcessor與當前Bean關聯,則與之關聯的物件的postProcess- AfterInitialzation()方法將被呼叫。

    (9)Bean例項化完成,處於待用狀態,可以被正常使用了。

    (10)當Spring容器關閉時,如果Bean實現了DisposableBean介面,則destroy()方法將被呼叫。

    (11)如果在配置檔案中配置Bean時設定了destroy-method屬性,則呼叫該屬性指定的方法進行銷燬前的一些處理。

    (12)Bean例項被正常銷燬。

  • 中秋節和大豐收的關聯?
  • 上聯:生死看淡,不服就幹,如何對下聯?