我在.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
时,也可以识别Tool
或ToolFactory
类型:
@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
(部分(生成的类型继承了与提供它们的工厂相同的限定符。这是指定限定符的唯一方法,除了对生成的类型进行自定义限定注释之外。
所以这就是为什么两个样品的自动布线将工作。