Spring入門09 - 屬性參考與自動綁定

入門 09 - 屬性參考與自動綁定 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 在定義Bean時,除了直接指定值給屬性值之外,還可以直接參考定義檔中的其它Bean,例如HelloBean是這樣的話:

HelloBean.java

package onlyfun.caterpillar;

 

import java.util.Date;

 

public class HelloBean {

    private String helloWord = "Hello!World!";

    private Date date;

   

    public void setHelloWord(String helloWord) {

        this.helloWord = helloWord;

    }

    public String getHelloWord() {

        return helloWord + ":" + date.toString();

    }

    public void setDate(Date date) {

        this.date = date;

    }   

    public Date getDate() {

        return date;

    }

}


 我們的Bean定義檔中,先定義了一個dateBean,之後helloBean可以直接參考至dateBean,Spring會幫我們完成這個依賴關係:

<?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">

        <property name="helloWord">

            <value>Hello!Justin!</value>

        </property>

        <property name="date">

            <ref bean="dateBean"/>

        </property>

    </bean>

</beans><?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">

        <property name="helloWord">

            <value>Hello!Justin!</value>

        </property>

        <property name="date">

            <ref bean="dateBean"/>

        </property>

    </bean>

</beans>


 直接指定值或是使用<ref>直接指定參考至其它的Bean,這種顯式的關係指定是比較好的,不過Spring也支持隱式的自動綁定,您可 以透過類型(byType)或名稱(byName)將Bean綁定至其它Bean上對應的屬性,下面是個byType的例子:

<?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!Justin!</value>

        </property>

       

    </bean>

</beans>


 在這邊,我們並沒有指定helloBean的Date屬性,而是透過自動綁定,由於autowire指定了byType,所以會根據Date屬性所接受的型態,判斷BeanFactory中是否有類似的型態對象,並將之綁定至Date屬性上。
 
 您也可以指定byName來綁定,則Spring會根據bean的別名與屬性名稱是否符合來進行自動綁定,舉個例子來說,如果是byName而Date屬性要完成依賴注入的話,則必須修改一下第一個Bean的id值爲date:

<?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!Justin!</value>

        </property>

       

    </bean>

</beans>


 隱式的自動綁定沒辦法從定義檔中,清楚的看到是否每個屬性都完成設定,我們可以加入相依檢查,在< bean>上加入dependency-check,有四種相依檢查方式:simple、objects、all、none。第一個只檢查簡單的屬性,像是原生(primitive)數據型態或字符串對象,objects檢查對象屬性,all則檢查全部的屬性,none是預設,表示不檢查相依性。

 
 下面是一個設定的例子:

<?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" dependency-check="all">

        <property name="helloWord">

            <value>Hello!Justin!</value>

        </property>

       

    </bean>

</beans>


 如果相依檢查發現有未完成的依賴關係,則運行時會丟出UnsatisfiedDependencyException。

發佈了106 篇原創文章 · 獲贊 0 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章