一、BeanFactory 是什么?
BeanFactory 是 Spring 最核心的容器。
它就像一个 "对象工厂",负责:
-
创建对象(也就是 Bean)
-
管理对象
-
给对象进行依赖注入
你以后听到的 IoC(控制反转),本质就是 BeanFactory 在负责管对象,而不是你 new。
流程:
-
Spring 启动 → 先把所有 Bean 的配置信息记到菜单里(BeanDefinition)
-
真正需要用某个 Bean 的时候 → 由 BeanFactory 创建对象并交给你
你不再 new,由 BeanFactory 来 new。
这就是 IoC。
二、为什么它叫 Factory(工厂)?
因为它做两件事:
| 方法 | 含义 |
|---|---|
| 存 Bean | 把对象保存好 |
| 取 Bean | 调用 getBean() 拿对象 |
实际核心方法:
java
Object getBean(String name);
你只要要,它就能给你。
2-1、简单代码理解
如果你自己不用 Spring,你会这样写:
java
UserService userService = new UserService();
但是用了 Spring:
java
ApplicationContext context = ...
UserService userService = context.getBean(UserService.class);
这里 getBean() 就是 BeanFactory 的本质能力。
差别就在:谁负责 new?你还是Spring?
Spring 负责 → 这就叫 IoC。
三、BeanFactory 和 ApplicationContext 的关系
| 容器 | 包含谁 | 谁更高级? |
|---|---|---|
| BeanFactory | 负责 创建和管理 Bean | 基础能力 |
| ApplicationContext | = BeanFactory + 额外功能 | ✅ 更高级 |
ApplicationContext 比 BeanFactory 多:
✅ AOP 自动代理
✅ 国际化(i18n)
✅ 事件发布 / 监听机制
✅ 自动装配
✅ Web 环境支持
所以我们平常写:
java
@SpringBootApplication
public class App {}
默认用的是 ApplicationContext ,因为它功能更完整。
但底层它还是用 BeanFactory 来创建 Bean。
总结
BeanFactory 是 Spring 的对象管理工厂,负责创建、存放和提供 Bean,是 Spring IoC 的核心。
ApplicationContext 是在 BeanFactory 的基础上增强了更多功能。
"Bean 定义已加载,但 Bean 还未实例化"= BeanFactory 已经记录要创建哪些对象,但还没 new。
四、BeanFactory的常用方法
4-1、常用方法

4-2、两个常用的实现类
1、DefaultListableBeanFactory

DefaultListableBeanFactory = Spring 默认使用的 BeanFactory 实现类,是 Spring IoC 容器真正干活的"底层发动机"。
换句话说:
-
BeanFactory 是概念 / 接口(定义"能做什么")
-
DefaultListableBeanFactory 是具体实现("真正做事情的类")
| 名称 | 是什么 | 举例说明 |
|---|---|---|
| BeanFactory | 接口 | 菜单说"要做菜" |
| ApplicationContext | 高级容器(用来提供更多功能) | 餐厅前台负责接单、上菜、服务 |
| DefaultListableBeanFactory | ApplicationContext 里面真正的 底层 Bean 工厂 | 厨房真正负责炒菜的人 |
所以真正 "new Bean、装配依赖、做 AOP 代理" 的,是 DefaultListableBeanFactory。
DefaultListableBeanFactory做三件核心大事:
| 能力 | 解释 | 为什么重要 |
|---|---|---|
| ① 存 Bean 定义 | 把所有 Bean 的信息存起来 | 决定 Spring 要创建哪些 Bean |
| ② 创建和管理 Bean | 真正执行 new、依赖注入、生命周期回调 |
就是 IoC 的核心功能 |
| ③ 负责依赖注入(DI) | 谁依赖谁,自动装配 | 没它,你就只能自己手写 new 和注入 |
没有 DefaultListableBeanFactory,Spring 就没办法自动 new 对象,也没办法做依赖注入。
真实结构:
java
ApplicationContext
↓ 调用
DefaultListableBeanFactory (真正执行创建 Bean)
↓
AbstractAutowireCapableBeanFactory (负责依赖注入)
↓
InstantiationStrategy (负责构造对象,用反射或 CGLIB)
也就是说:
| 事情 | 真正执行者 |
|---|---|
| 加载 Bean 定义 | DefaultListableBeanFactory |
| 实例化 Bean(反射 new) | InstantiationStrategy |
| 给 Bean 注入属性 | AbstractAutowireCapableBeanFactory |
| AOP 代理 | BeanPostProcessor |
最顶层的总调度者就是 DefaultListableBeanFactory。
2、AnnotationConfigServletWebServerApplicationContext

看起来名字很长,但它其实就做 一件事:
它是 Spring Boot 在 Web 项目中真正使用的 ApplicationContext(应用上下文/容器)。
先对比你已经理解的概念
| 名称 | 角色 | 地位 |
|---|---|---|
| BeanFactory | 创造 Bean 的底层工厂 | 最底层 |
| DefaultListableBeanFactory | BeanFactory 的默认实现 | 真正干活 |
| ApplicationContext | 包装 + 提供更多功能的容器 | 高层入口 |
| AnnotationConfigApplicationContext | 用注解方式加载 Bean 的应用上下文(非 Web 环境) | 桌面/命令行项目用 |
| AnnotationConfigServletWebServerApplicationContext | Web 环境用的 ApplicationContext(Spring Boot 默认用它) | 现在的这个 |
1)一句话说明它的重要性
AnnotationConfigServletWebServerApplicationContext = Spring Boot Web 应用的"总大脑"。
只要你是:
java
@SpringBootApplication
public class MyApp {
public static void main(String[] args){
SpringApplication.run(MyApp.class, args);
}
}
那么 Spring Boot 就会用它作为容器。
2)它比普通 ApplicationContext 多了什么?
| 能力 | 是否具备? | 描述 |
|---|---|---|
| 加载 @Configuration / @ComponentScan | ✅ | 解析注解注册 Bean |
| 支持依赖注入 IoC | ✅ | 和普通 ApplicationContext 一样 |
| 管理容器生命周期事件 | ✅ | Ready、Start、Failed 事件 |
| 启动 Web 服务器(Tomcat/Jetty/Undertow) | ✅✅✅ | 核心! |
| 注册 DispatcherServlet (Spring MVC) | ✅ | 支持 @Controller/@RestController 运行 |
所以 没有它,Spring Boot Web 就跑不起来。
3)总结
| 容器 | 适用场景 | 举例 |
|---|---|---|
AnnotationConfigApplicationContext |
非 Web 项目 | 消息消费者、小工具脚本、定时任务程序 |
AnnotationConfigServletWebServerApplicationContext |
✅ Web 项目(现在写的多数都是这个) | API 服务、后台系统、前后端分离服务 |
4)它和 DefaultListableBeanFactory 的关系是什么?
结构如下:
AnnotationConfigServletWebServerApplicationContext
↓ 内部封装/持有
DefaultListableBeanFactory
↓ 调用
创建 Bean、依赖注入、AOP处理、生命周期管理
也就是:
它是"外壳 + 调度者",真正干活的仍然是 DefaultListableBeanFactory。

最终,你只要记住这句话:
AnnotationConfigServletWebServerApplicationContext
= Spring Boot Web 项目的 ApplicationContext
= 会自动启动 Web 服务器并加载所有 Bean
它是 Spring Boot Web 应用启动的"大脑 + 总指挥"。
五、小结
