在Spring中配置bean的一些細節。具體資訊請參考下面的程式碼及註釋
applicationContext.xml檔案
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:util="http://www.springframework.org/schema/util" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd"> 8 9 <!-- 配置bean 10 class:bean的全類名,通過反射的方式在IOC容器中建立Bean,所以要求Bean中必須有無引數的構造器 11 id:標識容器中的bean,id唯一。 12 --> 13 <bean id="helloSpring" class="com.yl.HelloSpring"> 14 <property name="name" value="Spring"></property> 15 </bean> 16 <!-- 使用構造器注入屬性值可以指定引數的位置和引數的型別,以區分過載的構造器 --> 17 <bean id="car" class="com.yl.Car"> 18 <constructor-arg value="Audi" index="0"></constructor-arg> 19 <constructor-arg value="Shanghai" index="1"></constructor-arg> 20 <constructor-arg value="300000" type="double"></constructor-arg> 21 </bean> 22 23 <bean id="car2" class="com.yl.Car"> 24 <constructor-arg value="BMW" type="java.lang.String"></constructor-arg> 25 <!-- 如果字面值包含特殊字元,可以使用<![CDATA[]]> 包裹起來--> 26 <!-- 屬性值還可以使用value子節點進行配置 --> 27 <constructor-arg type="java.lang.String"> 28 <value><![CDATA[<ShangHai~>]]></value> 29 </constructor-arg> 30 <constructor-arg value="200" type="int"></constructor-arg> 31 </bean> 32 33 34 <bean id="person" class="com.yl.Person"> 35 <property name="name" value="Tom"></property> 36 <property name="age" value="24"></property> 37 <!-- 可以使用property的ref屬性建立bean之間的引用關係 --> 38 <!-- <property name="car" ref="car2"></property> --> 39 <!-- <property name="car"> 40 <ref bean="car2"/> 41 </property> --> 42 <!-- 內部Bean,不能被外部引用,只能在內部使用 --> 43 <property name="car"> 44 <bean class="com.yl.Car"> 45 <constructor-arg value="Ford"></constructor-arg> 46 <constructor-arg value="BeiJing"></constructor-arg> 47 <constructor-arg value="100000"></constructor-arg> 48 </bean> 49 </property> 50 </bean> 51 52 53 <bean id="person2" class="com.yl.Person"> 54 <constructor-arg value="Jerry"></constructor-arg> 55 <constructor-arg value="25"></constructor-arg> 56 <!-- <constructor-arg ref="car"></constructor-arg> --> 57 <!-- 測試null值 --> 58 <!-- <constructor-arg><null/></constructor-arg> --> 59 <!-- 為級聯屬性賦值。注意:屬性需要先初始化後才可以為級聯屬性賦值,否則會有異常 --> 60 <constructor-arg ref="car"></constructor-arg> 61 <property name="car.speed" value="260"></property> 62 </bean> 63 64 65 <!-- 測試集合屬性 --> 66 <bean id="person3" class="com.yl.collections.Person"> 67 <property name="name" value="Mike"></property> 68 <property name="age" value="30"></property> 69 <property name="cars"> 70 <!-- 使用list節點為List型別的屬性賦值 --> 71 <list> 72 <ref bean="car"/> 73 <ref bean="car2"/> 74 <bean class="com.yl.Car"> 75 <constructor-arg value="Ford"></constructor-arg> 76 <constructor-arg value="BeiJing"></constructor-arg> 77 <constructor-arg value="100000"></constructor-arg> 78 </bean> 79 </list> 80 </property> 81 </bean> 82 83 <!-- 配置Map屬性值 --> 84 <bean id="newPerson" class="com.yl.collections.NewPerson"> 85 <property name="name" value="Rose"></property> 86 <property name="age" value="24"></property> 87 <property name="cars"> 88 <!-- 使用map節點機map的entry子節點配置Map型別的成員變數 --> 89 <map> 90 <entry key="AA" value-ref="car"></entry> 91 <entry key="BB" value-ref="car2"></entry> 92 </map> 93 </property> 94 </bean> 95 96 <!-- 配置Properties屬性值 --> 97 <bean id="dataSource" class="com.yl.collections.DataSource"> 98 <property name="properties"> 99 <!-- 使用props和prop子節點來為Properties屬性賦值 --> 100 <props> 101 <prop key="user">root</prop> 102 <prop key="password">1234</prop> 103 <prop key="jdbcUrl">jdbc:mysql:///test</prop> 104 <prop key="driverClass">com.mysql.jdbc.Driver</prop> 105 </props> 106 </property> 107 </bean> 108 109 <!-- 配置單例的集合bean,以供多個bean進行引用.需要匯入util名稱空間 --> 110 <util:list id="cars"> 111 <ref bean="car"/> 112 <ref bean="car2"/> 113 </util:list> 114 115 <bean id="person4" class="com.yl.collections.Person"> 116 <property name="name" value="Jack"></property> 117 <property name="age" value="25"></property> 118 <property name="cars" ref="cars"></property> 119 </bean> 120 121 <!-- 通過p名稱空間為bean的屬性賦值,需要先匯入p名稱空間,相對於傳統的方式,更加簡潔 --> 122 <bean id="person5" class="com.yl.collections.Person" p:name="Queen" p:age="27" p:cars-ref="cars"></bean> 123 124 125 126 127 128 129 </beans>
Spring自動裝配bean
Spring IOC容器可以自動裝配bean,需要做的僅僅是在<bean>的autowire屬性裡指定裝配的模式
byType:根據型別自動裝配,若IOC容器中有多個與目標型別一致的bean,在這種情況下,Spring將無法判定哪個bean最合適該屬性,所以不能執行
byName:根據名稱自動裝配,必須將目標bean的名稱和屬性名設定的完全相同
constructor:通過構造器自動裝配,當bean中存在多個構造器時,此種自動裝配方式將會很複雜。不推薦使用。具體資訊參考下面的檔案及註釋
beans.xml檔案
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:util="http://www.springframework.org/schema/util" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd"> 8 9 <bean id="address" class="com.yl.autowire.Address" 10 p:city="BeiJing" p:street="HuiLongGuan"></bean> 11 12 <bean id="car" class="com.yl.autowire.Car" 13 p:brand="Audi" p:price="30000"></bean> 14 15 <!-- <bean id="person" class="com.yl.autowire.Person" 16 p:name="Tom" p:address-ref="address" p:car-ref="car"></bean> --> 17 <!-- 可以使用autowire屬性指定自動裝配的方式, 18 byName根據bean的名字和當前bean的setter風格的屬性名進行自動裝配 ,若有匹配的,則進行自動裝配,若沒有匹配的,則不裝配 19 byType根據bean的型別和當前bean的屬性的型別進行自動裝配,若IOC容器中有一個以上的型別匹配的bean,則丟擲異常 20 --> 21 <bean id="person" class="com.yl.autowire.Person" 22 p:name="Tom" autowire="byName"></bean> 23 </beans>
自動裝配的缺點
在bean配置檔案裡設定autowire屬性進行自動裝配將會裝配bean的所有屬性,然而,若只希望裝配個別屬性時,autowire就不夠靈活了。
autowire屬性要麼根據型別自動裝配,要麼根據名稱自動裝配,不能兩者兼而有之
一般情況下,在實際的專案中很少使用自動裝配功能,因為和自動裝配功能所帶來的好處比起來,明確清晰的配置文件更有說服力。