一、四种类型的自动装配
byName | 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。如果没有跟属性名字相匹配的Bean,则该属性不进行装配。 |
byType | 把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应的属性中。如果没有跟属性的类型相匹配的Bean,则该属性不被装配。 |
constructor | 把与Bean构造器入参具有相同类型的其他Bean自动装配的到Bean的构造器对应的入参中。 |
autodetect | 首先尝试使用constructor进行自动装配,如果失败则尝试使用byType进行自动装配。 |
1、byName自动装配
【装配过程】Spring会为属性自动装配ID与该属性名字相同的Bean
【缺点】需要时Bean的名字与其他Bean的属性名字一致
<bean id="instrument" class="com.bbp.springInAction.beans.Saxophone"/>
<bean id="kenny" class="com.bbp.springInAction.beans.Instrumentalist" autowire="byName">
<property name="song" value="MySun"/>
</bean>
2、byType自动装配
【装配过程】Spring会寻找类型与需要填充的属性相同的Bean
【局限性】Spring找到多个类型与需要自动装配的属性的类型相匹配的Bean时会抛出异常
【局限性的解决办法】
① 为自动装配标识一个首选Bean
可以使用<bean>元素的primary属性,默认属性为true,在使用时是将非首选Bean的primary属性设置成false。
② 取消某个Bean自动装配的候选资格
排除某些Bean可以设置Bean的autowire-candidate属性为false。
3、constructor自动装配
【装配过程】Spring会在应用上下文中自动选择Bean注入到构造器入参中
【局限性】除了和byType一样的局限性外,如果有多个构造器,它们都满足自动装配的条件,Spring也会
抛出异常
4、最佳的自动装配——autodetect
【装配过程】当配置一个Bean的aurowire属性为autodetect时,Spring将首先尝试使用constructor自动装配,如果没有发现与构造器相匹配的Bean时,Spring将尝试使用byType自动装配。
二、默认的自动装配
<beans default-autowire="byType"><beans/>
设置了上述的配置,会使Spring容器中的自动装配装配aurowire属性默认为default-autowire所配置的方式
【说明】
① autowire默认值是default ,并非是none;defualt-autorwire的默认值是noone,即指定的Spring配置文件中的所有Bean都不使用自动装配;在autowire的默认情况下是遵循defualt-autorwire的设置,即指定的Spring配置文件中的所有Bean都不使用自动装配。
② 在<beans/>元素中设置了default-autowire 属性后,可以使用<bean/>元素中的 aurowire属性来覆盖<beans/>元素所配置的默认自动装配策略
四、混合使用自动装配和限制装配
在对某个Bean选择了自动装配的策略后,任然可以为该Bena的任意一个属性配置<property/>元素。这样在采用自动装配策略后,通过显示地装配Bean的属性可以覆盖该属性的自动装配,进而规避了“多匹配”而抛出的异常。
【注意】不能混合使用constructor自动装配策略和<constructor-arg/>元素