一、前言

FactoryBean 是一个接口,为 Spring 容器 实例化 Bean 提供了更灵活的方式。如果某个Bean实现此接口,则它用作对象公开的工厂,而不直接用作将自身暴露的 Bean实例(可以通过&beanName获取FactoryBean本身)。
FacotryBean 可以支持 单例原型 作用域,也可以懒加载或在启动时就创建对象。SmartFactory 接口允许公开更细粒度的行为元数据。
若需要在 FactoryBean 中访问其他 Bean ,可以实现 BeanFactoryAware 意识接口。
容器只负责管理 FactoryBean 实例的生命周期,而不负责由 FactoryBean 创建的对象的生命周期。不会回调暴露的 Bean 对象的生命周期方法。相反,FactoryBean 应该实现 DisposableBean 并将任何这样的调用委托给底层对象。

factory bean 是指在 Spring 容器中配置并通过实例或静态工厂方法创建对象的 Bean。 FactoryBean 是指特定于 Spring 的 FactoryBean 接口的实现类。

二、接口预览

  1. public interface FactoryBean<T> {
  2. String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
  3. @Nullable
  4. T getObject() throws Exception;
  5. @Nullable
  6. Class<?> getObjectType();
  7. default boolean isSingleton() {
  8. return true;
  9. }
  10. }

三、应用场景

Mybatis

FactoryBean 通常用来创建更复杂的 Bean。很多开源项目在集成 Spring 时都使用到 FactoryBean ,比如 mybatis-spring 项目的 MapperFactoryBean 。通过根据不同的 Mapper 接口获取对应的代理对象。
SqlSessionFactoryBean 也实现了 FactoryBean

四、源码解析

查看源码,最重要的 API 是 getBean(),所以通过 Debug 这个方法可以查看一些端倪。
先总结这个 API 调用流程,
getbean-beanfactory.png
核心代码如下
FctoryBeanRegistry#getObjectFromFactoryBean.png