当前位置: 首页 > news >正文

Spring、SpringBoot框架核心流程详解

文章目录

      • 一、Spring Bean 的生命周期
        • 核心流程(基于ClassPathXmlApplicationContext或AnnotationConfigApplicationContext)
        • Spring Bean 生命周期业务流程图
      • 二、Spring MVC 请求处理流程
        • 核心流程
        • Spring MVC 请求处理流程图
      • 三、Spring Boot 启动流程
        • 核心流程
        • Spring Boot 启动流程图
      • 四、Spring Boot 自动配置原理
        • 核心原理与流程
        • 自动配置流程图
      • 五、MyBatis执行流程
      • 六、MySQL内部处理流程
      • 总结


由于最近在准备面试,所以也抽时间复习一下。

一、Spring Bean 的生命周期

Spring Bean的生命周期指的是一个Bean从被创建、初始化、使用到最终被销毁的整个过程。这个过程由Spring IoC容器(ApplicationContext)精细管理。理解生命周期是编写高质量Spring应用的关键。

核心流程(基于ClassPathXmlApplicationContext或AnnotationConfigApplicationContext)

一个Bean的完整生命周期包含以下几个关键步骤:

  1. 实例化(Instantiate):容器首先调用Bean的构造函数(或无参构造函数),为Bean在堆上分配内存空间,创建一个原始对象。这类似于Java中的new关键字。
  2. 填充属性(Populate Properties):容器解析并注入Bean所依赖的其他Bean(通过@Autowired, @Resource等注解或XML配置<property>),以及基本类型的属性值。
  3. BeanPostProcessor前置处理:如果容器中存在实现了BeanPostProcessor接口的Bean,则会调用其postProcessBeforeInitialization()方法。这是一个强大的扩展点,可以对Bean进行修改(例如返回一个代理对象)。常见的例子:@Autowired注解的处理就是通过AutowiredAnnotationBeanPostProcessor完成的。
  4. 初始化(Initialization)
    • 调用Aware系列接口的方法:如果Bean实现了各种Aware接口(如BeanNameAware, BeanFactoryAware, ApplicationContextAware),容器会回调相应的方法,将容器本身或Bean的ID等信息注入给Bean。
    • 执行BeanPostProcessorpostProcessBeforeInitialization:(已在第3步执行)
    • 调用自定义初始化方法
      • XML配置:通过init-method属性指定的方法。
      • 注解:在方法上添加@PostConstruct注解。
      • 接口:实现InitializingBean接口,并重写afterPropertiesSet()方法。
    • 执行BeanPostProcessor后置处理:调用BeanPostProcessorpostProcessAfterInitialization()方法。AOP的动态代理就是在这个阶段生成的! 如果Bean被AOP切面增强,这里返回的将是一个代理对象(Proxy),而不是原始的Target对象。
  5. 使用(Ready to Use):此时,Bean已经完成了所有配置和初始化,被放入Singleton Bean缓存池中。当应用程序通过getBean()或依赖注入请求时,容器返回的就是这个完全准备好的Bean。
  6. 销毁(Destruction):当容器被关闭时(例如调用context.close()),对于Singleton作用域的Bean,容器会执行销毁方法:
    • 注解:在方法上添加@PreDestroy注解。
    • 接口:实现DisposableBean接口,并重写destroy()方法。
    • XML配置:通过destroy-method属性指定的方法。

注意:对于prototype作用域的Bean,容器只管理到第5步(初始化完成),之后就将Bean交给客户端,不再管理其生命周期,也不会调用其销毁方法。

Spring Bean 生命周期业务流程图

如下图所示
在这里插入图片描述


二、Spring MVC 请求处理流程

Spring MVC的核心是DispatcherServlet,它作为前端控制器(Front Controller),是所有请求的统一入口,负责协调各组件处理请求。

