Spring 的装配顺序详解(配置 → 扫描 → 注入 → 初始化)

目录

[一、什么是 Spring 的装配顺序?](#一、什么是 Spring 的装配顺序?)

[二、Spring 容器整体启动 & 装配顺序(先有全局)](#二、Spring 容器整体启动 & 装配顺序(先有全局))

三、详细装配流程解析

[1. 启动 Spring 容器](#1. 启动 Spring 容器)

[2. 加载配置源](#2. 加载配置源)

[3. 扫描组件(@ComponentScan)](#3. 扫描组件(@ComponentScan))

[4. 注册 BeanDefinition(非常关键)](#4. 注册 BeanDefinition(非常关键))

[5. 处理配置类(@Configuration)](#5. 处理配置类(@Configuration))

[6. 实例化 Bean(Instantiation)](#6. 实例化 Bean(Instantiation))

[7. 依赖注入(DI)](#7. 依赖注入(DI))

[8. 初始化 Bean(Initialization)](#8. 初始化 Bean(Initialization))

[9. AOP 代理生成(BeanPostProcessor)](#9. AOP 代理生成(BeanPostProcessor))

[10. 容器就绪(Ready)](#10. 容器就绪(Ready))

[四、装配顺序 vs Bean 生命周期(重点区分)](#四、装配顺序 vs Bean 生命周期(重点区分))

[五、Spring Boot 中的装配顺序](#五、Spring Boot 中的装配顺序)

六、总结


在 Spring 中,"装配(Wiring)"指的是 Spring 如何发现 Bean、创建 Bean、并完成依赖注入的过程 。

理解装配顺序,有助于我们搞清楚 为什么某些 Bean 注入失败、AOP 为什么生效、配置类为什么能生效。

一、什么是 Spring 的装配顺序?

Spring 装配顺序 = Spring 容器启动并准备可用 Bean 的整体流程

  • 装配关注的是"Bean 如何被放进容器并建立关系"
  • 生命周期关注的是"单个 Bean 从生到死"

二、Spring 容器整体启动 & 装配顺序(先有全局)

启动容器

↓

加载配置(XML / JavaConfig / 自动配置)

↓

扫描 Bean(@ComponentScan)

↓

注册 BeanDefinition

↓

处理配置类(@Configuration)

↓

实例化 Bean

↓

依赖注入(DI)

↓

初始化 Bean

↓

AOP 代理生成

↓

容器就绪

这是"装配顺序"的核心主线

三、详细装配流程解析

1. 启动 Spring 容器

java 复制代码
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

容器启动是装配的起点。

2. 加载配置源

Spring 支持多种配置方式:

  • XML(applicationContext.xml)
  • JavaConfig(@Configuration)
  • Spring Boot 自动配置

配置加载顺序早于 Bean 创建

3. 扫描组件(@ComponentScan)

java 复制代码
@ComponentScan("com.example")

Spring 会扫描指定包,识别:

  • @Component
  • @Service
  • @Repository
  • @Controller
  • @Configuration

此时只"登记",不创建对象

4. 注册 BeanDefinition(非常关键)

Spring 会为每个 Bean 创建一个 BeanDefinition:

BeanDefinition = Bean 的"设计图纸"

包含:

  • Bean 的类型
  • 作用域(singleton / prototype)
  • 是否懒加载
  • 依赖关系

装配的本质就是操作 BeanDefinition

5. 处理配置类(@Configuration)

java 复制代码
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

Spring 会:

  • 解析 @Bean
  • 通过 CGLIB 增强配置类
  • 保证 @Bean 方法返回单例

这是 JavaConfig 能生效的核心

6. 实例化 Bean(Instantiation)

Spring 根据 BeanDefinition 创建对象:

  • 构造器
  • 工厂方法
  • FactoryBean

此时对象已存在,但依赖未注入

7. 依赖注入(DI)

Spring 进行依赖装配:

  • @Autowired
  • @Qualifier
  • @Resource
  • 构造器注入

此阶段才是真正的"装配"

8. 初始化 Bean(Initialization)

执行:

  • @PostConstruct
  • InitializingBean
  • init-method

Bean 进入可用状态

9. AOP 代理生成(BeanPostProcessor)

  • 执行 postProcessAfterInitialization
  • 生成代理对象
  • 替换原始 Bean

事务、日志、权限在此生效

10. 容器就绪(Ready)

  • 所有单例 Bean 创建完成
  • 容器可以对外提供服务

四、装配顺序 vs Bean 生命周期(重点区分)

对比项 装配顺序 生命周期
关注点 容器整体流程 单个 Bean
粒度 全局 局部
是否包含扫描 是 否
是否包含 AOP 是 是

五、Spring Boot 中的装配顺序

Spring Boot 在上述基础上多了:

读取 spring.factories

↓

自动配置类加载

↓

条件装配(@Conditional)

自动装配 ≠ 自动注入

六、总结

Spring 的装配顺序是:
启动容器 → 加载配置 → 扫描组件 → 注册 BeanDefinition → 实例化 Bean → 依赖注入 → 初始化 → AOP 代理 → 容器就绪。

Spring 装配顺序的本质,是容器围绕 BeanDefinition 展开的一次"建模 → 实例 → 代理"的过程。

相关推荐
ly76894 分钟前
读懂 PostgreSQL 执行计划:从 EXPLAIN 输出定位 Spring Boot 慢 SQL 的代价估算偏差
spring boot·sql·postgresql·执行计划·explain analyze·慢sql优化
\光辉岁月/5 分钟前
16.JavaSE-反射
java·反射
范什么特西8 分钟前
加深动态代理的理解
java
天天被压力16 分钟前
【Python量化实战宝典 #03】指数与板块行情接口全拆解:大盘·行业·概念一键取(Python 可跑)
java·人工智能·python
\光辉岁月/16 分钟前
14.JavaSE-IOStream
java·io·stream
云和数据.ChenGuang17 分钟前
Spring AI 对接 LangGraph:构建企业级智能体工作流实战
java·人工智能·spring boot·后端·spring
云和数据.ChenGuang21 分钟前
Spring AI 入门实战:构建你的第一个 AI 应用
java·人工智能·深度学习·spring·机器学习·语言模型
下雨天没带伞22 分钟前
Java Stream API实战,告别for循环
java
用户37215742613529 分钟前
Java 高效管理 Excel 批注:添加、读取、修改和删除
java
C语言小火车32 分钟前
C++ 为什么越来越依赖标准库?
java·开发语言·c++