SpringBoot面试题03-BeanFactory

一、BeanFactory 是什么?

BeanFactory 是 Spring 最核心的容器。

它就像一个 "对象工厂",负责:

  • 创建对象(也就是 Bean)

  • 管理对象

  • 给对象进行依赖注入

你以后听到的 IoC(控制反转),本质就是 BeanFactory 在负责管对象,而不是你 new。


流程:

  1. Spring 启动 → 先把所有 Bean 的配置信息记到菜单里(BeanDefinition)

  2. 真正需要用某个 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 应用启动的"大脑 + 总指挥"。


五、小结

相关推荐
bug菌29 分钟前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端
Lonely丶墨轩1 小时前
用 Vue + Spring Boot + Python 做一个 AI 双人海龟汤游戏:从出题、联机到自动审稿等核心技术设计与实现
spring boot·后端·游戏
她的男孩3 小时前
打印模板草稿能保存,一点发布就报主从关系:我们把校验拆成了两档
java·spring boot·后端
wno7044 小时前
Spring Boot整合Quartz
java·spring boot·后端
萧瑟余晖4 小时前
Spring Boot Actuator监控运维详解
spring boot
vipxieliang6 小时前
ValidX 财务系统发票验证:发票号、税号、金额校验
java·spring boot
天空鸟_时光不老6 小时前
06-给AI流程加一道人工闸门
java·人工智能·spring boot·后端·spring·spring cloud·架构
阿俊-全栈开发7 小时前
LikeShop单商户Java商城如何从容承接高并发流量?
java·开发语言·spring boot·spring·系统架构
天空鸟_时光不老7 小时前
01-我不转Python把AI塞进Java里
java·人工智能·spring boot·后端·spring·spring cloud·架构
SL_staff7 小时前
3分钟零代码配置带审批流的报销单:JVS三引擎可视化串联实战
spring boot·开源·全栈