6

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

例如,如果我有

@Component
public class Foo {}

@Component
public class Bar extends Foo {}

有人自动接线

@Autowired
private Foo foo;

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

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

4

3 回答 3

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]
于 2013-05-22T04:51:19.290 回答
3

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

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

如果您重命名foo为其他名称会发生​​什么?

于 2013-05-22T04:40:30.330 回答
3

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

于 2013-05-22T04:53:09.077 回答