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

61 次浏览次阅读
没有评论

在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生态中游刃有余地实现各种复杂业务场景。

正文完
 0

辉哥

一言一句话
-「
最新文章
🚀 CentOS 7 稳定安装 Docker 部署 searxng(国内可用)

🚀 CentOS 7 稳定安装 Docker 部署 searxng(国内可用)

事例:CentOS 7 (Core)。 ⚠️ 关键问题是: 我们走 CentOS 7 专用 + 阿里云镜像稳定...
TikTok直播能赚钱吗?赚到的美金怎么提现?

TikTok直播能赚钱吗?赚到的美金怎么提现?

TikTok直播能赚钱吗?赚到的美金怎么提现详解(2026最新) TikTok作为全球最火的短视频平台,不仅是...
京东618消费券什么时候发?怎么正确使用?

京东618消费券什么时候发?怎么正确使用?

京东618消费券什么时候发?怎么正确使用? 每年京东618都是全年最值得囤货的购物节点,海量消费券直接让到手价...
淘宝网店可以从哪里购买?平台靠谱吗?

淘宝网店可以从哪里购买?平台靠谱吗?

淘宝网店可以从哪里购买?平台靠谱吗? 在电商时代,越来越多的人希望通过淘宝开店实现创业梦想。但从零开始建店需要...
淘宝全球购店铺如何转让?具体操作步骤是什么?

淘宝全球购店铺如何转让?具体操作步骤是什么?

淘宝全球购店铺如何转让?具体操作步骤是什么? 近年来,跨境电商快速发展,淘宝全球购作为阿里巴巴旗下重要的跨境平...
出售淘宝三钻店铺要什么条件?流程复杂吗?

出售淘宝三钻店铺要什么条件?流程复杂吗?

出售淘宝三钻店铺要什么条件?流程复杂吗? 在电商创业热潮中,很多新手卖家都希望快速起步,避免从零开始漫长的信誉...
2026年淘宝双皇冠店铺怎么转让?两个皇冠靠谱吗?

2026年淘宝双皇冠店铺怎么转让?两个皇冠靠谱吗?

2026年淘宝双皇冠店铺怎么转让?两个皇冠靠谱吗? 2026年,淘宝平台竞争更加激烈,很多新手创业者选择直接接...
淘宝闪购入口在哪里?免单玩法怎么操作?

淘宝闪购入口在哪里?免单玩法怎么操作?

淘宝闪购入口在哪里?免单玩法怎么操作? 淘宝闪购是淘宝App上的一级核心频道,主打限时优惠、品牌好物和快速送达...
2026年1688店铺怎么转让?开一家1688要多少钱?

2026年1688店铺怎么转让?开一家1688要多少钱?

2026年1688店铺怎么转让?开一家1688要多少钱? 在2026年,1688作为阿里巴巴旗下的B2B批发平...
淘宝闪购免单卡和请客卡怎么获得?

淘宝闪购免单卡和请客卡怎么获得?

淘宝闪购免单卡和请客卡怎么获得? 在淘宝购物时,最让人兴奋的莫过于各种省钱福利,尤其是闪购频道的免单卡和请客卡...
2026年淘宝开店必须实名认证吗?在哪里查看认证?

2026年淘宝开店必须实名认证吗?在哪里查看认证?

2026年淘宝开店必须实名认证吗?在哪里查看认证? 2026年想在淘宝开店的卖家越来越多,但很多人对实名认证规...