1. 程式人生 > >spring中依賴注入的方式及實現(2)

spring中依賴注入的方式及實現(2)

依賴注入的方式

1、屬性注入

2、構造器注入

3、工廠方法注入(很少使用,不推薦)

1、屬性注入

(1)屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的物件
(2)屬性注入使用 <property> 元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 <value> 子節點指定屬性值 
(3)屬性注入是實際應用中最常用的注入方式

例項:<!--通過全類名的方式來配置bean-->

<!-- 
		配置檔案 bean
		class:bean的全類名,通過反射的方式在IOC容器中建立Bean,所以要求Bean中必須有無參的構造器
		id:標識容器中的bean.id 唯一。
-->
	<bean id="helloworld" class="com.wgs.spring.beans.HelloWorld">
		<property name="name2" value="spring"></property>
	</bean>
2、構造方法注入

(1)通過構造方法注入Bean 的屬性值或依賴的物件,它保證了 Bean 例項在例項化後就可以使用。
(2)構造器注入在 <constructor-arg> 元素裡宣告屬性, <constructor-arg> 中沒有 name 屬性

按索引匹配入參:

<!-- 通過構造方法來配置bean的屬性 -->
	<bean id="car" class="com.wgs.spring.beans.Car">
		<constructor-arg value="Audi" index="0"></constructor-arg>
		<constructor-arg value="ShangHai" index="1"></constructor-arg>
		<constructor-arg value="3000000"  index="2"></constructor-arg>
	</bean>
按型別匹配入參:
<bean id="car2" class="com.wgs.spring.beans.Car">
		<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
		<constructor-arg value="ShangHai" type="java.lang.String"></constructor-arg>
		<constructor-arg value="3000000"  type="double"></constructor-arg>
	</bean>
字面值

字面值:可用字串表示的值,可以通過 <value> 元素標籤或 value 屬性進行注入。
基本資料型別及其封裝類、String 等型別都可以採取字面值注入的方式
若字面值中包含特殊字元,可以使用 <![CDATA[]]> 把字面值包裹起來。

<bean id="car2" class="com.wgs.spring.beans.Car">
		<constructor-arg value="Baoma" type="java.lang.String"></constructor-arg>
		<!-- 若字面值中包含特殊字元,可以使用 <![CDATA[]]> 把字面值包裹起來。 -->
		<!-- 屬性值也可以使用value子節點進行配置 -->
		<!-- <constructor-arg value="ShangHai" type="java.lang.String"></constructor-arg> -->
		<constructor-arg type="java.lang.String">
			<value><![CDATA[<ShangHai>]]></value>
		</constructor-arg>
		<constructor-arg value="300" type="int"></constructor-arg>
	</bean>

其與上面區別在於:  上面輸出為:ShangHai 下面輸出為<ShangHai>

引用其它 Bean

組成應用程式的 Bean 經常需要相互協作以完成應用程式的功能. 要使 Bean 能夠相互訪問, 就必須在 Bean 配置檔案中指定對 Bean 的引用

在 Bean 的配置檔案中, 可以通過 <ref> 元素或 ref  屬性為 Bean 的屬性或構造器引數指定對 Bean 的引用. 

也可以在屬性或構造器裡包含 Bean 的宣告, 這樣的 Bean 稱為內部 Bean

<bean id="person" class="com.wgs.spring.beans.Person">
		<property name="name" value="Tom"></property>
		<property name="age" value="24"></property>
		<!-- 可以使用property的ref屬性建立bean之間的引用關係。 -->
		<!-- 方法一 -->
		<!-- 
			<property name="car" ref="car2"></property>
		 -->
		
		<!-- 方法二 -->
		<!-- 
			<property name="car">
			<ref bean="car2"/>
			</property>
		 -->
內部 Bean

當 Bean 例項僅僅給一個特定的屬性使用時, 可以將其宣告為內部 Bean. 內部 Bean 宣告直接包含在 <property> 或 <constructor-arg> 元素裡, 不需要設定任何 id 或 name 屬性
內部 Bean 不能使用在任何其他地方

<bean id="person" class="com.wgs.spring.beans.Person">
		<property name="name" value="Tom"></property>
		<property name="age" value="24"></property>
		<!-- 可以使用property的ref屬性建立bean之間的引用關係。 -->
		<!-- 方法一 -->
		<!-- 
			<property name="car" ref="car2"></property>
		 -->
		
		<!-- 方法二 -->
		<!-- 
			<property name="car">
			<ref bean="car2"/>
			</property>
		 -->
		 
		 <!-- 內部bean ,不能被外部引用,只能在內部使用-->
		 <property name="car">
		 	<bean class="com.wgs.spring.beans.Car">
		 		<constructor-arg value="Ford"></constructor-arg>
		 		<constructor-arg value="Changan"></constructor-arg>
		 		<constructor-arg value="200000" type="double"></constructor-arg>
		 	</bean>
		 </property>
	</bean>
注入引數詳解:null 值和級聯屬性

