三种方法:
方法一:指定ref属性
最简单的一种就是指定bean的ref属性,ref属性值为另一个bean的id
<bean id="chinese" class="com.lyx.service.Chinese">
<property name="axe" ref="steelAxe"/>
</bean>
<bean id="steelAxe" class="com.lyx.service.SteelAxe"/>
方法二:嵌套bean
为bean指定property 或者 constructor-arg的值时,在其中写子元素bean,作为属性值或者构造器参数。里层bean无需指定id
<bean id="person" class="com.lyx.service.Person" >
<property name="dog">
<bean class="com.lyx.service.Dog">
<property name="name" value="旺财"/>
</bean>
</property>
</bean>
方法三:自动装配注入
这种方法比较智能,所以代码量更少,但是会让程序逻辑不清晰。
bean元素中有属性autowire,该属性可以接受如下值
- no :不使用自动装箱(默认值)
- byName:把bean对象中的setter方法名 与 Spring容器中bean元素的id匹配(当然会解决去掉set并且首字母大写的问题),如果匹配到那么就会配置对应的setter方法,否则不会配置setter方法,也不会报错。
- byType:把bean对象中的setter方法需要的参数类型 与 Spring容器中的bean元素class值匹配,如果匹配到那么就会配置对应的setter方法,否则不会配置setter方法,也不会报错,如匹配到多个bean元素就报错。
- constructor:与byType类似。只不过这个是用于构造器参数配置。
- autodetect: 智能选择用byType还是constructor,这个不太靠谱,我们别用它。
byName用法示例:
<!-- byName策略
说明:Person中有方法setDog(Dog dog)
-->
<bean id="person" class="com.lyx.service.Person" autowire="byName"/>
<bean id="dog" class="com.lyx.service.GunDog">
<property name="name" value="猎狗旺财"/>
</bean>
byType用法示例:
补充说明:bean可以指定autowire-candidate=“false” 让该bean排除在“候选人之外”,这样就可以防止匹配到多个结果。
<!-- byType策略
说明:Person中有方法setDog(Dog dog)
并且GunDog和PetDog都是Dog的实现类
-->
<bean id="person" class="com.lyx.service.Person" autowire="byType"/>
<bean class="com.lyx.service.GunDog" autowire-candidate="false">
<property name="name" value="猎狗旺财"/>
</bean>
<bean class="com.lyx.service.PetDog">
<constructor-arg value="宠物狗二哈"/>
</bean>
第三种方法我觉着有点鸡肋,作为勤劳的程序员我觉得不会为了省这么点字而牺牲程序的可读性可逻辑的清晰性。