专项攻克——spring、springMVC、springBoot、springCloud的启动流程

参考文献:https://blog.csdn.net/m0_47495420/article/details/114422268?

一、spring起源、核心讲解

1.1、为什么会出现 Spring(Spring要解决什么问题)

在 Spring 诞生之前,Java EE(EJB)开发存在大量痛点:

  1. 对象耦合严重 :业务类里面 new 大量依赖对象,改一个类,多处代码要修改,单元测试很难,硬编码耦合。

例:UserService 内部 new UserDao();如果后续换 Dao 实现,要改 Service 源码。

  1. EJB笨重复杂:早期EJB需要写接口、部署描述文件,依赖容器,测试必须跑服务器,本地main方法跑不了,开发效率极低。
  2. 重复样板代码多:JDBC、事务管理,到处写获取连接、关闭连接、try‑catch、事务提交回滚,大量重复模板代码。
  3. 面向侵入式编程:业务代码和框架API强绑定,业务类要实现框架接口、继承框架类,换框架就要大面积改业务代码。
  4. AOP横切逻辑散落:日志、权限、事务、监控,每个业务方法里复制粘贴,代码重复,修改要改所有地方。

Spring核心目标:做一个轻量级Java企业开发框架,解耦、简化开发、非侵入,把重复通用能力抽离出来。

1.2、Spring怎么解决这些问题

1. IoC 控制反转(Inverse of Control)

  • 原来 :程序员自己new对象,自己管理对象创建、依赖组装(程序主动控制)
  • Spring做法把对象的创建、依赖装配交给Spring容器
    你只需要告诉容器哪些类需要管理(注解/XML),容器实例化Bean,自动把依赖注入进来。

控制权反转:从应用代码 → Spring容器。

依赖注入DI是IoC的实现手段。

解决:组件之间强耦合,方便单元测试,切换实现类不用改业务代码。

2. AOP 面向切面编程

横切公共逻辑 (事务、日志、权限、埋点监控)和业务代码分离。

不用把日志写进每一个业务方法;在不修改业务源代码前提下,给方法增强附加功能。

解决:通用逻辑到处复制,业务代码混杂非业务逻辑。

3. 声明式事务

基于AOP封装事务,不需要手写commit/rollback,一个注解@Transactional就开启事务。

解决JDBC事务大量重复样板代码。

4. 非侵入设计

业务类不需要继承Spring类、不需要实现Spring接口;普通POJO就能交给Spring管理。业务代码不依赖Spring API。

5. 统一抽象集成层

对JDBC、MyBatis、ORM、各种第三方框架做封装适配,统一异常体系,屏蔽底层差异。

JdbcTemplate,消除JDBC重复关闭资源代码。

1.3、Spring关键核心技术

1. IoC容器(最核心)

1)BeanDefinition :Bean元数据,描述类信息、依赖、作用域、初始化销毁方法;XML/注解都会解析成BeanDefinition。

2)BeanFactory :Spring最底层容器接口,Bean工厂,负责Bean实例化。

3)ApplicationContext :BeanFactory的子接口,高级容器,扩展能力:国际化、事件发布、资源加载、注解扫描。

4)DI依赖注入 :构造器注入、setter注入、字段注入(@Autowired);推荐构造器注入。

5)Bean生命周期 :实例化 → 属性填充 → 初始化 → 使用 → 销毁。

6)Bean作用域:singleton单例、prototype多实例,request/session(web环境)。

重要:Spring容器默认单例,整个容器一份对象。

2. AOP 面向切面编程

  • 核心概念:切面Aspect、连接点JoinPoint、切点Pointcut、通知Advice(before/after/around/after‑returning/after‑throwing)、目标对象Target、代理。
  • 两种代理实现:
    • JDK动态代理:目标必须实现接口;生成接口代理类。
    • CGLIB代理:继承目标类生成子类,不需要接口。

Spring5.x后默认策略:有接口用JDK,无接口CGLIB;SpringBoot2默认CGLIB。

典型应用:@Transactional事务、@Async异步、权限拦截、日志埋点全部基于AOP。

3. 声明式事务

  • PlatformTransactionManager:事务管理器接口,不同数据库ORM提供不同实现。
  • @Transactional:注解驱动事务,底层AOP拦截方法,自动开启、提交、回滚事务。
  • 事务传播行为、隔离级别、回滚规则。

4. Spring资源 & 事件机制

  • Resource:统一访问资源(文件、classpath、网络资源)。
  • ApplicationEvent 事件发布订阅:容器事件,业务也可以自定义事件,解耦业务流程。

5. Spring体系模块(Spring Framework本体)

  • spring‑core:核心工具类
  • spring‑beans:Bean工厂,IoC基础
  • spring‑context:ApplicationContext容器,扩展能力
  • spring‑aop:AOP实现
  • spring‑tx:事务支持
  • spring‑jdbc:JDBC模板
  • spring‑web/spring‑webmvc:web模块(SpringMVC)

⚠️区分:Spring Framework(底层框架) vs SpringBoot(自动配置,快速搭建Spring应用)

SpringBoot不是替代Spring,是Spring的脚手架,自动装配、starter简化配置。

