前言

今天,主要介绍下spring的自动装配特性。看了之前的文章,我们已经看到依赖注入的强大之处,但是你会发现当一个bean依赖另一个bean的时候,你需要在xml配置文件中定义如下的元素引用:

<bean id="tv" class="sirk_spring_tuto.demo.TV">
<property name="screen" ref="screen"></property> 
</bean>
<bean id="screen" class="sirk_spring_tuto.demo.CRTScreen"></bean>

上述代码中,id为tv的bean注入了id为screen的bean,而且是通过setter注入的,所以必须在id为tv的bean中添加

<property name="screen" ref="screen"></property>

如果还有其他的属性需要注入,也是需要依次添加上述的标签定义的。试想一下,如果你有很多bean,并且很多需要注入的依赖属性,那么你的xml配置文件将会变得非常庞大。为了解决这个问题,spring提供了一个自动装配的特性,它可以自动搜集bean,并且将依赖自动装配装配到需要的bean中去。

spring自动装配的几种类型

  • byName 通过属性名称进行自动装配。spring容器通过查找在xml配置文件中autowire属性被设置为byName的bean。然后它会去试着匹配配置文件中其它bean,如果那个bean名称和需要注入的属性名称一样,就进行装配。
  • byType 通过属性数据类型进行自动装配。与上述byName类似,不过进行匹配的时候是根据数据类型进行匹配。
  • constructor 和byType类似,不过类型是根据构造方法的类型进行匹配。
  • autodetect 首先尝试通过构造方法进行装配,如果不成功,则通过byType进行自动装配。

一个根据byName自动装配的例子

这里我们引用spring新手攻略(9)-依赖注入(二)(Dependency Injection)的例子,java代码部分不变。只修改xml配置文件。

之前的xml配置文件:

<bean id="tv" class="sirk_spring_tuto.demo.TV">
<property name="screen" ref="screen"></property> 
</bean>
<bean id="screen" class="sirk_spring_tuto.demo.CRTScreen"></bean>

通过byName自动装配:

<bean id="tv" class="sirk_spring_tuto.demo.TV" autowire="byName">
<!-- <property name="screen" ref="screen"></property>  -->
</bean>
<bean id="screen" class="sirk_spring_tuto.demo.CRTScreen"></bean>

上面我们注释掉了property的定义,但是可以正常执行。

根据byType和constructor进行自动装配

byType类似。只需要将autowire属性的值换成byType。constructor,只需要将autowire属性的值换成constructor。并且在id为tv的Class类TV中需要定义一个构造方法来进行通过构造方法注入。

几个关于自动装配需要注意的地方

  • 声明了自动装配属性后,还是可以显示的通过property等进行设置进行装配,并且这些设置会覆盖自动装配。
  • 无法自动装配原始数据类型,Strings和Classes类型。
  • 自动装配与手动装配相比不够精确,所以在允许情况下尽可能使用手动装配。

小结

介绍了spring中的几种自动装配方式,下文将介绍基于注解的配置。

##文档信息