Spring 是一个庞大的技术生态很难用一个“大图”描述清全部流程。下面我将 Spring 的核心模块拆解开来为你逐一梳理它们的执行流程。 Spring MVC处理 HTTP 请求的核心流程Spring MVC 的核心是DispatcherServlet前端控制器它负责接收请求并委派给相应的组件处理。整个流程大致可以分为找路 → 适配 → 执行 → 返回 → 解析 → 渲染 → 响应这几步。为了更直观地理解我们来看一个流程图这个流程图展示了 Spring MVC 处理一个请求的完整路径。下面我们结合步骤进一步拆解1. 找路阶段步骤1接收请求客户端发起 HTTP 请求Tomcat 接收后将其交给DispatcherServlet。步骤2查找处理器DispatcherServlet询问HandlerMapping寻找能处理该请求的Controller。HandlerMapping会通过RequestMapping注解或配置等方式进行匹配并返回HandlerExecutionChain处理器和拦截器列表。步骤3适配处理器DispatcherServlet将找到的Handler交给HandlerAdapter。HandlerAdapter负责适配不同类型的 Handler如注解式Controller、实现Controller接口的类等。2. 执行阶段步骤4参数处理并执行业务RequestMappingHandlerAdapter最常用的HandlerAdapter进行参数绑定、数据转换、数据校验等工作然后通过反射调用Controller的目标方法真正执行业务逻辑。3. 响应阶段步骤5返回 ModelAndViewController方法执行完毕后会返回ModelAndView对象包含逻辑视图名称和模型数据或者通过ResponseBody直接返回数据如 JSON。步骤6解析视图DispatcherServlet根据ModelAndView中的逻辑视图名请求ViewResolver将逻辑视图名解析为真正的View视图对象如 JSP, Thymeleaf 等。步骤7渲染并响应DispatcherServlet使用View对象进行视图渲染最终将响应结果返回给客户端。 Spring Boot从 main 方法到应用启动一个 Spring Boot 应用的启动核心就是SpringApplication.run()方法的执行其流程大致如下具体来说整个启动过程主要分这几个阶段第一阶段创建 SpringApplication 对象main方法调用SpringApplication.run首先会创建一个SpringApplication实例。在它的构造方法中会完成一些初始化工作推断应用类型如是否为 Web 项目、加载ApplicationContextInitializer和ApplicationListener。第二阶段执行 run() 方法这是启动的核心主要逻辑包括启动监听器创建StopWatch开始计时并通过SpringApplicationRunListeners发布ApplicationStartingEvent事件通知所有监听器应用已开始启动。环境准备创建ConfigurableEnvironment加载系统属性、环境变量和应用配置文件application.properties或application.yml并发布ApplicationEnvironmentPreparedEvent。打印 Banner打印 Spring Boot 的启动图案可在banner.txt中自定义。创建上下文根据应用类型如 Web 应用或非 Web 应用创建对应的ApplicationContext实例。对于 Web 应用通常是AnnotationConfigServletWebServerApplicationContext。准备上下文将Environment等组件设置到上下文中并执行所有ApplicationContextInitializer然后发布ApplicationContextInitializedEvent。刷新上下文调用context.refresh()这是整个启动流程的核心负责加载所有 BeanDefinition、执行BeanFactoryPostProcessor、注册BeanPostProcessor、创建单例 Bean 并启动内嵌的 Web 服务器如 Tomcat。执行 Runners在容器刷新完成后执行所有实现了ApplicationRunner或CommandLineRunner接口的 Bean用于执行一些初始化逻辑。第三阶段启动完成最后发布ApplicationReadyEvent事件标志应用已经完全启动可以对外提供服务。 Spring IoC 容器Bean 的生命周期Spring IoC 容器的核心是管理 Bean 的生命周期主要阶段包括实例化 → 属性赋值 → 初始化 → 销毁这里还有一些关键节点值得深入理解加载配置Spring 容器通过BeanDefinitionReader读取 XML、注解或 Java 配置类生成BeanDefinition元数据。实例化通过反射创建 Bean 的实例。属性赋值依赖注入根据BeanDefinition中的信息通过 Setter 方法或构造器等方式进行依赖注入。初始化Bean 完全创建后会调用一系列初始化方法。Aware 接口回调如果 Bean 实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware等接口Spring 会调用其setXXX方法让 Bean 获取容器中的特定资源。BeanPostProcessor 前置处理在 Bean 的初始化方法执行前会调用所有注册的BeanPostProcessor的postProcessBeforeInitialization方法。AOP 的代理就是在这里创建的。自定义初始化执行使用PostConstruct注解的方法或实现InitializingBean接口的afterPropertiesSet方法。BeanPostProcessor 后置处理在初始化方法执行后会调用postProcessAfterInitialization方法。使用Bean 初始化完成后会被存入单例池singletonObjects供应用程序使用。销毁当容器关闭时会调用使用PreDestroy注解的方法或实现DisposableBean接口的destroy方法。️ Spring Security请求的安全过滤链Spring Security 的核心是一个过滤器链在请求到达DispatcherServlet之前进行安全拦截其完整流程如下整个流程通常被划分为认证和授权两个阶段认证阶段 (你是谁)用户请求进来后首先进入一系列安全过滤器如UsernamePasswordAuthenticationFilter。过滤器会从请求中提取用户名和密码等信息然后调用AuthenticationManager进行认证而AuthenticationManager会使用UserDetailsService加载用户信息并比对密码。认证成功后用户信息会被存入SecurityContextHolder。如果认证失败请求流程在此中断并返回失败信息给客户端。授权阶段 (你能做什么)认证成功后请求会进入授权相关过滤器如FilterSecurityInterceptor它会根据请求的 URL 等信息调用AccessDecisionManager进行授权决策。如果授权成功请求会被转发给Controller执行业务逻辑如果授权失败则返回AccessDeniedException或 403 状态码。 Spring Data JPA简化数据库操作Spring Data JPA 通过动态代理和规范命名的方式极大地简化了数据库访问。当调用 Repository 接口方法时其流程如下获取代理对象应用程序调用 Repository 接口的方法时实际调用的是由 Spring Data JPA 在运行时通过JdkDynamicAopProxy生成的动态代理对象。解析方法代理对象会拦截方法调用根据方法命名规范如findByLastName解析出查询意图或者识别出是自定义的Query查询。创建查询PartTreeJpaQuery会根据解析出的查询条件生成相应的 JPAQuery对象。委托给 JPA 实现最终SimpleJpaRepository封装了标准的 JPA 操作它会调用底层的 JPA 实现如 Hibernate来执行实际的数据库操作。✂️ Spring AOP横切逻辑的织入Spring AOP 的核心是在 Bean 的生命周期中通过动态代理在目标方法执行时织入切面逻辑。其触发和执行的流程如下代理创建发生在 Bean 的初始化阶段当一个 Bean 被实例化并完成依赖注入后在初始化阶段Spring AOP 会通过BeanPostProcessor的后置处理方法postProcessAfterInitialization来检查该 Bean 是否匹配某个切点Pointcut。如果匹配Spring 就会为该 Bean 创建一个代理对象JDK 动态代理或 CGLIB 代理而不是直接返回原始 Bean 对象。方法调用与拦截器链当从容器中获取到代理对象并调用其目标方法时代理对象会拦截调用并执行一条“拦截器链MethodInterceptor Chain”。这条链的顺序遵循“后进先出”的栈式调用结构执行顺序取决于切入类型AspectJ 风格下AroundBeforeAfterAfterReturning/AfterThrowing。️ Spring 事务管理声明式事务的实现原理Spring 声明式事务Transactional的实现本质上也是建立在 AOP 的基石之上的。流程是这样的代理对象当一个 Bean 带有Transactional注解时Spring 会为其创建一个代理对象。事务增强当调用代理对象中的方法时TransactionInterceptor事务拦截器会在目标方法执行前根据Transactional注解配置的事务传播行为Propagation等属性通过PlatformTransactionManager获取并开启一个事务。方法执行目标方法执行。提交或回滚TransactionInterceptor会根据目标方法的执行结果来决定事务的提交或回滚。如果方法正常执行完毕则提交事务如果方法抛出未捕获的异常且符合事务回滚规则默认是RuntimeException和Error则回滚事务。☁️ Spring Cloud 微服务一个请求的流转路径在微服务架构中一个外部请求的处理流程通常如下请求进入请求首先到达API 网关如 Spring Cloud Gateway它是所有外部请求的统一入口。认证鉴权网关将请求转发到认证中心进行身份认证和权限校验。服务发现认证通过后网关会向服务注册中心如 Nacos、Eureka查询目标服务如“业务微服务A”的可用实例地址列表。路由与调用网关通过负载均衡组件如 Ribbon选择一个服务实例将请求路由过去。业务处理“业务微服务A”处理请求。处理过程中如果需要调用“业务微服务B”则会通过Feign等声明式 HTTP 客户端发起调用。结果返回调用结果沿着调用链原路返回最终由网关响应给客户端。 总结Spring MVC的请求处理是围绕DispatcherServlet的找路 → 适配 → 执行 → 返回 → 解析 → 渲染 → 响应九步曲。Spring Boot的启动是从main方法开始创建SpringApplication并执行run方法最终创建并刷新 IoC 容器、启动内嵌 Web 服务器。Spring IoC的核心是Bean 的完整生命周期管理并通过BeanPostProcessor和BeanFactoryPostProcessor提供扩展点。Spring Security通过一系列安全过滤器链在请求到达 Controller 前完成认证和授权两个核心阶段。Spring AOP通过动态代理织入切面逻辑Spring 声明式事务正是其核心应用。Spring Data JPA通过动态代理和方法命名规范简化了数据访问。在Spring Cloud微服务架构中外部请求一般通过API 网关路由结合服务注册与发现、负载均衡等组件完成跨服务的调用。
Spring生态启动过程
发布时间:2026/5/26 15:10:06
Spring 是一个庞大的技术生态很难用一个“大图”描述清全部流程。下面我将 Spring 的核心模块拆解开来为你逐一梳理它们的执行流程。 Spring MVC处理 HTTP 请求的核心流程Spring MVC 的核心是DispatcherServlet前端控制器它负责接收请求并委派给相应的组件处理。整个流程大致可以分为找路 → 适配 → 执行 → 返回 → 解析 → 渲染 → 响应这几步。为了更直观地理解我们来看一个流程图这个流程图展示了 Spring MVC 处理一个请求的完整路径。下面我们结合步骤进一步拆解1. 找路阶段步骤1接收请求客户端发起 HTTP 请求Tomcat 接收后将其交给DispatcherServlet。步骤2查找处理器DispatcherServlet询问HandlerMapping寻找能处理该请求的Controller。HandlerMapping会通过RequestMapping注解或配置等方式进行匹配并返回HandlerExecutionChain处理器和拦截器列表。步骤3适配处理器DispatcherServlet将找到的Handler交给HandlerAdapter。HandlerAdapter负责适配不同类型的 Handler如注解式Controller、实现Controller接口的类等。2. 执行阶段步骤4参数处理并执行业务RequestMappingHandlerAdapter最常用的HandlerAdapter进行参数绑定、数据转换、数据校验等工作然后通过反射调用Controller的目标方法真正执行业务逻辑。3. 响应阶段步骤5返回 ModelAndViewController方法执行完毕后会返回ModelAndView对象包含逻辑视图名称和模型数据或者通过ResponseBody直接返回数据如 JSON。步骤6解析视图DispatcherServlet根据ModelAndView中的逻辑视图名请求ViewResolver将逻辑视图名解析为真正的View视图对象如 JSP, Thymeleaf 等。步骤7渲染并响应DispatcherServlet使用View对象进行视图渲染最终将响应结果返回给客户端。 Spring Boot从 main 方法到应用启动一个 Spring Boot 应用的启动核心就是SpringApplication.run()方法的执行其流程大致如下具体来说整个启动过程主要分这几个阶段第一阶段创建 SpringApplication 对象main方法调用SpringApplication.run首先会创建一个SpringApplication实例。在它的构造方法中会完成一些初始化工作推断应用类型如是否为 Web 项目、加载ApplicationContextInitializer和ApplicationListener。第二阶段执行 run() 方法这是启动的核心主要逻辑包括启动监听器创建StopWatch开始计时并通过SpringApplicationRunListeners发布ApplicationStartingEvent事件通知所有监听器应用已开始启动。环境准备创建ConfigurableEnvironment加载系统属性、环境变量和应用配置文件application.properties或application.yml并发布ApplicationEnvironmentPreparedEvent。打印 Banner打印 Spring Boot 的启动图案可在banner.txt中自定义。创建上下文根据应用类型如 Web 应用或非 Web 应用创建对应的ApplicationContext实例。对于 Web 应用通常是AnnotationConfigServletWebServerApplicationContext。准备上下文将Environment等组件设置到上下文中并执行所有ApplicationContextInitializer然后发布ApplicationContextInitializedEvent。刷新上下文调用context.refresh()这是整个启动流程的核心负责加载所有 BeanDefinition、执行BeanFactoryPostProcessor、注册BeanPostProcessor、创建单例 Bean 并启动内嵌的 Web 服务器如 Tomcat。执行 Runners在容器刷新完成后执行所有实现了ApplicationRunner或CommandLineRunner接口的 Bean用于执行一些初始化逻辑。第三阶段启动完成最后发布ApplicationReadyEvent事件标志应用已经完全启动可以对外提供服务。 Spring IoC 容器Bean 的生命周期Spring IoC 容器的核心是管理 Bean 的生命周期主要阶段包括实例化 → 属性赋值 → 初始化 → 销毁这里还有一些关键节点值得深入理解加载配置Spring 容器通过BeanDefinitionReader读取 XML、注解或 Java 配置类生成BeanDefinition元数据。实例化通过反射创建 Bean 的实例。属性赋值依赖注入根据BeanDefinition中的信息通过 Setter 方法或构造器等方式进行依赖注入。初始化Bean 完全创建后会调用一系列初始化方法。Aware 接口回调如果 Bean 实现了BeanNameAware、BeanFactoryAware、ApplicationContextAware等接口Spring 会调用其setXXX方法让 Bean 获取容器中的特定资源。BeanPostProcessor 前置处理在 Bean 的初始化方法执行前会调用所有注册的BeanPostProcessor的postProcessBeforeInitialization方法。AOP 的代理就是在这里创建的。自定义初始化执行使用PostConstruct注解的方法或实现InitializingBean接口的afterPropertiesSet方法。BeanPostProcessor 后置处理在初始化方法执行后会调用postProcessAfterInitialization方法。使用Bean 初始化完成后会被存入单例池singletonObjects供应用程序使用。销毁当容器关闭时会调用使用PreDestroy注解的方法或实现DisposableBean接口的destroy方法。️ Spring Security请求的安全过滤链Spring Security 的核心是一个过滤器链在请求到达DispatcherServlet之前进行安全拦截其完整流程如下整个流程通常被划分为认证和授权两个阶段认证阶段 (你是谁)用户请求进来后首先进入一系列安全过滤器如UsernamePasswordAuthenticationFilter。过滤器会从请求中提取用户名和密码等信息然后调用AuthenticationManager进行认证而AuthenticationManager会使用UserDetailsService加载用户信息并比对密码。认证成功后用户信息会被存入SecurityContextHolder。如果认证失败请求流程在此中断并返回失败信息给客户端。授权阶段 (你能做什么)认证成功后请求会进入授权相关过滤器如FilterSecurityInterceptor它会根据请求的 URL 等信息调用AccessDecisionManager进行授权决策。如果授权成功请求会被转发给Controller执行业务逻辑如果授权失败则返回AccessDeniedException或 403 状态码。 Spring Data JPA简化数据库操作Spring Data JPA 通过动态代理和规范命名的方式极大地简化了数据库访问。当调用 Repository 接口方法时其流程如下获取代理对象应用程序调用 Repository 接口的方法时实际调用的是由 Spring Data JPA 在运行时通过JdkDynamicAopProxy生成的动态代理对象。解析方法代理对象会拦截方法调用根据方法命名规范如findByLastName解析出查询意图或者识别出是自定义的Query查询。创建查询PartTreeJpaQuery会根据解析出的查询条件生成相应的 JPAQuery对象。委托给 JPA 实现最终SimpleJpaRepository封装了标准的 JPA 操作它会调用底层的 JPA 实现如 Hibernate来执行实际的数据库操作。✂️ Spring AOP横切逻辑的织入Spring AOP 的核心是在 Bean 的生命周期中通过动态代理在目标方法执行时织入切面逻辑。其触发和执行的流程如下代理创建发生在 Bean 的初始化阶段当一个 Bean 被实例化并完成依赖注入后在初始化阶段Spring AOP 会通过BeanPostProcessor的后置处理方法postProcessAfterInitialization来检查该 Bean 是否匹配某个切点Pointcut。如果匹配Spring 就会为该 Bean 创建一个代理对象JDK 动态代理或 CGLIB 代理而不是直接返回原始 Bean 对象。方法调用与拦截器链当从容器中获取到代理对象并调用其目标方法时代理对象会拦截调用并执行一条“拦截器链MethodInterceptor Chain”。这条链的顺序遵循“后进先出”的栈式调用结构执行顺序取决于切入类型AspectJ 风格下AroundBeforeAfterAfterReturning/AfterThrowing。️ Spring 事务管理声明式事务的实现原理Spring 声明式事务Transactional的实现本质上也是建立在 AOP 的基石之上的。流程是这样的代理对象当一个 Bean 带有Transactional注解时Spring 会为其创建一个代理对象。事务增强当调用代理对象中的方法时TransactionInterceptor事务拦截器会在目标方法执行前根据Transactional注解配置的事务传播行为Propagation等属性通过PlatformTransactionManager获取并开启一个事务。方法执行目标方法执行。提交或回滚TransactionInterceptor会根据目标方法的执行结果来决定事务的提交或回滚。如果方法正常执行完毕则提交事务如果方法抛出未捕获的异常且符合事务回滚规则默认是RuntimeException和Error则回滚事务。☁️ Spring Cloud 微服务一个请求的流转路径在微服务架构中一个外部请求的处理流程通常如下请求进入请求首先到达API 网关如 Spring Cloud Gateway它是所有外部请求的统一入口。认证鉴权网关将请求转发到认证中心进行身份认证和权限校验。服务发现认证通过后网关会向服务注册中心如 Nacos、Eureka查询目标服务如“业务微服务A”的可用实例地址列表。路由与调用网关通过负载均衡组件如 Ribbon选择一个服务实例将请求路由过去。业务处理“业务微服务A”处理请求。处理过程中如果需要调用“业务微服务B”则会通过Feign等声明式 HTTP 客户端发起调用。结果返回调用结果沿着调用链原路返回最终由网关响应给客户端。 总结Spring MVC的请求处理是围绕DispatcherServlet的找路 → 适配 → 执行 → 返回 → 解析 → 渲染 → 响应九步曲。Spring Boot的启动是从main方法开始创建SpringApplication并执行run方法最终创建并刷新 IoC 容器、启动内嵌 Web 服务器。Spring IoC的核心是Bean 的完整生命周期管理并通过BeanPostProcessor和BeanFactoryPostProcessor提供扩展点。Spring Security通过一系列安全过滤器链在请求到达 Controller 前完成认证和授权两个核心阶段。Spring AOP通过动态代理织入切面逻辑Spring 声明式事务正是其核心应用。Spring Data JPA通过动态代理和方法命名规范简化了数据访问。在Spring Cloud微服务架构中外部请求一般通过API 网关路由结合服务注册与发现、负载均衡等组件完成跨服务的调用。