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

71 次浏览次阅读
没有评论

在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

真人堂

一言一句话
-「
最新文章
Qwen3-32B通过Clawdbot直连Web网关时如何支持WebSocket心跳保活?

Qwen3-32B通过Clawdbot直连Web网关时如何支持WebSocket心跳保活?

Qwen3-32B通过Clawdbot直连Web网关时如何支持WebSocket心跳保活? 你有没有遇到过这样...
Qwen3-32B部署教程里Clawdbot网关支持模型版本灰度发布与AB测试的操作流程是什么?

Qwen3-32B部署教程里Clawdbot网关支持模型版本灰度发布与AB测试的操作流程是什么?

Qwen3-32B部署教程:Clawdbot网关支持模型版本灰度发布与AB测试的操作流程 Qwen3-32B作...
ClawdBot政务应用中公文格式保持、政策术语库与多级审校流程集成该如何实现?

ClawdBot政务应用中公文格式保持、政策术语库与多级审校流程集成该如何实现?

ClawdBot政务应用中公文格式保持、政策术语库与多级审校流程集成该如何实现? 在政务办公数字化转型的浪潮中...
Clawdbot+Qwen3-32B惊艳效果里支持工具调用Tool Calling的真实API集成案例如何落地?

Clawdbot+Qwen3-32B惊艳效果里支持工具调用Tool Calling的真实API集成案例如何落地?

Clawdbot+Qwen3-32B惊艳效果里支持工具调用Tool Calling的真实API集成案例如何落地...
ClawdBot测试用例编写pytest脚本自动化验证多语言翻译正确性的方法有哪些?

ClawdBot测试用例编写pytest脚本自动化验证多语言翻译正确性的方法有哪些?

ClawdBot测试用例编写pytest脚本自动化验证多语言翻译正确性的方法有哪些? 在ClawdBot与Mo...
Clawdbot+Qwen3-32B实战案例如何构建自主可控的Web大模型对话系统?

Clawdbot+Qwen3-32B实战案例如何构建自主可控的Web大模型对话系统?

Clawdbot+Qwen3-32B实战案例:如何构建自主可控的Web大模型对话系统? 在AI落地越来越快的今...
Clawdbot生产环境部署中Qwen3:32B代理网关的Token安全策略与访问审计配置有哪些要点?

Clawdbot生产环境部署中Qwen3:32B代理网关的Token安全策略与访问审计配置有哪些要点?

Clawdbot生产环境部署中Qwen3:32B代理网关的Token安全策略与访问审计配置有哪些要点? 在Cl...
Qwen3-32B开源大模型部署时Clawdbot支持OpenTelemetry分布式追踪配置该如何开启?

Qwen3-32B开源大模型部署时Clawdbot支持OpenTelemetry分布式追踪配置该如何开启?

Qwen3-32B开源大模型部署时Clawdbot支持OpenTelemetry分布式追踪配置该如何开启? Q...
ClawdBot监控集成使用Prometheus+Grafana监控vLLM GPU利用率与QPS的效果如何?

ClawdBot监控集成使用Prometheus+Grafana监控vLLM GPU利用率与QPS的效果如何?

ClawdBot监控集成:Prometheus+Grafana监控vLLM GPU利用率与QPS的效果如何? ...
Clawdbot+Qwen3:32B多场景落地在教育问答、技术文档助手、内部客服中的应用如何?

Clawdbot+Qwen3:32B多场景落地在教育问答、技术文档助手、内部客服中的应用如何?

Clawdbot+Qwen3:32B多场景落地在教育问答、技术文档助手、内部客服中的应用如何? 在AI落地越来...
Clawdbot+Qwen3:32B部署教程中Web网关SSL双向认证安全加固的配置方法是什么?

Clawdbot+Qwen3:32B部署教程中Web网关SSL双向认证安全加固的配置方法是什么?

Clawdbot+Qwen3:32B部署教程:Web网关SSL双向认证安全加固配置方法详解 在本地部署Claw...