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(){
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
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例項被正常銷燬。
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例項被正常銷燬。