027Bean配置的参数为复合类(配置bean与bean之间的依赖)

三种方法:

方法一:指定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>

第三种方法我觉着有点鸡肋,作为勤劳的程序员我觉得不会为了省这么点字而牺牲程序的可读性可逻辑的清晰性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值