Spring的bean初始化

1.實例化bean的三種方法:
(1) 構造器web

<!-- 體驗1 -->spring

<bean id="personService" class="com.persia.PersonServiceBean">session

<!-- index 表明方法的參數序號,由0開始,基本的類型Type能夠不聲明-->
<constructor-arg index="0" value="構造注入的name" />
<constructor-arg index="1" type="com.persia.IDaoBean" ref="personDao"/>
</bean>app

對應類
public PersonServiceBean(String name, IDaoBean personDao) {
this.name = name;
this.personDao = personDao;
}工具

<!-- 體現2-->post

<bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean" />
<bean id="personServiceBean" class="cn.itcast.service.impl.PersonServiceBean"
 lazy-init="true" init-method="init" destroy-method="destory">this

 <!-- ref屬性對應id personDao值  name屬性對應接口的getter方法名稱-->prototype

 <property name="personDao" ref="personDao" />xml

<!-- 體驗3 -->對象

<!-- 注入屬性值 -->
 <property name="name" value="123"/>

 <!-- Set的注入 -->

 <property name="sets">
  <set>
   <value>sets:第一個值</value>
   <value>sets:第二個值</value>
   <value>sets:第三個值</value>
  </set>
 </property>

 <!-- List的注入 -->

 <property name="lists">
  <list>
   <value>lists:第一個值</value>
   <value>lists:第二個值</value>
   <value>lists:第三個值</value>
  </list>
 </property>

 <!-- Properties的注入 -->

 <property name="properties">
  <props>
   <prop key="props-key1">:第一個值</prop>
   <prop key="props-key2">:第二個值</prop>
   <prop key="props-key3">:第三個值</prop>
  </props>
 </property>

 <!-- Map的注入 -->

 <property name="maps">
  <map>
   <entry key="maps-key1" value=":第一個值" />
   <entry key="maps-key2" value=":第二個值" />
   <entry key="maps-key3" value=":第三個值" />
  </map>
 </property>

</bean>
(2) 靜態工廠:

<!-- 靜態工廠獲取bean -->

<bean id="personService2" class="com.persia.PersonServiceBeanFactory" factory-method="createInstance"/>
對應類
public static PersonServiceBean createInstance(){
return new PersonServiceBean();
}
(3) 實例工廠:

沒有靜態方法,所以配置時,先實例化工廠,在實例化須要的bean。

<!-- 實例工廠獲取bean,先實例化工廠再實例化bean-->

<bean id="fac" class="com.persia.PersonServiceBeanInsFactory"/>
<bean id="personService3" factory-bean="fac" factory-method="createInstance"/>

對應類
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進行實例化的。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實例被正常銷燬。

相關文章
相關標籤/搜索