FactoryBean结合@Autowired和@Resource的使用产生的问题深究(一)

前言

最近在使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值