核心流程
  1. Http Request:用户发起请求,被Web容器(如Tomcat)拦截,匹配到DispatcherServlet的映射路径(如/)。
  2. DispatcherServlet接收请求DispatcherServletservice()方法开始处理请求。
  3. HandlerMapping(处理器映射)DispatcherServlet查询所有的HandlerMapping,根据请求的URL找到对应的Handler(通常是Controller中的方法)和拦截器(Interceptor)。
  4. HandlerAdapter(处理器适配器)DispatcherServlet通过找到的Handler,遍历所有的HandlerAdapter,找到能执行该Handler的适配器(如支持@RequestMapping注解的RequestMappingHandlerAdapter)。
  5. 执行拦截器前置处理:执行InterceptorpreHandle()方法。
  6. 执行HandlerHandlerAdapter调用Handler(即Controller方法)处理请求,执行业务逻辑。在这个过程中,会进行参数绑定、数据验证、调用Service等操作。
  7. 返回ModelAndViewHandler执行完成后,会返回一个ModelAndView对象(或String视图名、@ResponseBody注解的对象等)。
  8. 执行拦截器后置处理:执行InterceptorpostHandle()方法。
  9. 处理视图(View Resolution)DispatcherServlet调用ViewResolver(视图解析器),根据ModelAndView中的视图名解析出真正的View对象(如JSP, Thymeleaf模板等)。
  10. 渲染视图(View Rendering)View对象接收Model中的数据,进行视图渲染,将动态内容输出到响应中。
  11. 执行拦截器完成处理:请求处理完成后,执行InterceptorafterCompletion()方法。
  12. Http Response:将渲染结果返回给客户端。

注意:如果Controller方法使用@ResponseBody@RestController,则第9、10步会替换为:HandlerAdapter通过HttpMessageConverter将返回值(如JSON)直接写入Http响应体,跳过视图解析流程。

Spring MVC 请求处理流程图

如下图所示
在这里插入图片描述

三、Spring Boot 启动流程

Spring Boot通过一个简单的main方法和一个SpringApplication.run()入口,隐藏了大量繁琐的配置和初始化工作。

核心流程
  1. 启动入口:执行SpringApplication.run(Application.class, args)
  2. 初始化SpringApplication实例
    • 推断应用类型(Servlet、Reactive等)。
    • 加载并初始化所有META-INF/spring.factories中配置的ApplicationContextInitializerApplicationListener
    • 推断并设置主配置类(Main Configuration Class)。
  3. 运行SpringApplication
    • 创建并启动计时器:监控启动过程。
    • 配置Headless属性
    • 获取并运行SpringApplicationRunListeners:广播ApplicationStartingEvent事件。
    • 准备环境(Environment):读取配置文件(application.properties/yml)、命令行参数、系统属性等,构建应用运行环境。广播ApplicationEnvironmentPreparedEvent事件。
    • 创建应用上下文(ApplicationContext):根据应用类型(如Servlet)创建对应的ApplicationContext实例(如AnnotationConfigServletWebServerApplicationContext)。
    • 准备上下文
      • 设置环境。
      • 执行ApplicationContextInitializer的初始化方法。
      • 广播ApplicationContextInitializedEvent事件。
      • 核心:将主配置类(@SpringBootApplication标注的类)注册到BeanDefinitionMap中
      • 广播ApplicationPreparedEvent事件。
    • 刷新上下文(Refresh Context)这是最核心的一步,调用了AbstractApplicationContext.refresh()方法。这个过程包含了传统Spring IoC容器启动的所有步骤(Bean定义加载、Bean工厂后置处理器、Bean后置处理器、Bean创建等),同时:
      • 内嵌的Web服务器(如Tomcat)在此阶段被创建并启动。
      • 执行自动配置(@EnableAutoConfiguration的逻辑)。
    • afterRefresh回调:默认为空。
    • 广播ApplicationStartedEvent事件:表示应用已启动完成。
    • 调用CommandLineRunner和ApplicationRunner:执行自定义的启动后任务。
  4. 启动完成:计时器停止,广播ApplicationReadyEvent事件。此时应用已完全就绪,可以处理外部请求。
Spring Boot 启动流程图

如下图所示
在这里插入图片描述


四、Spring Boot 自动配置原理

自动配置是Spring Boot的核心魔法,其目标是“约定大于配置”,通过条件化配置极大减少开发者的手动配置工作。

