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


五、小结

相关推荐
刘一说3 小时前
深入理解 Spring Boot 中的数据库迁移:Flyway 与 Liquibase 实战指南
数据库·spring boot·oracle
一叶飘零_sweeeet4 小时前
SpringBoot 集成 RabbitMQ
spring boot·rabbitmq·java-rabbitmq
知兀4 小时前
【Spring/SpringBoot】<dependencyManagement> + import 导入能继承父maven项目的所有依赖,类似parent
spring boot·spring·maven
郝开5 小时前
Spring Boot 2.7.18(最终 2.x 系列版本):版本概览;兼容性与支持;升级建议;脚手架工程搭建
java·spring boot·后端
清水6 小时前
Spring Boot企业级开发入门
java·spring boot·后端
Q_Q5110082857 小时前
python+django/flask的校园活动中心场地预约系统
spring boot·python·django·flask·node.js·php
水冗水孚7 小时前
类比前端知识来学习Java的Spring Boot实现MySql的全栈CRUD功能——搭配Svelte+Vite
spring boot·svelte
淘源码d9 小时前
什么是医院随访系统?成熟在用的智慧随访系统源码
java·spring boot·后端·开源·源码·随访系统·随访系统框架
Q_Q19632884759 小时前
python+django/flask基于机器学习的就业岗位推荐系统
spring boot·python·django·flask·node.js·php