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

相关推荐
xiaolyuh1235 小时前
Spring MVC 深度解析
java·spring·mvc
-凌凌漆-5 小时前
【java】java中函数加与不加abstract 的区别
java·开发语言
❀͜͡傀儡师5 小时前
SpringBoot与Artemis整合,实现航空行李追踪消息中枢系统
java·spring boot·后端
青云交5 小时前
Java 大视界 -- Java 大数据在智能交通高速公路收费系统优化与通行效率提升实战
java
哪里不会点哪里.5 小时前
IoC(控制反转)详解:Spring 的核心思想
java·spring·rpc
麦兜*5 小时前
SpringBoot Actuator监控端点详解,打造生产级应用健康检查
java·spring boot·后端
悟能不能悟5 小时前
Spring Boot 中处理跨域资源
java·spring boot·后端
qq_12498707535 小时前
基于springboot+vue的无人机共享管理系统(源码+论文+部署+安装)
java·vue.js·spring boot·后端·毕业设计·无人机·计算机毕业设计
多多*5 小时前
计算机网络相关 讲一下rpc与传统http的区别
java·开发语言·网络·jvm·c#