正如前面提到的那樣,bean的屬性和構造函數參數可以被定義為其他bean的引用(合作者),或者內聯定義的值。為了達到這個目的,XmlBeanFactory在property和constructor-arg元素中支持許多子元素類型。
value元素用適合人讀的字符串形式指定屬性或構造函數參數。正如前面提到的那樣,JavaBeans的PropertyEditors被用來將這些字符串從java.lang.String類型轉變為真實的屬性類型或參數類型。
<beans>
<bean destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property >
<value>com.mysql.jdbc.Driver</value>
</property>
<property >
<value>jdbc:mysql://localhost:3306/mydb</value>
</property>
<property >
<value>root</value>
</property>
</bean>
</beans>bean >
<property ><value></value></property>
</bean>
導致email屬性被設置為””,同java代碼:exampleBean.setEmail("")等價。而專門的<null>元素則可以用來指定一個null值,所以
<bean >
<property ><null/></property>
</bean>
同代碼:exampleBean.setEmail(null)是等價的.
list, set, map, 以及 props 元素可以用來定義和設置類型 為Java的List,Set, Map, 和 Properties .
<beans>
...
<bean >
<!-- results in a setPeople(java.util.Properties) call -->
<property >
<props>
<prop key="HarryPotter">The magic property</prop>
<prop key="JerrySeinfeld">The funny property</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property >
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource"/>
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property >
<map>
<entry key="yup an entry">
<value>just some string</value>
</entry>
<entry key="yup a ref">
<ref bean="myDataSource"/>
</entry>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property >
<set>
<value>just some string</value>
<ref bean="myDataSource"/>
</set>
</property>
</bean>
</beans>
注意:Map的entry或set的value,它們的值又可以是下面元素中的任何一個:
(bean | ref | idref | list | set | map | props | value | null)
在property 元素中定義的bean元素用來定義一個內聯的bean,而不是引用BeanFactory其他地方定義的bean。內聯bean定義不需要任何id定義
<bean >
<!-- Instead of using a reference to target, just use an inner bean -->
<property >
<bean >
<property ><value>Tony</value></property>
<property ><value>51</value></property>
</bean>
</property>
</bean>
idref元素完全是一種簡寫和防止錯誤的方式,用來設置屬性值為容器中其他bean的id 或name。
<bean >
</bean>
<bean >
<property >
<idref bean="theTargetBean"/>
</property>
</bean>
bean > </bean> <bean > <property > <value>theTargetBean</value> </property> </bean>
第一種形式比第二種形式更好的原因是:使用idref標記將會使Spring在部署的時候就驗證其他的bean是否真正存在;在第二種形式中,targetName屬性的類僅僅在Spring實例化這個類的時候做它自己的驗證,這很可能在容器真正部署完很久之后。
另外,如果被引用的bean在同一個xml文件中而且bean的名稱是bean的 id,那么就可以使用local屬性。它會讓XML解析器更早,在XML文檔解析的時候,驗證bean的名稱。
<property >
<idref local="theTargetBean"/>
</property>
ref元素是最后一個能在property元素中使用的元素。它是用來設置屬性值引用容器管理的其他bean(可以叫做合作者)。正如前一節提到的,擁有這些屬性的bean依賴被引用的bean,被引用的bean將會在屬性設置前,必要的時候需要時初始化(如果是一個singleton bean可能已經被容器初始化)。所有的引用根本上是一個指向其他對象的引用,不過有3種形式指定被引用對象的id/name,這3種不同形式決定作用域和如何處理驗證。
用ref元素的bean屬性指定目標bean是最常見的形式,它允許指向的bean可以在同一個BeanFactory/ApplicationContext(無論是否在同一個XML文件中)中,也可以在父BeanFactory/ApplicationContext中。bean屬性的值可以同目標bean的id屬性相同,也可以同目標bean的name屬性中任何一個值相同。
<ref bean="someBean"/>
用local屬性指定目標bean可以利用XML解析器的能力在同一個文件中驗證XML id引用。local屬性的值必須與目標bean的id屬性一致。如果在同一個文件中沒有匹配的元素,XML解析器將會產生一個錯誤。因此,如果目標bean在同一個XML文件中,那么使用local形式將是最好的選擇(為了能夠盡可能早的發現錯誤)。
<ref local="someBean"/>
用parent屬性指定目標bean允許引用當前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中的bean。parent屬性的值可以同目標bean的id屬性相同,也可以同目標bean的name屬性中的一個值相同,而且目標bean必須在當前BeanFactory(ApplicationContext)的父BeanFactory(ApplicationContext)中。當需要用某種proxy包裝一個父上下文中存在的bean(可能和父上下文中的有同樣的name),所以需要原始的對象用來包裝它。
<ref parent="someBean"/>