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 应用启动的"大脑 + 总指挥"。


五、小结

相关推荐
zs宝来了30 分钟前
Spring Boot 自动配置原理:@EnableAutoConfiguration 的魔法
spring boot·自动配置·源码解析·enableautoconfiguration
计算机学姐3 小时前
基于SpringBoot的咖啡店管理系统【个性化推荐+数据可视化统计+配送信息】
java·vue.js·spring boot·后端·mysql·信息可视化·tomcat
My的梦想已实现3 小时前
关于JAVA Springboot集成支付后打包JAR之后报安全错误的处理
java·spring boot·jar
小江的记录本4 小时前
【注解】常见 Java 注解系统性知识体系总结(附《全方位对比表》+ 思维导图)
java·前端·spring boot·后端·spring·mybatis·web
Mr.45674 小时前
Spring Boot 集成 PostgreSQL 表级备份与恢复实战
java·spring boot·后端·postgresql
白露与泡影4 小时前
探索springboot程序打包docker的最佳方式
spring boot·后端·docker
sthnyph5 小时前
SpringBoot Test详解
spring boot·后端·log4j
brucelee1866 小时前
Spring Boot 测试最佳实践
spring boot·后端·log4j
DROm RAPS7 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
TlYf NTLE8 小时前
Spring Boot spring-boot-maven-plugin 参数配置详解
spring boot·后端·maven