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實例被正常銷燬。