BeanFactory 与 FactoryBean 有啥区别?你还分不清吗?
- 工作日记
- 28天前
- 37热度
- 0评论
在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标准流程
- 解析BeanDefinition元数据
- 执行实例化策略(构造函数/静态工厂)
- 属性注入(@Autowired/@Resource)
- 执行初始化回调(InitializingBean)
- 生成完成态Bean
3.2 FactoryBean特殊流程
当容器检测到某个Bean实现了FactoryBean接口时:
- 正常实例化FactoryBean对象
- 调用getObject()生成目标对象
- 将生成对象注册到容器
- 通过beanName获取的是目标对象
- 通过&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生态中游刃有余地实现各种复杂业务场景。