核心原理与流程
  1. 入口注解:@SpringBootApplication
    这是一个组合注解,包含三个核心注解:

    • @SpringBootConfiguration:表明这是一个配置类。
    • @ComponentScan:组件扫描。
    • @EnableAutoConfiguration开启自动配置的钥匙
  2. @EnableAutoConfiguration 的作用
    该注解导入了AutoConfigurationImportSelector类。

  3. AutoConfigurationImportSelector 的核心逻辑

    • 它的selectImports()方法会调用getAutoConfigurationEntry(),负责加载自动配置类。
    • 该方法通过SpringFactoriesLoader,从META-INF/spring.factories文件中加载所有org.springframework.boot.autoconfigure.EnableAutoConfiguration键对应的配置类的全限定名(一个长长的列表,如org.springframework.boot.autocon.data.redis.RedisAutoConfiguration)。
  4. 自动配置类的条件化装配
    加载到的配置类不会全部生效,它们上面都有大量的条件注解@ConditionalOnXxx),由Spring容器根据当前条件来决定是否装配这个配置类。常见的条件注解有:

    • @ConditionalOnClass:类路径下存在指定的类时才生效。
    • @ConditionalOnBean:容器中存在指定的Bean时才生效。
    • @ConditionalOnMissingBean:容器中不存在指定的Bean时才生效。这是自动配置的核心机制,为我们提供了覆盖自动配置的能力。如果我们自己定义了一个Bean,自动配置提供的Bean就不会被创建。
    • @ConditionalOnProperty:指定的属性有指定的值时才生效。
  5. 自动配置的执行时机
    这些自动配置类本质上是@Configuration配置类,它们会在Spring Boot启动流程的refresh()阶段,由ConfigurationClassPostProcessor这个BeanFactoryPostProcessor进行解析和处理。条件判断逻辑也在此时执行。

  6. 创建Bean
    通过条件判断的配置类会被成功解析,其中通过@Bean定义的Bean就会被加入到BeanDefinitionMap中,并在后续的流程中被实例化,加入到Spring容器中。

自动配置流程图

如下图所示
在这里插入图片描述


五、MyBatis执行流程

MyBatis 的执行流程可以大致分为两大阶段:

  • 初始化阶段:读取配置,构建 SqlSessionFactory。
  • 运行时执行阶段:获取 SqlSession,执行 SQL,返回结果。
    在这里插入图片描述

六、MySQL内部处理流程

  1. 连接阶段 建立连接或使用已有连接
  2. sql解析
  3. sql优化器生成执行计划,选择最优计划,我们explain看到的就是这里的结果
  4. 引擎开始执行sql
    a.数据查找
    b.事务与锁
    c.结果返回

如下图所示
在这里插入图片描述

总结

这四大流程环环相扣,体现了Spring生态系统的设计精髓:

  • Bean生命周期是IoC容器管理组件的基石。
  • Spring MVC流程是Web请求处理的骨架。
  • Spring Boot启动流程是对传统Spring应用繁琐初始化的封装和简化,其核心仍是refresh()
  • 自动配置原理是Spring Boot“开箱即用”特性的实现手段,通过“约定”和“条件化配置”极大地提升了开发效率。
http://www.dtcms.com/a/394104.html

相关文章:

  • 195. Java 异常 - finally 块:Java 中的“兜底侠”
  • C语言底层学习(2.指针与数组的关系与应用)(超详细)
  • 008 Rust注释
  • ubuntu防火墙开放端口
  • ​MySQL 8.0.29 RPM 安装教程(CentOS 7 / RHEL 7 详细步骤)​附安装包
  • AIPPT:AI一键生成高质量PPT
  • [已更新]2025华为杯E题数学建模研赛E题研究生数学建模思路代码文章成品:高速列车轴承智能故障诊断问题
  • 从零到一:Vue3 + Spring Boot + MySQL 全栈项目部署到阿里云服务器完整教程
  • 微服务基础2-网关路由
  • ubuntu创建新用户
  • 黑豹X2(Panther-x2)armbian 驱动NPU/VPU的驱动下载安装
  • 50.Mysql主从复制与读写分离
  • 软件设计师,经典计算题
  • Python的bz2库讲解
  • 抖音2025创作者大会:优质内容播放时长增220%,推出四大计划
  • C++面向对象编程之继承:深入理解与应用实践
  • [Windows] OFD转PDF 1.2.0
  • TDengine 聚合函数 VAR_POP 用户手册
  • 跨域及其解决方法
  • LeetCode:37.二叉树的最大深度
  • 【C++深学日志】C++“类”的完全指南--从基础到实践(一)
  • BUS-消息总线
  • 23种设计模式之【单例模式模式】-核心原理与 Java实践
  • 精度至上,杜绝失真,机器视觉检测中为何常用BMP格式?
  • 关于wireshark流量分析软件brim(Zui)安装方法
  • springboot3.4.1集成pulsar
  • 信息量、熵、KL散度和交叉熵
  • 使用Python一站式提取Word、Excel、PDF 和PPT文档内容v1.0
  • 线性代数 | REF / RREF
  • TLCP的一些内容