BeanFactory 与 FactoryBean 有啥区别?你还分不清吗?

在Spring框架的进阶学习路上,90%的开发者都曾掉进过这个命名陷阱:BeanFactory和FactoryBean两个高度相似的名称,却代表着完全不同的设计理念。就像「雷峰塔」与「雷锋」的差异,这两个概念虽仅一字之差,却在Spring生态中扮演着截然不同的角色。理解它们的本质区别,是掌握Spring核心机制的重要里程碑。

一、基础概念解码

1.1 BeanFactory(Bean工厂)

本质:Spring框架的基石容器
作为IoC容器的最基础实现,它就像标准化的工厂流水线,负责:
统一管理Bean的创建(createBean)
处理依赖注入(populateBean)
维护Bean的完整生命周期(initializeBean)
支持各种作用域(singleton/prototype)

1.2 FactoryBean(工厂Bean)

本质:特殊的生产模具
这是一个可插拔的Bean构造器接口,当常规实例化方式无法满足需求时,开发者可以通过实现该接口:
定制复杂对象的创建逻辑(如MyBatis的SqlSessionFactory)
控制Bean的初始化过程
实现动态代理等高级特性

二、核心差异对比表

对比维度 BeanFactory FactoryBean
角色定位 容器管理者 被管理的组件
接口类型 顶级容器接口 可扩展的功能接口
创建目标 所有Spring Bean 特定复杂对象
获取方式 直接通过getBean() 需要添加&前缀获取工厂本身
使用场景 基础容器功能 扩展第三方集成

三、工作流程深度解析

3.1 BeanFactory标准流程

  1. 解析BeanDefinition元数据
  2. 执行实例化策略(构造函数/静态工厂)
  3. 属性注入(@Autowired/@Resource)
  4. 执行初始化回调(InitializingBean)
  5. 生成完成态Bean

3.2 FactoryBean特殊流程

当容器检测到某个Bean实现了FactoryBean接口时:

  1. 正常实例化FactoryBean对象
  2. 调用getObject()生成目标对象
  3. 将生成对象注册到容器
  4. 通过beanName获取的是目标对象
  5. 通过&beanName获取工厂实例

四、经典应用场景

4.1 BeanFactory的典型应用

配置中心场景:
```java
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions("classpath:application-context.xml");
```

4.2 FactoryBean的实战案例

MyBatis整合实现:
```java
public class SqlSessionFactoryBean implements FactoryBean {
private DataSource dataSource;

public SqlSessionFactory getObject() {
return new SqlSessionFactoryBuilder().build(configuration);
}

public Class getObjectType() {
return SqlSessionFactory.class;
}
}
```

五、常见误区澄清

5.1 命名误导陷阱

错误理解:认为FactoryBean是BeanFactory的扩展实现
正确认知:FactoryBean本身也是被BeanFactory管理的普通Bean

5.2 代理模式混淆

虽然FactoryBean常用于生成代理对象,但其本质是对象工厂模式
与AOP的JDK动态代理/CGLIB代理属于不同层级的概念

六、高手选择策略

6.1 何时选择BeanFactory

需要轻量级容器时(相比ApplicationContext节省约20%内存)
需要精确控制Bean初始化流程时
嵌入式系统等资源敏感场景

6.2 何时实现FactoryBean

整合第三方框架需要特殊初始化时
创建过程需要复杂参数配置的对象
需要延迟初始化或条件化创建时

关键记忆点:BeanFactory是管理Bean的工厂,而FactoryBean是生产Bean的工厂。前者是Spring容器的地基,后者是扩展定制的工具包。就像餐厅后厨(BeanFactory)与特色菜品定制服务(FactoryBean)的关系,二者协同完成从原料到成品的转化。掌握这一区别,将帮助开发者在Spring生态中游刃有余地实现各种复杂业务场景。