Spring技术问询:BeanFactory持有Bean定义,哪个类存实际Bean实例与容器类?
关于Spring BeanFactory的两个核心问题解答
让我来拆解这两个问题,帮你理清Spring容器的核心逻辑:
问题1:哪个类负责持有实际的Bean实例?
首先要明确:BeanFactory的具体实现类(而非接口本身)会同时持有Bean定义和实例。
- 比如最常用的
DefaultListableBeanFactory,它既是BeanDefinitionRegistry的实现(负责存储Bean定义),也内置了缓存结构(比如singletonObjects这个Map)来存储已经初始化完成的单例Bean实例。 - 至于
ApplicationContext(它本身是BeanFactory的子接口),它并不直接持有Bean实例,而是委托内部的BeanFactory实现类来管理。比如AnnotationConfigApplicationContext、ClassPathXmlApplicationContext这些常用的ApplicationContext实现,内部都会封装一个DefaultListableBeanFactory,所有的Bean实例存储、查找操作最终都是交给这个内部的bean工厂来完成的。
简单说:实际持有Bean实例的是DefaultListableBeanFactory这类具体的BeanFactory实现类,ApplicationContext只是在它之上做了扩展(比如添加事件发布、资源加载等功能)。
问题2:BeanFactory根接口对应的具体容器类是哪个?
BeanFactory作为Spring容器的根接口,它有多个实现类,但最核心、最常用的具体实现是DefaultListableBeanFactory:
- 它是Spring容器的"核心引擎",几乎所有的ApplicationContext实现都会把它作为底层的bean管理容器。
- 早期还有
XmlBeanFactory这类实现,但现在已经被标记为过时,推荐使用DefaultListableBeanFactory或者基于它的ApplicationContext实现。 - 如果你需要手动创建一个轻量级的Spring容器,直接实例化
DefaultListableBeanFactory并注册Bean定义是最直接的方式。
内容的提问来源于stack exchange,提问作者saralor
相关产品推荐
相关产品推荐

