2013-05-22 205 views
6

为什么Spring在自动装配期间自动选择超类类型?自动装配Spring超类

举例来说,如果我有

@Component 
public class Foo {} 

@Component 
public class Bar extends Foo {} 

,有人autowires

​​3210

怎么来的春天总是挑选超Foo?难道这不是一个“模糊的”映射(并导致Spring发生错误)吗?

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

回答

9

这可能是因为自动装配是按名称而不是类型完成的。如果我安装使用我的豆腐这样的XML:

<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] 
3

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

在这种情况下,由于存在两种豆类Foo,因此可以选择Foo实例,因为它与变量foo的名称相匹配。

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

3

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