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。具体流程是:
- Spring启动,先创建BeanFactory实例;
- 加载所有Bean的定义(包括FactoryBean的定义);
- 当需要用到某个FactoryBean对应的目标Bean时,BeanFactory才会触发FactoryBean的逻辑,生成目标Bean。
所以FactoryBean的执行是在BeanFactory已经完全启动,开始处理Bean实例化的时候才会发生,BeanFactory的初始化远早于FactoryBean的运行。
内容的提问来源于stack exchange,提问作者Jason_Gan
相关产品推荐
相关产品推荐

