为什么@Autowired可以获取FactoryBean类型和Bean类型?

时间:2018-11-18 13:45:41

标签: spring autowired

我在.xml中创建了spring factory bean

 <bean id="tool" class="pojo.ToolFactory">
    <property name="factoryId" value="9090"/>
    <property name="toolId" value="1"/>
 </bean>

和类似的ToolFactory代码,该代码实现FactoryBean并创建Tool 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,这并不奇怪,但是当我将ToolFactory的类型设置为bean时,它也可以编译并正确运行,那么我很困惑,有人可以给我一个解释吗?谢谢〜

这是@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类型?

1 个答案:

答案 0 :(得分:0)

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

在通过类型FactoryBean自动布线时,您可以注入FactoryBean本身或生成的类型,这有点特殊。 Spring将检测字段的类型,并找到该类型的直接bean或该类型的提供者(在这种情况下为FactoryBean)。

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

这就是为什么两个用于自动接线的样品都可以工作的原因。