Spring 容器启动与 Bean 创建流程

Spring 在应用启动时会按照以下步骤管理 Bean 的生命周期:

第一步:扫描与注册 Bean 定义(BeanDefinition)

Spring 启动时,首先扫描指定包路径下的所有类,识别带有 @Component@Service@Repository@Controller 等注解的类,将其解析为 BeanDefinition(包含类信息、作用域、依赖关系等元数据),并注册到 BeanFactory 中。

️ 注意:此时仅完成"图纸"的登记,尚未创建任何 Bean 实例

第二步:按依赖顺序实例化 Bean(递归创建,深度优先)

Spring 并不会一次性对所有 Bean 进行全局排序,而是采用 深度优先、递归创建 的策略:

  1. 从顶层 Bean 开始创建 (如 EmployeeController)。
  2. 在创建过程中,若发现其构造函数依赖其他 Bean(如 EmployeeService),则暂停当前 Bean 的创建,转而去创建所依赖的 Bean。
  3. EmployeeService 又依赖 EmployeeRepository,则继续递归创建 EmployeeRepository
  4. 当某个 Bean 没有依赖或其依赖已存在 时,立即实例化,并将其放入 单例缓存池(singletonObjects)
  5. 依赖创建完成后,返回上层继续完成原 Bean 的实例化。

核心机制

  • 依赖的创建是"按需触发"的,通过 getBean() 方法递归实现。
  • 已创建的 Bean 会被缓存,避免重复创建,保证单例性。
简化流程示例(伪代码):
复制代码
// 1. 扫描并注册所有 Bean 定义
Set<Class<?>> allBeans = scanAllClasses();
registerBeanDefinitions(allBeans);

// 2. 开始创建 Bean(以 Controller 为起点)
// 实际过程是递归的,而非线性排序

// 创建 EmployeeRepository(无依赖)
EmployeeRepository repo = new EmployeeRepository();
singletonPool.put("employeeRepository", repo);

// 创建 EmployeeMapper(无依赖)
EmployeeMapper mapper = new EmployeeMapperImpl();
singletonPool.put("employeeMapper", mapper);

// 创建 EmployeeService(依赖 repo)
EmployeeService service = new EmployeeServiceImpl(repo);
singletonPool.put("employeeService", service);

// 创建 EmployeeController(依赖 service 和 mapper)
EmployeeController controller = new EmployeeController(service, mapper);
singletonPool.put("employeeController", controller);

相关推荐
·薯条大王18 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO21 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆21 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光21 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林21 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu1 天前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官1 天前
Sa-Token和Spring Security对比
java·后端·spring
小当家.1051 天前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计
geminigoth1 天前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring