普通装配
<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需要和自动注入的属性的类型一致!
这两个各有各的好处