接續 屬性參考 的內容。
直接指定值或是使用<ref>直接指定參考至其它的Bean,Spring也支援隱式的自動綁定,您可以透過類型(byType)或名稱(byName)將Bean綁定至其它Bean上對應的屬性,下面是個byType的例子:
- beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dateBean" class="java.util.Date"/>
<bean id="helloBean"
class="onlyfun.caterpillar.HelloBean"
autowire="byType">
<property name="helloWord">
<value>Hello!</value>
</property>
</bean>
</beans>
在定義檔中,並沒有指定helloBean的Date屬性,而是透過自動綁定,由於autowire指定了byType,所以會根據helloBean的 Date屬性所接受的型態,判斷是否有類似的型態物件,並將之綁定至helloBean的Date屬性上,如果byType無法完成綁定,則丟出 org.springrframework.beans.factory.UnsatisfiedDependencyExcpetion例外。
您也可以指定byName來綁定,則Spring會根據bean的別名與屬性名稱是否符合來進行自動綁定,舉個例子來說,如果是byName而Date屬性要完成依賴注入的話,則必須修改一下第一個Bean的id值為date:
- beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="onlyfun.caterpillar.HelloBean"
autowire="byName">
<property name="helloWord">
<value>Hello!</value>
</property>
</bean>
</beans>
如果byName無法完成綁定,則屬性維持未綁定狀態。
在建構方法上,也可以嘗試進行自動綁定,例如若HelloBean.java修改如下:
- HelloBean.java
package onlyfun.caterpillar;
import java.util.Date;
public class HelloBean {
private String helloWord;
private Date date;
public HelloBean() {
}
public HelloBean(Date date) {
this.date = date;
}
public void setHelloWord(String helloWord) {
this.helloWord = helloWord;
}
public String getHelloWord() {
return helloWord;
}
public void setDate(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
}
您可以如下定義beans-config.xml:
- beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="onlyfun.caterpillar.HelloBean"
autowire="constructor">
<property name="helloWord">
<value>Hello!</value>
</property>
</bean>
</beans>
由於autowire設定為constructor,在建立綁定關係時,Spring容器會試圖比對容器中的Bean及相關的建構方法,在型態上是否有符 合,如果有的話,則選用該建構方法來建立Bean實例,例如上例中,HelloBean的帶參數建構方法與date這個Bean的型態相符,於是選用該建 構方法來建構實例,並將date這個Bean注入給它,如果無法完成綁定,則丟出 org.springframework.beans.factory.UnsatisfiedDependencyException例外。
還想再偷懶的話。就使用autodetect,例如:
- beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="onlyfun.caterpillar.HelloBean"
autowire="autodetect">
<property name="helloWord">
<value>Hello!</value>
</property>
</bean>
</beans>
使用autodetect時,會嘗試使用constructor,然後使用byType,哪一個先符合就先用。
隱式的自動綁定沒辦法從定義檔中,清楚的看到是否每個屬性都完成設定,我們可以加入相依檢查,在<bean>上加入dependency- check,有四種相依檢查方式:simple、objects、all、none。第一個只檢查簡單的屬性,像是原生(primitive)資料型態或 字串物件,objects檢查物件屬性,all則檢查全部的屬性,none是預設,表示不檢查相依性,例如:
- beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="date" class="java.util.Date"/>
<bean id="helloBean"
class="onlyfun.caterpillar.HelloBean"
autowire="autodetect"
dependency-check="all">
<property name="helloWord">
<value>Hello!</value>
</property>
</bean>
</beans>
如果相依檢查發現有未完成的依賴關係,則運行時會丟出org.springframework.beans.factory.UnsatisfiedDependencyException。