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:綜合以上兩種範圍都會檢查。
沒有留言:
張貼留言