我在.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
一起使用时,也可以识别Tool
或ToolFactory
类型:
@Autowired
@Qualifier("tool")
private Tool tool;
@Autowired
@Qualifier("tool")
private ToolFactory tool;
为什么名称为“ tool”的bean可能是Tool或ToolFactory类型?
答案 0 :(得分:0)
您的第一个示例自动接线是按类型完成的,名称无关紧要。该字段甚至可以命名为foo
,并且仍然可以使用。字段名称与您要查找的bean的名称无关。
在通过类型FactoryBean
自动布线时,您可以注入FactoryBean
本身或生成的类型,这有点特殊。 Spring将检测字段的类型,并找到该类型的直接bean或该类型的提供者(在这种情况下为FactoryBean
)。
现在@Qualifier
不一定要绑定到名称。限定词甚至可以是其他注释等。它可以是任何东西。该名称用作限定符,但是从FactoryBean
生成的类型(部分)继承了与提供它们的工厂相同的限定符。这是指定限定符的唯一方法,除了生成类型的自定义限定注解之外。
这就是为什么两个用于自动接线的样品都可以工作的原因。