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

一、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.结果返回

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

七、浏览器发出一个请求经历了那些步骤

流程步骤

1.浏览器解析用户输入的URL,生成一个HTTP格式的请求
2.先根据URL域名从本地的hosts文件查找是否有映射IP,如果没有就将域名发送给电脑配置的DNS进行
域名解析,得到IP地址
3.浏览器通过操作系统将请求通过四层网络协议发送出去
4.途中可能会经过各种路由器、交换机、最终到达服务器
5.服务器收到请求后,根据请求所指定的端口,将请求传递给绑定了该端口的应用程序,比如8080被
tomcat占用了
6.Tomcat接收到请求数据后,按照http协议的格式进行解析,解析得到所要访问的servlet
7.然后servlet来处理这个请求,如果是springmvc中的DispatchServlet,那么则会找到对应的
controller中的方法,并执行该方法得到的结果
8.Tomcat得到响应结果后封装成HTTP响应的格式,并再次通过网络发送给浏览器所在的服务器
9.浏览器所在的服务器拿到结果后再传递给浏览器,浏览器则负责解析并渲染

流程图
在这里插入图片描述

八、TCP的三次连接四次握手

说明:全双工,面向连接的字节流,可靠的面向连接传输服务
标志位:SEQ 表示请求序列号,ACK 表示确认序列号,SYN 表示发起一个新连接,FIN 表示释放一个连接。

三次握手
在建立TCP连接时,需要通过三次握手来建立,过程是如下:

第1次握手建立连接时,客户端向服务器发送 SYN 报文(SEQ=x,SYN=1),并进入 SYN_SENT 状态,等待服务器确认

第2次握手实际上是分两部分来完成的,即 SYN+ACK(请求和确认)报文。
2.1服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1)。
2.2服务器再向客户端发送一个 SYN 包(SEQ=y)建立连接的请求,此时服务器进入 SYN_RECV 状态,
第3次握手,是客户端收到服务器的回复(SYN+ACK 报文)。此时,客户端也要向服务器发送确认包(ACK)。
此包发送完毕客户端和服务器进入 ESTABLISHED 状态,完成 3 次握手

四次链接
在断开TCP连接时,需要通过四次回收来断开,过程是:

1.客户端向服务端发送FIN
2.服务端接收FIN后,向客户端发送ACK,表示我接收到了断开连接的请求,客户端你可以不发数据了,不过服务端这边可能还有数据正在处理
3.服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接
4.客户端收到服务端的FIN,向服务端发送ACK,表示客户端也会断开连接了

总结

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

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

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