一、前言

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