2013年4月21日 星期日

Spring Framework 基礎學習筆記(二)

Spring Core主要是實現反向控制(IoC)與相依植入(DI)的精神,這篇主要針對Spring Core的特性和用法,延續Spring Framework 基礎學習筆記(一),做一些較為詳細紀錄和重點整理。



ApplicationContext


BeanFactory負責讀取Bean定義檔,管理物件的載入、生成,物件之間的關係維護,負責Bean的生命週期,對於簡單的應用程式來說,使用 BeanFactory就已經足夠,但是若要利用到Spring在框架上的一些功能以及進階的容器功能,則可以使用 ApplicationContext,BeanFactory則通常用於一些資源有限的裝置,像是行動設備等。

因為ApplicationContext繼承至BeanFactory,所以這裡介紹ApplicationContext使用方式
下面程式片斷,建立的一個ApplicationContext,new一個 ClassPathXmlApplicationContext,取得Class path下的xml的設定檔,也可同時取得多的設定檔,在String陣列新增新的路徑即可,如:new String[] {"AppContext.xml","aaa.xml","bbb.xml" }


ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"AppContext.xml" });
IStockService stockService=(StockService) context.getBean("stockService");

實作ApplicationContext的類別中,較常使用的大概是以下三種
FileSystemXmlApplicationContext:
                     -可指定XML定義檔的相對路徑或絕對路徑來讀取定義檔。
ClassPathXmlApplicationContext:
                     -從Classpath中來讀取XML定義檔。
XmlWebApplicationContext:
                     -在Web應用程式中的檔案架構中讀取定義檔。


設定JavaBean

<beans> </beans> beans根節點
<bean><bean>      bean節點,定義bean
<property></property>    定義bean的屬性


<bean id="threshold" class="com.core.beans.Threshold">
       <property name="upperTh">
           <value>100</value>
       </property>
       <property name="lowerTh">
           <value>10</value>
       </property>
</bean>



設定物件屬性

Spring中的物件可以互相參考,參考時用 <ref >的標籤配合Bean id 使用,如下面範例所示:

<bean id="processor" class="com.processor">
<property name="
dataObj" >
<ref bean="
deviceData"/><!--設定 bean id--> </property>
</bean>



設定List屬性

List屬性中可以設定任意物件。如果為Java物件則用<ref/>指定,或使用<bean>重新定義實例。

<property name="lists">
          <list>
              <value>
10</value>
<ref bean="
magzine" />
<bean class="
com.book">
<property name="
author" value="dennis" />
<property name="
title" value="spring" />
</bean>
</list>
</property>



設定Set屬性

Set屬性中可以設定任意物件。如果為Java物件則用<ref/>指定,或使用<bean>重新定義實例。

<property name="sets">
<set>
<value>
10</value>
<ref bean="
magzine" />
<bean class="
com.book">
<property name="
author" value="dennis" />
<property name="
title" value="spring" />
</bean>
</set>
</property>


設定Map屬性


<entry>設定Map的元素,key指定索引,value指定值,如果為Java物件則用value-ref指定。

<property name="maps">
<map>
<entry key="Key 1" value="
1" />
<entry key="Key 2" value-ref="
magzine" />
<entry key="Key 3">
<bean class="
com.book">
       <property name="
author" value="dennis" />
       <property name="
title" value="spring" />
</bean>
</entry>
</map>
</property>



設定Properties屬性


<props> <prop>標籤,

<property name="pros">
<props>
<prop key="userName">
dennis</prop>
<prop key="password">
0000</prop>
</props>
</property>



工廠模式


如果一個bean不能透過new 產生實體,而是透過工廠類別的某個方法建立的,則需要把<bean>的class屬性設為工廠的類別,或是將factory-bean屬性設定為工廠物件。

簡易範例:
<bean id = "helloword" class="main.helloFactoryBean"  factory-method="createInstance" />


<bean  id = "helloword2"  factory-bean="helloFactoryBean"    factory-method="createInstance" >


建構函數


Java Bean的建構子帶有參數,須指定建構子的參數。<constructor-arg />指定建構子參數的值或Bean,如有多個參數時,則用多個即可。

下面範例為,建構一個String的物件

<bean
       id="AppName"
       class="java.lang.String" >


       <constructor-arg value="myApp" />
   </bean>



<bean
       id="exApp"
       class="com.exApp" >


       <constructor-arg><value>10</value>  </constructor-arg>
       <constructor-arg><ref bean="refApp"/> </constructor-arg>
   </bean>




單例模式


Bean可以定義是否為單例模式,Spring預設為單例模式,所以要使用非單例模式,也就是prototype模式,需把singleton設為false。
<bean
       id="exApp"
       class="com.exApp"
       singleton="false">


設定destroy-method消毀方法

有些物件使用完畢後,需要呼叫銷毀方法close()來釋放資源,可以使用destroy-method設定要銷毀的方法,Spring登出這些資源時,會呼叫destroy-method設定的方法。

<bean id="dataContent"
          class="com.data.DataContent"
          destroy-method="close">
.......
.......
</bean>

設定出始化方法 init-method

某方物件在建立實例後,需要執行出始化方法,但這些出始化方法不能寫在建構子裡,此時可以使用init-method,讓Spring在建立實例後,再呼叫init-mrthod中設定的方法。

<bean id=example
          class="com.Example"
          init-method="init">
.......
.......
</bean>

相當於:
Example example=new Example ();
example.init();

屬性自動配裝autowire

如果每個bean都使用ref來設定,如果一個較大的設定檔,那麼設定起來將會相當的費時,使用autowire後,不需設定Bean的屬性和相依關係,Spring會根據反射,自動選擇符合條件的屬性,設定到該Bean的屬性上,配裝的規則分為:byType、byName、constructor、autodetector。差別如下:




byType:根據Bean的屬性自動綁定。
byName:根據Bean的ID自動綁定。
constructor:在建立綁定關係時,Spring會試圖比對容器中的Bean及相關的建構方法,在型態上是否有符合,如果符合,則用建構方法來建立Bean實例,如果無法完成綁定,則會丟出例外。
autodetect:先使用constructor,如果不符合,則再使用byType。

<bean id=example
          class="com.Example"
          autowire="byType">
</bean>

相依檢查dependency

有些時候如果某些Bean的設定錯誤,如某個Bean的屬性沒有設定,這種錯誤在程式啟動時不會被發現,而是執行到Spring呼叫到該Bean值才會發現錯誤,為了防止這種錯誤,Spring提供相依檢查的的機制,在程式啟動時就會去檢查Bean的相依性,設定方法如下:

<bean id=example
          class="com.Example"
          dependency-check="all">
</bean>

屬定值的選取範圍

simple:僅檢查基本類型、集合屬性。
object:僅檢查java物件屬性。
all:綜合以上兩種範圍都會檢查。

沒有留言:

張貼留言