Spring 自动装配

普通装配

    <bean id="cat" class="com.yang.pojo.Cat"></bean>
    <bean id="dog" class="com.yang.pojo.Dog"></bean>
<!--    普通装配-->
<!--    <bean id="person" class="com.yang.pojo.Person">-->
<!--        <property name="name" value="小花"></property>-->
<!--        <property name="dog" ref="dog"></property>-->
<!--        <property name="cat" ref="cat"></property>-->
<!--    </bean>-->

自动装配

byName:
byName会自动自动在容器上下文中查找,和自己对象set方法后面值对应的bean id

        <bean id="person" class="com.yang.pojo.Person" autowire="byName">
            <property name="name" value="小花"></property>
        </bean>

我们将 cat 的bean id修改为 catXXX

再次测试, 执行时报空指针java.lang.NullPointerException。因为按byName规则找不对应set方法,真正的setCat就没执行,对象就没有初始化,所以调用时就会报空指针错误。

注意
当一个bean节点带有 autowire byName的属性时。

将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。
去spring容器中寻找是否有此字符串名称id的对象。
如果有,就取出注入;如果没有,就报空指针异常。

byType:
byType会自动自动在容器上下文中查找,和自己对象属性相同的bean id
使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

        <bean id="person" class="com.yang.pojo.Person" autowire="byType">
            <property name="name" value="小花"></property>
        </bean>

测试:

1、将user的bean配置修改一下 : autowire=“byType”

2、测试,正常输出

3、再注册一个cat 的bean对象!

<bean id="dog" class="com.yang.pojo.Dog"/>
<bean id="cat" class="com.yang.pojo.Cat"/>
<bean id="cat2" class="com.yang.pojo.Cat"/>

<bean id="user" class="com.yang.pojo.User" autowire="byType">
    <property name="str" value="小花"/>
</bean>

4、测试,报错:NoUniqueBeanDefinitionException

5、删掉cat2,将cat的bean名称改掉!测试!因为是按类型装配,所以并不会报异常,也不影响最后的结果。甚至将id属性去掉,也不影响结果。

小结:

byName: 需要保证所有的bean的id唯一,并且这个bean需要和自动注入的属性的set的方法的值一致!
byType: 需要保证所有的bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
这两个各有各的好处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值