前言
最近在使用FactoryBean的时候遇到了一些问题,在这里记录一下:首先是不明白FactoryBean的使用,查询了资料很快也明白了它的原理,然后就是结合@Autowired和@Resource注解使用的时候出现了一些问题。
FactoryBean的使用
spring的xml文件中定义bean的时候,并不总是返回定义的类型的bean,有时候是它的产物,FactoryBean就是这样。FactoryBean比较适用的一个场景是:当一个类比较复杂,使用java编码比使用xml配置更容易表达,这个时候把这个类当作FactoryBean的产物比较方便。
下面看具体的使用:
首先定义一个实体类:
public class Tool {
private int id;
public Tool() {
}
public Tool(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Tool{" +
"id=" + id +
'}';
}
}
ToolFactory实现FactoryBean接口:
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;
}
//如果FactoryBean返回的是单例,该方法返回值为true,否则为false
@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 +
'}';
}
}
配置文件如下:
<bean id="tool" class="pojo.ToolFactory">
<property name="factoryId" value="9090"/>
<property name="toolId" value="1"/>
</bean>
测试的时候如下:
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
Object z = context.getBean("tool");//返回产物bean
Object v = context.getBean("&tool");//返回FactoryBean类型
System.out.println(z.toString());
System.out.println(v.toString());
}
最后输出结果:
到此FactoryBean的 简单使用就说完了,我讲的比较简单,如果大家想深究FactoryBean的原理可以看一下源码,或者搜索其他优秀博主的文章。接下来我想讲的是FactoryBean使用注解的时候遇到的问题,参见下一篇文章:
https://blog.csdn.net/u014473112/article/details/84309965