为什么@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
一起使用时,也可以识别 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
(部分)生成的类型继承与提供它们的工厂相同的限定符。这是指定限定符的唯一方法,除了对生成的类型进行自定义限定注释。
这就是为什么两个自动接线示例都可以工作的原因。
我在 .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
(部分)生成的类型继承与提供它们的工厂相同的限定符。这是指定限定符的唯一方法,除了对生成的类型进行自定义限定注释。
这就是为什么两个自动接线示例都可以工作的原因。