3.5 自动匹配

在Spring中除了可以通过名称实现Bean的关联之外,也可以利用自动匹配形式找到指定的类型并进行关联。之前使用过的@Resource就属于这种自动匹配的处理形式。进行自动匹配时可以使用两种模式:根据名称(byName)匹配和根据类型(byType)匹配。

1.【mldnspring-base项目】定义要使用的程序类。

此时,Emp程序中定义的Dept类型的属性名称为dept,这样就可以根据名称自动进行匹配,利用反射获取相应的对象实例后实现内容设置。

2.【mldnspring-base项目】定义spring-base.xml配置文件,根据类型进行Bean的自动匹配。

本程序在定义Emp对象时使用autowire="byType"进行了自动匹配,因此会自动根据类型找到合适的Bean并进行注入。

3.【mldnspring-base项目】编写测试类。

本程序在进行配置的时候并没有为Emp类设置具体的属性,但由于采用了自动类型匹配,所以可实现部门对象的注入。

4.【mldnspring-base项目】除了根据类型匹配外,也可以根据名称实现匹配,这样即便有多个同类型Bean存在,也可以根据名称匹配注入。

本程序定义了两个Dept对象(名称分别为mydept与dept),由于在定义Emp对象时使用的是根据名称自动注入(autowire="byName"),因此会自动将20号部门的对象信息注入到Emp对象之中。

5.【mldnspring-base项目】在实际的开发过程之中,有可能存在多个相同类型的Bean配置,如果已经配置了根据类型自动注入,则这里可以使用primary="true"来配置优先选择项。

本程序在定义Emp对象时采用了根据类型自动匹配,由于此时设置了两个Dept对象,所以默认情况下应出现无法匹配的错误信息。由于在mydept对象定义时使用了primary="true"属性,因此这里并不会产生冲突,而会直接将此对象注入到Emp对象之中。

提示:除了可设置优先选择项,也可以设置取消候选项。

对于以上的配置处理,如果不想使用primary="true"属性,也可以直接将某一个配置的Bean取消候选注入资格。使用autowire-candidate="false"可取消某个类的注入资格。

范例:取消类的注入资格。

在本程序中定义了两个Dept对象,由于dept取消了候选配置资格,所以即便根据类型自动匹配,也无法使用此对象。

自动匹配在实际开发中非常重要,并且应用广泛。虽然在Spring中提供了一系列的主选与候选控制,但是从实际开发来讲,应尽量避免重名类的定义。