You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中BeanFactory与FactoryBean的区别、执行顺序及相关疑问

Spring中BeanFactory与FactoryBean的核心区别

1. 本质定位完全不同

  • BeanFactory:这是Spring IoC容器的根接口,相当于整个Spring Bean体系的"后台大管家"——所有Bean的定义加载、实例化、依赖注入、销毁全流程都由它管控。你提到的"生成Bean"只是它职责的一部分,它更核心的是管理Bean的生命周期。
  • FactoryBean:它不是容器,而是一种特殊的Bean。别被名字里的"Factory"误导,它不是用来生成工厂的,而是用来自定义单个Bean的创建逻辑。当Spring默认的实例化方式(比如构造器、setter注入)搞不定复杂对象时,你可以实现这个接口,自己写代码控制目标Bean的创建过程。比如要创建一个需要复杂配置的Elasticsearch客户端,直接用@Autowired没法搞定,这时候写个EsClientFactoryBean,在getObject()里写初始化客户端的代码,Spring最终拿到的就是EsClient实例,而不是这个FactoryBean本身。

2. 使用方式天差地别

  • BeanFactory:一般不用你手动创建,Spring启动时会自动初始化它的实现类(比如AnnotationConfigApplicationContext内部就包含了BeanFactory)。你最多是通过context.getBeanFactory()获取容器实例来做一些高级操作。
  • FactoryBean:你得把它本身注册成Spring Bean(比如加@Component注解)。当你调context.getBean("esClientFactory")时,Spring会自动调用它的getObject()返回目标Bean;如果想拿到FactoryBean自己,得在beanId前面加&,也就是getBean("&esClientFactory")。

3. 执行顺序:BeanFactory绝对更早

BeanFactory是Spring启动的基础,它的初始化是Spring启动的第一步——先有容器,才能谈里面的Bean。具体流程是:

  1. Spring启动,先创建BeanFactory实例;
  2. 加载所有Bean的定义(包括FactoryBean的定义);
  3. 当需要用到某个FactoryBean对应的目标Bean时,BeanFactory才会触发FactoryBean的逻辑,生成目标Bean。

所以FactoryBean的执行是在BeanFactory已经完全启动,开始处理Bean实例化的时候才会发生,BeanFactory的初始化远早于FactoryBean的运行。

内容的提问来源于stack exchange,提问作者Jason_Gan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:32:47