Spring入门09 - 属性参考与自动绑定

来源:互联网 发布:光纤猫691数据怎么办 编辑:程序博客网 时间:2024/06/17 17:49

入门 09 - 属性参考与自动绑定

 在定义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。

原创粉丝点击