入门 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值