obtainFreshBeanFactory 并不创建新容器,而是刷新并获取干净的 BeanFactory 实例:先销毁旧工厂、再创建 DefaultListableBeanFactory、最后配置其基础属性与后处理器,为后续 Bean 加载准备环境。

obtainFreshBeanFactory 并不真正“创建”容器,而是**刷新并获取已存在的 BeanFactory 实例**,核心是为后续 Bean 加载和依赖注入准备一个干净、可配置的工厂环境。
它实际做了三件事
-
关闭旧工厂(如果存在):调用
destroyBeans()清理已创建的单例 Bean,再调用closeBeanFactory()释放旧的BeanFactory引用(比如之前 refresh 失败留下的残留) -
创建新工厂:通过
createBeanFactory()实例化一个新的DefaultListableBeanFactory(Spring 默认的 BeanFactory 实现),并设置其序列化 ID、是否允许循环引用等基础属性 -
配置新工厂:调用
configureBeanFactory(beanFactory)注入类加载器、表达式解析器、类型转换服务、临时作用域(如 request/session)、以及关键的beanPostProcessors(如ApplicationContextAwareProcessor)
为什么叫 “obtainFresh” 而不是 “create”?
因为该方法语义上强调“获取一个崭新的、未污染的工厂”,而非从零构造。它确保每次 refresh() 都基于干净的 BeanFactory 重新加载配置、注册 Bean 定义、完成依赖注入 —— 这是 Spring 应用上下文重启或热重载的基础机制。
注意:Bean 定义还没加载进来
此时工厂是空的,obtainFreshBeanFactory 只负责准备好工厂本身;真正的 XML/JavaConfig 解析、@Bean 扫描、BeanDefinition 注册,是在后续的 loadBeanDefinitions(beanFactory) 中完成的。
典型调用链
AbstractApplicationContext.refresh() → obtainFreshBeanFactory() → createBeanFactory() + configureBeanFactory()


















