Spring系统学习(二)——Spring框架启动流程深入解析

Spring 框架的启动运行流程围绕着依赖注入(DI)和控制反转(IoC)的核心思想,确保应用的各个组件能够有效管理和交互。以下是 Spring 启动的详细流程,涵盖从初始化到 Bean 管理和数据库连接的过程:


1. 启动 Spring 应用

Spring 应用通常从 SpringApplication.run() 方法开始启动。在 Spring Boot 应用中,这个方法会启动 Spring 容器,并触发一系列初始化流程。

public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
}
  • SpringApplication.run() 是 Spring Boot 的入口,它会初始化整个 Spring 上下文,加载配置,并开始扫描 Bean。

2. 创建 ApplicationContext

Spring 核心是 ApplicationContext,它是 IoC 容器的实现,负责加载 Bean 定义、依赖注入和管理应用程序的生命周期。

  • ApplicationContext 的具体实现类型根据应用配置来选择,例如:
    • AnnotationConfigApplicationContext: 通过注解配置的上下文。
    • ClassPathXmlApplicationContext: 基于 XML 配置的上下文。

这个阶段,Spring 会基于配置文件或注解扫描,并加载相应的 Bean 定义到上下文中。


3. 解析配置文件或注解

Spring 根据项目中的配置文件(如 application.propertiesapplication.yml)以及 Java 配置类(如 @Configuration)或 XML 文件,解析并加载应用的配置。

  • 自动配置(Spring Boot 特性):Spring Boot 自动识别 application.propertiesapplication.yml 文件,并将其中的配置(如数据库信息)绑定到相关的组件。
  • 注解扫描:如果应用使用注解方式,Spring 会根据 @ComponentScan 扫描路径,找到标注有 @Component@Service@Repository@Controller 等注解的类,注册为 Bean。

4. 注册和加载 Bean 定义

Spring 会将所有被扫描到的组件(如标记了注解的类或通过 XML 配置的 Bean)注册为 Bean 定义。这个过程是解析 Bean 的类、作用域和依赖关系。

  • Bean 定义:Spring 在这个阶段不会实际创建 Bean 的实例,而是只将 Bean 的定义(类、作用域等)保存在 BeanDefinition 中,等待后续的实例化。

5. 初始化 DataSource 和数据库连接

如果在配置文件中定义了数据库信息(如 spring.datasource.*),Spring 会根据这些配置自动初始化数据库连接池并创建 DataSource Bean。

  • 数据库连接池:Spring Boot 默认使用 HikariCP 连接池来管理数据库连接。DataSource Bean 会根据配置创建并与数据库建立连接。
  • 懒加载:数据库连接通常在第一次实际使用时才会建立,Spring 会在需要时从连接池中获取连接。

6. 依赖注入(Dependency Injection)

Spring 框架的核心功能之一是依赖注入。根据 Bean 定义中的依赖关系,Spring 会通过构造器注入、setter 注入或字段注入将所需的 Bean 注入到目标对象中。

  • 构造器注入:通过构造函数传递依赖。
  • Setter 注入:通过 setter 方法传递依赖。
  • 字段注入:直接使用 @Autowired 注解将依赖注入到类的字段中。

Spring 会确保每个 Bean 的依赖项都能够被正确注入,从而使组件能够协同工作。


7. Bean 实例化与初始化

一旦 Bean 的依赖被解析并注入,Spring 开始实际创建 Bean 的实例。这个阶段包括调用 Bean 的初始化回调方法。

  • @PostConstruct 注解:标记的方法会在 Bean 被完全初始化后调用,用于执行初始化逻辑。
  • InitializingBean 接口:如果 Bean 实现了这个接口,Spring 会调用 afterPropertiesSet() 方法进行初始化。

8. AOP 代理创建(可选)

如果项目中使用了 AOP(面向切面编程),Spring 会在 Bean 初始化后为目标对象创建代理。Spring 通过 JDK 动态代理或 CGLIB 来增强目标 Bean 的方法,提供横切关注点(如事务管理、日志记录等)。

  • 代理对象:Spring 为被切面标记的类生成代理对象,在方法执行前后插入切面逻辑。

9. 生命周期回调

在 Spring 中,Bean 的生命周期不仅限于初始化。Spring 提供了多种机制来管理 Bean 生命周期,包括销毁时的回调。

  • @PreDestroy:在容器关闭时,Spring 会调用被标记为 @PreDestroy 的方法,执行清理工作。
  • DisposableBean 接口:如果 Bean 实现了该接口,Spring 会调用其 destroy() 方法来清理资源。

10. 应用启动完成

所有的 Bean 都已实例化、初始化完毕,并且依赖关系都已正确注入。此时,Spring 会启动 Web 服务(如内嵌的 Tomcat、Jetty 等),并保持应用的运行状态,等待处理请求。


总结

Spring 框架的启动流程是一个有序且模块化的过程,主要包括以下几个步骤:

  1. 启动 Spring 容器:通过 SpringApplication.run() 启动应用,初始化 ApplicationContext
  2. 解析配置文件或注解:加载 application.propertiesapplication.yml 或 Java 配置类,自动扫描并解析 Bean。
  3. 注册 Bean 定义:扫描组件并注册 Bean 定义,但此时不创建实例。
  4. 初始化数据库连接:根据配置文件创建 DataSource Bean,准备与数据库连接。
  5. 依赖注入:为每个 Bean 注入它的依赖。
  6. Bean 实例化与初始化:实例化 Bean,并执行初始化方法。
  7. AOP 代理创建:为目标对象创建 AOP 代理,提供横切关注点。
  8. 生命周期回调:管理 Bean 的销毁和清理工作。
  9. 应用启动完成:所有 Bean 准备完毕,Web 服务启动,应用进入运行状态。

这套流程确保了 Spring 应用的各个组件能够自动管理依赖关系和生命周期,简化了开发流程并增强了代码的可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值