Spring配置bean的詳細知識

weixin_30788239發表於2020-04-05

在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屬性要麼根據型別自動裝配,要麼根據名稱自動裝配,不能兩者兼而有之
一般情況下,在實際的專案中很少使用自動裝配功能,因為和自動裝配功能所帶來的好處比起來,明確清晰的配置文件更有說服力。

 

轉載於:https://www.cnblogs.com/dreamfree/p/4080000.html

相關文章