Spring由型別(Type)自動裝配


在Spring中,「型別自動裝配」的意思是如果一個bean的資料型別與其它bean屬性的資料型別相同,將自動相容裝配它。
例如,一個「persion」 bean 公開以「ability」類資料型別作為屬性,Spring會找到ability類相同的資料型別,並自動裝配它的Bean。如果沒有匹配找到,它什麼也不做。
可以通過自動裝配 autowire="byType"象下面這樣:
<!-- person has a property type of class "ability" -->
	<bean id="person" class="com.tw511.common.Person" autowire="byType" />
		
	<bean id="invisible" class="com.tw511.common.Ability" >
		<property name="skill" value="Invisible" />
	</bean>
看下面由Spring按型別自動裝配的完整例子。

1. Beans

兩個Bean,person 和 ability.
package com.tw511.common;
 
public class Person 
{
	private Ability ability;
	//...
}
package com.tw511.common;
 
public class Ability 
{
	private String skill;
	//...
}

2. Spring Wiring

通常情況下,明確地裝配 bean:
<bean id="person" class="com.tw511.common.Person">
		<property name="ability" ref="invisible" />
	</bean>
	
	<bean id="invisible" class="com.tw511.common.Ability" >
		<property name="skill" value="Invisible" />
	</bean>

輸出

Person [ability=Ability [skill=Invisible]]
隨著自動裝配按型別啟用後,可以保留ability屬性未設定。Spring會發現相同的資料型別並自動裝配它。
<bean id="person" class="com.tw511.common.Person" autowire="byType" />
	
	<bean id="invisible" class="com.tw511.common.Ability" >
		<property name="skill" value="Invisible" />
	</bean>

輸出

Person [ability=Ability [skill=Invisible]]
如果你有兩個Bean,都是類「ability」相同的資料型別?
<bean id="person" class="com.tw511.common.Person" autowire="byType" />
	
	<bean id="steal" class="com.tw511.common.Ability" >
		<property name="skill" value="Steal" />
	</bean>
	
	<bean id="invisible" class="com.tw511.common.Ability" >
		<property name="skill" value="Invisible" />
	</bean>

輸出

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: 
...
No unique bean of type [com.tw511.common.Ability] is defined: 
expected single matching bean but found 2: [steal, invisible]; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No unique bean of type [com.tw511.common.Ability] is defined: 
expected single matching bean but found 2: [steal, invisible]
在這種情況下,它會打出 UnsatisfiedDependencyException 的錯誤訊息。

在型別的自動裝配模式,就必須確保只有Bean 只有一個唯一的資料型別宣告。

下載原始碼 – http://pan.baidu.com/s/1gdQFszD