作者:
lyn_gemini 文章來(lái)源:本站原創(chuàng ) 點(diǎn)擊數: 2361 更新時(shí)間:2006-10-14 19:03:52
原帖及討論:
http://bbs.bc-cn.net/dispbbs.asp?BoardID=12&ID=83040在spring容器內拼湊bean叫作裝配。裝配bean的時(shí)候,你是在告訴容器,需要哪些bean,以及容器如何使用依賴(lài)注入將它們配合在一起。
理論上,bean裝配可以從任何資源獲得,包括
屬性文件,關(guān)系
數據庫等,但xml是最常見(jiàn)的spring 應用系統配置源。Spring中的幾種容器都支持使用
XML裝配bean,包括:
XMLBeanFactory ,
ClassPath
XMLApplicationContext ,
FileSystem
XMLApplicationContext ,
XMLWebApplicationContext
基本的
XML配置包括如下幾個(gè)方面:
1.添加一個(gè)bean
2.設置bean的
屬性2.1 手動(dòng)設置
2.1.1 通過(guò)Setter方法
2.1.2 通過(guò)構造器
2.2 自動(dòng)設置
其中bean的屬性即為bean里的成員變量,這些成員變量值的獲得可以通過(guò)setter方法,例如某個(gè)
屬性為name,則setter方法為setName(String name);或者通過(guò)構造器在類(lèi)被實(shí)例化時(shí)初始化。Setter方法(例如setName方法)或者構造器的調用都可以通過(guò)在
XML文件里進(jìn)行配置,從而實(shí)現讓spring容器來(lái)自動(dòng)進(jìn)行。
1.添加一個(gè)bean
以下是一個(gè)例子:
<bean
id = “mybean”
Class = “blog.spring.MyBean”
Singleton = “false”
init-method = “initMethod”
destroy-method = “destroyMethod”
autowire = “autowire type”
/>
下面是對該標簽里各個(gè)
屬性的解釋?zhuān)?div style="height:15px;">
Id : 標識該bean的名稱(chēng),通過(guò)factory.getBean(“id”)來(lái)獲得實(shí)例。
Class : 該bean的類(lèi)路徑。
Singleton : 默認為true,即單實(shí)例模式,每次getBean(“id”)時(shí)獲取的都是同
一個(gè)實(shí)例,如果設置為false,即原型模式,則每次獲取的是新創(chuàng )建
的實(shí)例。
Init-method : 在bean實(shí)例化后要調用的方法(bean里定義好的方法)。
Destroy-method : bean從容器里刪除之前要調用的方法。
Autowire : 其屬性要通過(guò)何種方法進(jìn)行
屬性的自動(dòng)裝配。
對于上述的各個(gè)
屬性,id和class是必要的,其他的則可以省略。例如如果設置了autowire的值,則表明需要自動(dòng)裝配,否則是手動(dòng)裝配。
2.通過(guò)Setter方法手動(dòng)設置bean里的
屬性Bean里的
屬性通過(guò)<property>標簽來(lái)標識。有以下幾種情況:
● 簡(jiǎn)單類(lèi)型
屬性<bean id = “mybean” class = “blog.spring.MyBean”>
<property name = “name”>
<value>springTest</value>
</property>
</bean>
● 引用其他bean
<bean id = “mybean” class = “blog.spring.MyBean” />
<bean id = “mybean1” class = “blog.spring.MyBean1”>
<property name = “name”>
<ref bean = “mybean” />
</property>
</bean>
也可以將<ref>改為
<bean class = “..”>
這樣叫做內部bean,缺點(diǎn)是無(wú)法在其他地方重用這個(gè)bean的實(shí)例。
● 裝配集合
共有以下幾種集合的裝配:
****裝配List和數組****
<property name = ”nameList”>
<list>
<value>something</value>
<ref bean = “blog.spring.MyBean” />
<value>otherThing</value>
</list>
</property>
****裝配Set****
<property name = ”nameList”>
<set>
<value>something</value>
<ref bean = “blog.spring.MyBean” />
<value>otherThing</value>
</set>
</property>
****裝配Map****
<property name = ”nameList”>
<map>
<entry key = “key1”>
<value>value1</value>
</entry>
<entry key = “key2”>
<ref bean = “mybean” />
</entry>
</map>
</property>
****裝配Properties****
<property name = ”nameList”>
<props>
<prop key = “prop1”>value1</prop>
<prop key = “prop2”>value2</prop>
</props>
</property>
● 設置null
要將一個(gè)屬性null,需要通過(guò)<null />標簽,如果不設置,則
屬性為默認值(在實(shí)例化時(shí))而不是null。
<property name=”name”> <null /> </property>
3.通過(guò)構造器手動(dòng)設置bean里的
屬性假設有如下一個(gè)bean:
Public class MyBean {
Public MyBean( String arg1, MyBean1 arg2, String arg3 )
}
則可以在
XML里這樣配置該bean:
<bean id = “mybean” class = “blog.spring.MyBean”>
<constructor-arg index = “1”>
<value>springTest</value>
<constructor-arg>
<constructor-arg index = “0”>
<ref bean = “mybean1” />
<constructor-arg>
</bean>
其中的index是用來(lái)標識該參數在構造
函數里的位置的,并從0開(kāi)始。
4.讓spring完成自動(dòng)裝配
例如:
<bean
id = “mybean”
class = “blog.spring.MyBean”
autowire = “autowire type”
/>
下面是幾種autowire type的說(shuō)明:
● byname : 試圖在容器中尋找和需要自動(dòng)裝配的屬性名相同的bean或id,如果沒(méi)有找到相應的bean,則這個(gè)
屬性未被裝配上。
● byType : 試圖在容器中尋找一個(gè)與需要自動(dòng)裝配的屬性類(lèi)型相同的bean或id,如果沒(méi)有找到,則該
屬性未被裝配上。
● constructor : 試圖在容器中尋找與需要自動(dòng)裝配的bean的構造
函數參數一致的一個(gè)或多個(gè)bean,如果沒(méi)找到則拋出異常。
● autodetect : 首先嘗試使用constructor來(lái)自動(dòng)裝配,然后再使用byType方式。
從上面可以看出,如果某個(gè)bean不手動(dòng)設置autowire屬性,則默認為手動(dòng)裝配。如果需要將所有bean都設置為自動(dòng)裝配時(shí),可以通過(guò)在<beans>標簽中設置default-autowire
屬性。<beans>標簽是整個(gè)
XML文檔的根,在它下面就是一個(gè)個(gè)的<bean>。
其中default-autowire的值也有byName,byType,constructor,autodetect四種。
例如配置如下:
<beans default-autowire = “byName”>
...
</beans>
自動(dòng)裝配可能帶來(lái)不確定性問(wèn)題。例如使用byType時(shí)可能同時(shí)發(fā)現兩個(gè)相同的類(lèi)型,則不知道該采用哪一個(gè)。所以可能混合采用自動(dòng)和手動(dòng)裝配。例如,對某個(gè)bean設置為自動(dòng)裝配,而對其某個(gè)
屬性則手動(dòng)明確的設置其值,例如:
<bean id = “mybean” class = “blog.spring.MyBean”
Autowire = “byType”
>
<property name = “name”>
<ref bean = “myBean1”>
</property>
</bean>
通過(guò)這樣的配置,對mybean里的name屬性進(jìn)行手動(dòng)裝配,而對除name外的其他
屬性就進(jìn)行自動(dòng)裝配。