为什么@Autowired 可以得到FactoryBean 类型和Bean 类型?

why @Autowired can get FactoryBean type and Bean type?

我在 .xml

中创建了 spring 工厂 bean
 <bean id="tool" class="pojo.ToolFactory">
    <property name="factoryId" value="9090"/>
    <property name="toolId" value="1"/>
 </bean>

和这样的 ToolFactory 代码,它实现 FactoryBean 并创建工具 bean:

public class ToolFactory implements FactoryBean<Tool> {

private int factoryId;
private int toolId;

public ToolFactory() {
}

public ToolFactory(int factoryId, int toolId) {
    this.factoryId = factoryId;
    this.toolId = toolId;
}

@Override
public Tool getObject() throws Exception {
    return new Tool(toolId);
}

@Override
public Class<?> getObjectType() {
    return Tool.class;
}

@Override
public boolean isSingleton() {
    return false;
}

public int getFactoryId() {
    return factoryId;
}

public void setFactoryId(int factoryId) {
    this.factoryId = factoryId;
}

public int getToolId() {
    return toolId;
}

public void setToolId(int toolId) {
    this.toolId = toolId;
}

@Override
public String toString() {
    return "ToolFactory{" +
            "factoryId=" + factoryId +
            ", toolId=" + toolId +
            '}';
}

}

当我使用 @Autowired 获取名称为 "tool" 的 bean 时,其类型可能是 Tool,这并不奇怪,但是当我将 bean 设置为 ToolFactory, 也可以正确编译运行, 然后我就糊涂了, 谁能给我解释一下?谢谢~

这里是 @Autowired 代码:

@Autowired
private Tool tool; //i can understand this

 @Autowired
private ToolFactory tool; // but  this can be compiled and run correctly, which is confused

然后当我将 @Autowired@Qualifier 一起使用时,也可以识别 ToolToolFactory 类型:

@Autowired
@Qualifier("tool")
private Tool tool;

 @Autowired
@Qualifier("tool")
private ToolFactory tool;

为什么名称为 "tool" 的 bean 可能是 Tool 或 ToolFactory 类型?

您的第一个示例自动接线是按类型完成的,名称无关紧要。该字段甚至可以命名为 foo,它仍然有效。字段名称与您要查找的 bean 的名称无关。

当谈到按类型自动连接时,FactoryBean 有点特殊,因为您可以注入 FactoryBean 本身或它生成的类型。 Spring 将检测字段的类型并找到该类型的直接 bean 或该类型的提供者(在本例中为 FactoryBean)。

现在 @Qualifier 不一定与名称相关联。限定符甚至可以是不同的注释等。它可以是任何东西。该名称用作限定符,但是从 FactoryBean (部分)生成的类型继承与提供它们的工厂相同的限定符。这是指定限定符的唯一方法,除了对生成的类型进行自定义限定注释。

这就是为什么两个自动接线示例都可以工作的原因。