自动装配Spring超类

时间:2013-05-22 04:20:59

标签: java spring inheritance javabeans autowired

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

例如,如果我有

@Component
public class Foo {}

@Component
public class Bar extends Foo {}

和某人自动装配

@Autowired
private Foo foo;

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

技术上你不具备两个 Foo候选人吗? (例如,当从Foo中删除@Component时,Bar会自动选择

3 个答案:

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