![名师讲坛: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=1739585449-gTs1kKnZ7x8wTSBxw6F6KoILD5IDl1MI-0-a81287596ff3eda161c004f0f805d06d)
此时,Emp程序中定义的Dept类型的属性名称为dept,这样就可以根据名称自动进行匹配,利用反射获取相应的对象实例后实现内容设置。
2.【mldnspring-base项目】定义spring-base.xml配置文件,根据类型进行Bean的自动匹配。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer650.jpg?sign=1739585449-oOdYHH3tMepdyo5Bhgd29vQQqF6jugc4-0-d0195e6f85baf56c7289830be57a25a2)
本程序在定义Emp对象时使用autowire="byType"进行了自动匹配,因此会自动根据类型找到合适的Bean并进行注入。
3.【mldnspring-base项目】编写测试类。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer651.jpg?sign=1739585449-SHilcDujB249zZtIJFFKJpCeDQ99jQtn-0-f9cc0f39876c22aeb7867e95334f61f6)
本程序在进行配置的时候并没有为Emp类设置具体的属性,但由于采用了自动类型匹配,所以可实现部门对象的注入。
4.【mldnspring-base项目】除了根据类型匹配外,也可以根据名称实现匹配,这样即便有多个同类型Bean存在,也可以根据名称匹配注入。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer652.jpg?sign=1739585449-MOHYrbzSTf3jxzBbSD2C9cWX5O7mS6iF-0-d46865ec03673556e1ad647f4f7fd91d)
本程序定义了两个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=1739585449-jFWOOiiDetu9n1nhMe29JXLIApWdiCMs-0-04c47f58fc99f57f7e4d1797988869c9)
本程序在定义Emp对象时采用了根据类型自动匹配,由于此时设置了两个Dept对象,所以默认情况下应出现无法匹配的错误信息。由于在mydept对象定义时使用了primary="true"属性,因此这里并不会产生冲突,而会直接将此对象注入到Emp对象之中。
提示:除了可设置优先选择项,也可以设置取消候选项。
对于以上的配置处理,如果不想使用primary="true"属性,也可以直接将某一个配置的Bean取消候选注入资格。使用autowire-candidate="false"可取消某个类的注入资格。
范例:取消类的注入资格。
![](https://epubservercos.yuewen.com/5C1AE0/16499866905000506/epubprivate/OEBPS/Images/figer654.jpg?sign=1739585449-5bTT5Xj4uopm1gtG1H8fLk3Rc4YmfAM2-0-72d71dadad2209478d108dcc37d5886a)
在本程序中定义了两个Dept对象,由于dept取消了候选配置资格,所以即便根据类型自动匹配,也无法使用此对象。
自动匹配在实际开发中非常重要,并且应用广泛。虽然在Spring中提供了一系列的主选与候选控制,但是从实际开发来讲,应尽量避免重名类的定义。