自动assemblySpring超类

为什么Spring在自动assembly期间会自动选择超类类型?

例如,如果我有

@Component public class Foo {} @Component public class Bar extends Foo {} 

和某人自动assembly

 @Autowired private Foo foo; 

为什么Spring总是选择超类型Foo ? 这不应该是一个“ 模糊 ”的映射(并导致Spring抛出错误)?

难道你不是技术上有两个 Foo候选人吗? (例如,当从Foo中删除@Component时,会自动选择 Bar …)

这可能是因为自动assembly是通过名称而不是类型完成的。 如果我像这样使用xml设置我的bean:

   

并尝试按类型自动assembly:

 @Autowired private Foo aFoo; 

我明白了

 org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [Foo] 

自动assembly可以使用类型和bean名称,具体取决于您如何配置它。

在这种情况下,由于有两个类型为Foo bean,因此可以选择Foo实例,因为它匹配变量foo的名称。

如果你将foo重命名为其他内容会发生什么?

如果有两个相同类型的bean,那么spring会尝试通过您指定的变量的名称来解析依赖关系。 如果名称与任何bean名称不匹配,则会引发错误。 但是,如果它找到与您指定的变量名称匹配的bean名称,它将注入该bean。 因此,在注入依赖项时,spring会同时考虑类型和名称。