1.4、极简总结背诵版

  1. 为什么出现Spring:解决早期JavaEE耦合重、样板代码多、测试难、EJB笨重;目标:轻量解耦。
  2. 两大支柱
    • IoC:把对象创建交给容器,DI注入依赖,解除硬编码耦合。
    • AOP:把日志、事务等公共逻辑抽离,不修改业务代码做功能增强。
  3. 关键组件:BeanDefinition、BeanFactory、ApplicationContext、JDK/CGLIB代理、PlatformTransactionManager。
  4. 衍生能力:声明式事务、JdbcTemplate模板、事件机制。

如果你需要,我可以再给你一份面试口述精简版,或者手写模拟IoC简易实现。

二、 关于Spring、Spring MVC、Spring Boot、Spring Cloud启动流程的标准面试回答如下:

2.1 Spring启动流程

Spring框架启动过程主要围绕IoC(控制反转)容器的初始化,核心是创建和管理Bean对象。具体步骤为:

  1. 资源定位:通过配置文件(如XML)、注解或Java代码等方式,确定Bean定义的来源。
  2. Bean定义加载:将资源定位阶段找到的Bean定义信息解析并加载到IoC容器中,以BeanDefinition的形式存储。
  3. Bean注册:将解析后的BeanDefinition注册到BeanDefinitionRegistry中,IoC容器可以根据这些信息创建和管理Bean实例。
  4. Bean实例化:在需要使用Bean时,IoC容器根据BeanDefinition创建Bean实例,可能会涉及到依赖注入等操作。

2.2 Spring MVC启动流程

Spring MVC是Spring框架的Web模块,其启动过程与Spring框架紧密相关,主要步骤如下:

  1. 创建Spring容器:在Web应用启动时,首先创建Spring的IoC容器,加载相关的Bean定义。
  2. 初始化DispatcherServlet:作为Spring MVC的核心控制器,DispatcherServlet负责接收和分发请求。在初始化过程中,它会加载Spring MVC的配置信息,如HandlerMapping、ViewResolver等。
  3. 配置HandlerMapping:HandlerMapping负责将请求映射到具体的处理器(Controller),它会根据请求的URL和配置信息,找到合适的处理器。
  4. 配置ViewResolver:ViewResolver负责将处理器返回的逻辑视图名解析为具体的视图对象,如JSP、Thymeleaf模板等。
  5. 启动完成:DispatcherServlet初始化完成后,Spring MVC框架就可以开始处理客户端的请求了。

2.3 Spring Boot启动流程

Spring Boot的设计目标是简化Spring应用的开发和部署,其启动流程相对简洁:

  1. 启动主类 :Spring Boot应用通常有一个带有@SpringBootApplication注解的主类,该类包含main方法,作为应用的入口点。
  2. 创建SpringApplication实例 :在主类的main方法中,会创建一个SpringApplication对象,并调用其run方法。
  3. 自动配置:Spring Boot根据应用的依赖和配置,自动配置Spring框架和相关组件,减少开发者的手动配置。
  4. 启动嵌入式服务器:如果应用是Web应用,Spring Boot会自动启动一个嵌入式服务器,如Tomcat、Jetty等。
  5. 加载应用上下文:创建并加载Spring的应用上下文,将所有的Bean注册到容器中。
  6. 应用启动完成:当应用上下文加载完成后,Spring Boot应用就正式启动,可以接收和处理请求。

2.4 Spring Cloud启动流程

Spring Cloud是一系列用于构建分布式系统的工具集合,其启动流程与各个组件的功能和依赖有关,一般步骤如下:

  1. 启动Spring Boot应用:Spring Cloud基于Spring Boot构建,首先需要按照Spring Boot的启动流程启动应用。
  2. 配置注册中心:如果使用了服务注册与发现组件(如Eureka、Consul),应用会将自己的服务信息注册到注册中心,同时从注册中心获取其他服务的地址。
  3. 配置网关:如果使用了API网关组件(如Zuul、Spring Cloud Gateway),网关服务会启动并配置路由规则,将请求转发到相应的服务。
  4. 启动分布式配置中心:如果使用了分布式配置中心(如Spring Cloud Config),应用会从配置中心获取配置信息,确保各个服务使用统一的配置。
  5. 启动服务调用组件:如果使用了服务调用组件(如Feign、RestTemplate),应用会初始化这些组件,以便在需要时调用其他服务。
  6. 启动完成:当所有组件都启动并配置完成后,Spring Cloud应用就可以正常运行,实现分布式系统的各个功能。
相关推荐
丘山一郎21 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野21 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
MetaLite21 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
李昊哲小课1 天前
SpringBoot4 云端咖啡站 阶段二:数据访问与分层架构
spring boot·架构
宠友信息1 天前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
摇滚侠1 天前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端
李昊哲小课1 天前
SpringBoot4 云端咖啡站 阶段四:安全、文件与性能
spring boot·安全·性能优化·文件·性能
luteres1 天前
Spring学习笔记
java·后端·spring
南城以南溫暖如初1471 天前
从零搭建24小时自助健身系统:技术选型与核心模块实战
java·spring boot·redis·mysql·vue·mybatis
李昊哲小课1 天前
SpringBoot4 云端咖啡站 阶段五:交付与进阶
人工智能·spring boot·大模型·log4j·智能体