一、前言
FactoryBean 是一个接口,为 Spring 容器 实例化 Bean 提供了更灵活的方式。如果某个Bean实现此接口,则它用作对象公开的工厂,而不直接用作将自身暴露的 Bean实例(可以通过&beanName获取FactoryBean本身)。FacotryBean 可以支持 单例 和 原型 作用域,也可以懒加载或在启动时就创建对象。SmartFactory 接口允许公开更细粒度的行为元数据。
若需要在 FactoryBean 中访问其他 Bean ,可以实现 BeanFactoryAware 意识接口。
容器只负责管理 FactoryBean 实例的生命周期,而不负责由 FactoryBean 创建的对象的生命周期。不会回调暴露的 Bean 对象的生命周期方法。相反,FactoryBean 应该实现 DisposableBean 并将任何这样的调用委托给底层对象。
factory bean是指在 Spring 容器中配置并通过实例或静态工厂方法创建对象的 Bean。FactoryBean是指特定于 Spring 的FactoryBean接口的实现类。
二、接口预览
public interface FactoryBean<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass<?> getObjectType();default boolean isSingleton() {return true;}}
三、应用场景
Mybatis
FactoryBean 通常用来创建更复杂的 Bean。很多开源项目在集成 Spring 时都使用到 FactoryBean ,比如 mybatis-spring 项目的 MapperFactoryBean 。通过根据不同的 Mapper 接口获取对应的代理对象。SqlSessionFactoryBean 也实现了 FactoryBean 。
四、源码解析
查看源码,最重要的 API 是 getBean(),所以通过 Debug 这个方法可以查看一些端倪。
先总结这个 API 调用流程,
核心代码如下
