跳到正文
堆栈茶社
返回

Spring学习笔记 - Spring FactoryBean

更新于:
—次阅读
编辑此页

简述

org.springframework.beans.factory.FactoryBean<T>是Spring容器提供的一种可以扩展容器对象实例化逻辑的接口。FactoryBean,其主语是Ben,定于为Factory,也就是说,它本身与其他注册到容器中的对象一样,只是一个Bean而已,只不过这种类型的Bean本身就是生产对象的工厂。

接口定义

它的接口定义如下

public interface FactoryBean<T> {
  @Nullable
  T getObject() throws Exception;
  @Nullable
  Class<?> getObjectType();
  default boolean isSingleton() {
    return true;
  }
}

getObject()方法会返回该FactoryBean“生产”的对象实例,我们需要实现该方法以给出自己的对象实例化逻辑;getObjectType()方法仅返回getObject()方法所返回的对象的类型,如果预先无法确定,则返回null;isSingleton()方法返回结果用于表明,工厂方法(getObject())所“生产”的对象是否要以singleton形式存在于容器中。如果以singleton形式存在,则返回true,否则返回false;

使用场景

FactoryBean的一般使用场景是,当我们需要实例化一个比较复杂的Bean时,我们可以通过实现FactoryBean来定制Bean的实例化过程。

在IOC容器中,通过getBean(BeanName)方法获取Bean时,如果该Bean实现了FactoryBean接口,则获取到该Bean的实例为getObjet()方法返回的结果,并不是FactoryBean的实现类对象。

使用示例

我们实现一个FactoryBean示例,我们将实现一个ToolFactory,它将产生Tool类型的实例对象。

public class Tool {
 
    private int id;
 
    // standard constructors, getters and setters
}
public class ToolFactory implements FactoryBean<Tool> {
 
    private int factoryId;
    private int toolId;
 
    @Override
    public Tool getObject() throws Exception {
        return new Tool(toolId);
    }
 
    @Override
    public Class<?> getObjectType() {
        return Tool.class;
    }
 
    @Override
    public boolean isSingleton() {
        return false;
    }
 
    // standard setters and getters
}

使ToolFactory生效(将FactoryBean的实现注册到IOC容器中),有以下两种方式:

使用时,直接引入Tool实例对象即可

public class FactoryBeanTest {
    @Autowired
    private Tool tool;
 
    @Test
    public void test() {
        assertThat(tool.getId(), equalTo(1));
    }
}

编辑此页
分享这篇文章:

上一篇
Twitter的SnowFlake算法demo
下一篇
Spring学习笔记 - Spring AOP 概述