可以使用專用的 <null/> 元素標籤為 Bean 的字串或其它物件型別的屬性注入 null 值
和 Struts、Hiberante 等框架一樣,Spring 支援級聯屬性的配置。

<bean id="person2" class="com.wgs.spring.beans.Person">
		<constructor-arg value="WGS"></constructor-arg>
		<constructor-arg value="25"></constructor-arg>
		<!-- 
			<constructor-arg ref="car"></constructor-arg>
		 -->
		 
		 <!-- 測試賦值 null -->
		 <!-- 
		 	<constructor-arg><null/></constructor-arg>
		  -->
		  <constructor-arg ref="car"></constructor-arg>
		  <!-- 為級聯屬性賦值 。注意:屬性需要先初始化後才可以為級聯屬性賦值,否則會有異常-->
		  <property name="car.maxSpeed" value="300"></property>
		
	</bean>
集合屬性(1)

在 Spring中可以通過一組內建的 xml 標籤(例如: <list>, <set> 或 <map>) 來配置集合屬性.
配置 java.util.List 型別的屬性, 需要指定 <list>  標籤, 在標籤裡包含一些元素. 這些標籤可以通過 <value> 指定簡單的常量值, 通過 <ref> 指定對其他 Bean 的引用. 通過<bean> 指定內建 Bean 定義. 通過 <null/> 指定空元素. 甚至可以內嵌其他集合.
陣列的定義和 List 一樣, 都使用 <list>
配置 java.util.Set 需要使用 <set> 標籤, 定義元素的方法與 List 一樣.

<!-- 測試如何配置集合屬性 -->
	<bean id="person3" class="com.wgs.spring.beans.collection.Person">
		<property name="name" value="WR"></property>
		<property name="age" value="27"></property>
		<property name="cars">
			<!-- 使用list節點,為集合屬性賦值 -->
			<list>
				<ref bean="car"></ref>
				<ref bean="car2"></ref>
			</list>
		</property>
	</bean>
集合屬性(2)

Java.util.Map 通過 <map> 標籤定義, <map> 標籤裡可以使用多個 <entry> 作為子標籤. 每個條目包含一個鍵和一個值. 
必須在 <key> 標籤裡定義鍵
因為鍵和值的型別沒有限制, 所以可以自由地為它們指定 <value>, <ref>, <bean> 或 <null> 元素. 
可以將 Map 的鍵和值作為 <entry> 的屬性定義: 簡單常量使用 key 和 value 來定義; Bean 引用通過 key-ref 和 value-ref 屬性定義

<!-- 配置Map 屬性值 -->	
	<bean id="newperson" class="com.wgs.spring.beans.collection.NewPerson">
		<property name="name" value="Rose"></property>
		<property name="age" value="26"></property>
		<property name="cars">
		<!-- 使用map節點及map的entry子節點配置map型別 的成員變數-->
			<map>
				<entry key="AA" value-ref="car"></entry>
				<entry key="BB" value-ref="car2"></entry>
			</map>		
		</property>
	</bean>
	
使用 <props> 定義 java.util.Properties, 該標籤使用多個 <prop> 作為子標籤. 每個 <prop> 標籤必須定義 key 屬性.
<!-- 配置properties屬性值 -->
	<bean id="datasource" class="com.wgs.spring.beans.collection.DataSource">
		<property name="properties">
		<!-- 使用prop和props節點來為properties賦值 -->
			<props>
				<prop key="user">root</prop>
				<prop key="password">1234</prop>
				<prop key="jdbcUrl">jdbc:mysql:///test</prop>
				<prop key="driverClass">com.mysql.jdbc.Driver</prop>
			</props>
		</property>
	</bean>
使用 utility scheme 定義集合

使用基本的集合標籤定義集合時, 不能將集合作為獨立的 Bean 定義, 導致其他 Bean 無法引用該集合, 所以無法在不同 Bean 之間共享集合.
可以使用 util schema 裡的集合標籤定義獨立的集合 Bean. 需要注意的是, 必須在 <beans> 根元素裡新增 util schema 定義

<!-- 配置單例集合bean,,以供多個bean進行引用 ,需要匯入util名稱空間-->
	<util:list id="cars">
		<ref bean="car"/>
		<ref bean="car2"/>
	</util:list>
	
	<bean id="person4" class="com.wgs.spring.beans.collection.Person">
		<property name="name" value="jack"></property>
		<property name="age" value="25"></property>
		<property name="cars" ref="cars"></property>
	</bean>
使用 p 名稱空間

為了簡化 XML 檔案的配置,越來越多的 XML 檔案採用屬性而非子元素配置資訊。
Spring 從 2.5 版本開始引入了一個新的 p 名稱空間,可以通過 <bean> 元素屬性的方式配置 Bean 的屬性。
使用 p 名稱空間後,基於 XML 的配置方式將進一步簡化

<bean id="person5" class="com.wgs.spring.beans.collection.Person" p:age="26" p:name="RR" p:car-ref="cars"
	</bean>