为什么Spring会在自动装配期间自动选择超类类型?
例如,如果我有
@Component
public class Foo {}
@Component
public class Bar extends Foo {}
和某人自动装配
@Autowired
private Foo foo;
为什么Spring总是选择超类型Foo
?这不应该是“模糊”映射(并导致Spring抛出错误)吗?
技术上你不具备两个 Foo
候选人吗? (例如,当从Foo中删除@Component时,Bar会自动选择 )
答案 0 :(得分:9)
这可能是因为自动装配是通过名称而不是类型完成的。如果我使用xml设置我的bean:
<bean id="foo1" class="Foo"/>
<bean id="foo2" class="Bar"/>
尝试按类型自动装配:
@Autowired private Foo aFoo;
我得到了
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [Foo]
答案 1 :(得分:3)
自动装配可以同时使用类型和bean名称,具体取决于您的配置方式。
在这种情况下,由于有两个类型为Foo
的bean,因此可以选择Foo
实例,因为它与变量foo
的名称相匹配。
如果您将foo
重命名为其他内容会怎样?
答案 2 :(得分:3)
如果有两个相同类型的bean,那么spring会尝试通过您指定的变量的名称来解析依赖关系。如果名称与任何bean名称不匹配,则会引发错误。但是,如果它找到与您指定的变量名称匹配的bean名称,它将注入该bean。 因此,在注入依赖项时,spring会同时考虑类型和名称。