自动装配Spring超类

Man*_*Row 6 java inheritance spring javabeans autowired

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

例如,如果我有

@Component
public class Foo {}

@Component
public class Bar extends Foo {}
Run Code Online (Sandbox Code Playgroud)

和某人自动装配

@Autowired
private Foo foo;
Run Code Online (Sandbox Code Playgroud)

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

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

ger*_*tan 9

这可能是因为自动装配是通过名称而不是类型完成的.如果我使用xml设置我的bean,如下所示:

<bean id="foo1" class="Foo"/>
<bean id="foo2" class="Bar"/>
Run Code Online (Sandbox Code Playgroud)

并尝试按类型自动装配:

@Autowired private Foo aFoo;
Run Code Online (Sandbox Code Playgroud)

我明白了

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [Foo]
Run Code Online (Sandbox Code Playgroud)