自动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会同时考虑类型和名称。