![名师讲坛:Spring实战开发(Redis+SpringDataJPA+SpringMVC+SpringSecurity)](https://wfqqreader-1252317822.image.myqcloud.com/cover/156/29977156/b_29977156.jpg)
3.5 自动匹配
在Spring中除了可以通过名称实现Bean的关联之外,也可以利用自动匹配形式找到指定的类型并进行关联。之前使用过的@Resource就属于这种自动匹配的处理形式。进行自动匹配时可以使用两种模式:根据名称(byName)匹配和根据类型(byType)匹配。
1.【mldnspring-base项目】定义要使用的程序类。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer649.jpg?sign=1739514054-JK00pJpVdC7xQFPheUqTCtldjMeMPD36-0-6346c45f3475090146c770d1acb65c7f)
此时,Emp程序中定义的Dept类型的属性名称为dept,这样就可以根据名称自动进行匹配,利用反射获取相应的对象实例后实现内容设置。
2.【mldnspring-base项目】定义spring-base.xml配置文件,根据类型进行Bean的自动匹配。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer650.jpg?sign=1739514054-RaLPyb5tJ7PMJg08pOEE4npKnoIhTrXb-0-da3a2e86749828c7fb768ced39b9e4d3)
本程序在定义Emp对象时使用autowire="byType"进行了自动匹配,因此会自动根据类型找到合适的Bean并进行注入。
3.【mldnspring-base项目】编写测试类。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer651.jpg?sign=1739514054-i6CeM10zT4tZbw8C2qTufKbB9awX33eM-0-c7346f0409227f48d66012bc99f6e278)
本程序在进行配置的时候并没有为Emp类设置具体的属性,但由于采用了自动类型匹配,所以可实现部门对象的注入。
4.【mldnspring-base项目】除了根据类型匹配外,也可以根据名称实现匹配,这样即便有多个同类型Bean存在,也可以根据名称匹配注入。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer652.jpg?sign=1739514054-WB8c0DsjmaDJmvRa6lTcPBXTJPRVyvOE-0-d27ff9477c341e74ddec54a643c3e492)
本程序定义了两个Dept对象(名称分别为mydept与dept),由于在定义Emp对象时使用的是根据名称自动注入(autowire="byName"),因此会自动将20号部门的对象信息注入到Emp对象之中。
5.【mldnspring-base项目】在实际的开发过程之中,有可能存在多个相同类型的Bean配置,如果已经配置了根据类型自动注入,则这里可以使用primary="true"来配置优先选择项。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer653.jpg?sign=1739514054-Ohp4112JCpPGZcSlgqLNjCrcJzDyLLUf-0-0228c8ec4880fa80170038a4ac0f6f8b)
本程序在定义Emp对象时采用了根据类型自动匹配,由于此时设置了两个Dept对象,所以默认情况下应出现无法匹配的错误信息。由于在mydept对象定义时使用了primary="true"属性,因此这里并不会产生冲突,而会直接将此对象注入到Emp对象之中。
提示:除了可设置优先选择项,也可以设置取消候选项。
对于以上的配置处理,如果不想使用primary="true"属性,也可以直接将某一个配置的Bean取消候选注入资格。使用autowire-candidate="false"可取消某个类的注入资格。
范例:取消类的注入资格。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer654.jpg?sign=1739514054-0z5IG4AND07GySRxKPE4Vc5OkeSgHd7J-0-ed14061be25d28c22af73048fde6278f)
在本程序中定义了两个Dept对象,由于dept取消了候选配置资格,所以即便根据类型自动匹配,也无法使用此对象。
自动匹配在实际开发中非常重要,并且应用广泛。虽然在Spring中提供了一系列的主选与候选控制,但是从实际开发来讲,应尽量避免重名类的定义。