defaultlistablebeanfactory 是 spring ioc 容器核心,通过 beandefinitionmap、三级缓存(singletonobjects/earlysingletonobjects/singletonfactories)、registeredsingletons/disposablebeans 三类结构及闭环流程统一管理 bean 全生命周期。

DefaultListableBeanFactory 是 Spring IoC 容器真正的“内核”,它不是包装层、不是接口,而是承担对象注册、定义解析、实例化、依赖注入、生命周期调度和缓存管理的统一执行体。它把原本散落在各处的对象创建逻辑,收束到一个可配置、可扩展、可追踪的中心结构中。
DefaultListableBeanFactory 怎么做到统一管理
它靠三类核心数据结构 + 一套闭环流程,把“定义—注册—创建—使用—销毁”全部串起来:
beanDefinitionMap(定义中心)
类型是Map<string beandefinition></string>,所有 Bean 的元信息——类名、作用域(singleton/prototype)、是否懒加载、构造参数、属性值、依赖列表、初始化方法等——都以BeanDefinition形式存在这里。
这意味着:无论你用 XML、@Bean、@Component还是函数式注册,最终都会被转换成BeanDefinition,塞进这个 Map。统一入口,统一格式。-
singletonObjects/earlySingletonObjects/singletonFactories(三级缓存)
继承自DefaultSingletonBeanRegistry,这三张 Map 构成解决循环依赖的关键机制:-
singletonObjects存完全初始化好的单例 Bean; -
earlySingletonObjects存提前暴露的半成品(仅调用过构造器,未设属性、未走后置处理器); -
singletonFactories存 ObjectFactory,用于按需生成早期引用。
所有单例 Bean 的生命周期状态,都在这三张表之间流转,不依赖外部协调。
-
registeredSingletons+disposableBeans(生命周期锚点)registeredSingletons记录已注册的单例名,保证重复注册被拦截;disposableBeans存DisposableBean或含destroy-method的 Bean 引用,确保容器关闭时能有序销毁。
它如何接管整个 Bean 生命周期
当你调用 getBean("xxx"),DefaultListableBeanFactory 就启动一套标准流水线:
- 先查
singletonObjects—— 已存在?直接返回; - 否则检查是否正在创建中(防递归);
- 若是 singleton,先用
singletonFactories创建早期引用,放入earlySingletonObjects; - 然后真正创建 Bean:推断构造器 → 实例化 → 填充属性(
@Autowired在此发生)→ 调用Aware回调 → 执行BeanPostProcessor.postProcessBeforeInitialization→ 调用InitializingBean.afterPropertiesSet/init-method→ 执行BeanPostProcessor.postProcessAfterInitialization; - 最后将完成体放入
singletonObjects,并从早期缓存中移除。
整个过程不依赖 ApplicationContext,也不需要注解扫描器——只要你手动注册了 BeanDefinition,它就能跑通。
怎么用它做定制化管理(轻量级场景)
它本身不绑定 Spring Boot 或 XML,可独立使用:
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// 注册一个 BeanDefinition(比如通过 GenericBeanDefinition)
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setBeanClass(UserService.class);
bd.setScope(ConfigurableBeanFactory.SCOPE_SINGLETON);
factory.registerBeanDefinition("userService", bd);
// 注册一个 BeanPostProcessor(如日志增强)
factory.addBeanPostProcessor(new InstantiationAwareBeanPostProcessorAdapter() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("Bean 初始化完成: " + beanName);
return bean;
}
});
// 获取实例
UserService service = factory.getBean("userService", UserService.class);
你还可以:
- 用
registerAlias("userService", "service")统一别名; - 用
factory.preInstantiateSingletons()主动触发单例预热; - 用
factory.getBeanNamesForType(...)按类型批量查 Bean; - 把它作为
GenericApplicationContext的底层 delegate,获得 ApplicationContext 的扩展能力,同时保留对底层的控制权。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











