Spring的IOC容器—Bean的自动装配

时间:2022-08-25 19:07:04

我们对XML配置文件装配Bean的方式都很熟悉了,但是随着业务的复杂性,我们可能编写越来越复杂的XM配置。

Spring提供了4种类型的自动装配的方式,帮助我们减少XML的配置数量。如下:


byName:根据与bean的属性具有相同名字(或者ID)的其他bean进行注入

byType:   根据与bean的属性具有相同类型的其他bean进行注入

constructor:根据与bean的构造函数参数有相同类型的bean进行注入

autodetect :  首先尝试使用constructor进行注入,失败则尝试使用byType。


1. ByName

为属性自动装配ID与属性的名字相同的bean

<bean id="Huohuo" class= "com.tgb.depencyimpl.Huohuo">  
<property name="eat" ref="WideMouthEat"></property>
</bean>
<bean id="WideMouthEat" class="com.tgb.depencyimpl.WideMouthEat">
</bean>

修改配置文件:

<bean id="Huohuo" class= "com.tgb.depencyimpl.Huohuo" autowiire=”byName”/>  
<bean id="WideMouthEat" class="com.tgb.depencyimpl.WideMouthEat">
</bean>

byName自动遵循一项约定:为属性自动装配ID与属性的名字相同的bean。通过设置autowire属性为byName,Spring将特殊对待Huohuo的所有属性,为这些属性寻找与名字相同的spring bean Spring会发现 WideMouthEat属性可以通过setter注入来进行自动装配。

2. ByType

类似于byName,只不过不是匹配属性的名字,而是检查属性的类型。例如上面的例子autowire属性设置为byType,Spring会查找哪一个bean的类型与WideMouthEat类型相匹配。如果匹配,则把该bean装配到Huohuo的属性WideMouthEat中。

注意:如果存在多个Bean,他们的类型与需要自动装配的类型相同。可以使用primary属性,标识首选bean。默认true.也可以设置autowire-candidate属性为false


3. Constructor

如果要通过构造器注入来配置Bean,我们可以移除<constructor-arg>元素,采用autowire=”constructor”属性自动选择bean注入到构造器中。例如:通过调用public Yunyun(Eat eat)将其注入。

<bean id="Yunyun" class= "com.tgb.depencyimpl.Yunyun" autowire="constructor ">   
</bean>
<bean id="Eat" class="com.tgb.depencyimpl.Eat"/>

4. Autodetect

这种情况下Spring会先尝试使用constructor自动装配,如果没有发现与构造器相匹配的bean时,Spring将尝试使用byType自动装配。例如:

<bean id="Yunyun" class= "com.tgb.depencyimpl.Yunyun" autowire="constructor ">   
</bean>
<bean id="Eat" class="com.tgb.depencyimpl.Eat"/>

此例中,通过调用public Yunyun(Eat eat)将其注入。


总结:自动装配可以让我们减少XML配置数量,但是同时也增加了配置文件的复杂性。特别是应付多种相同Bean需要装配时,需要花费力气去知道哪一个Bean需要被自动注入。