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 展开的一次"建模 → 实例 → 代理"的过程。

相关推荐
枷锁—sha19 分钟前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
Maynor99622 分钟前
OpenClaw 玩家必备:用 AI 自动追踪社区最新动态
java·服务器·人工智能
堕27427 分钟前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
亓才孓41 分钟前
[Class的应用]获取类的信息
java·开发语言
开开心心就好1 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
80530单词突击赢1 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法1 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
云姜.2 小时前
线程和进程的关系
java·linux·jvm
是码龙不是码农2 小时前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧2 小时前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言