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



我在.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(部分(生成的类型继承了与提供它们的工厂相同的限定符。这是指定限定符的唯一方法,除了对生成的类型进行自定义限定注释之外。

所以这就是为什么两个样品的自动布线将工作。

最新更新