专项攻克——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应用就可以正常运行,实现分布式系统的各个功能。
相关推荐
考虑考虑8 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
步行cgn10 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
不会c+10 小时前
Day02 - 需求分析与用例建模
spring
LuTshoes10 小时前
spring ai 实战 手搓 PlaneExecuteAgent
java·人工智能·spring·ai
边境悍匪11 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
xcl092512 小时前
本地电竞服务交易系统架构设计与实战:从同城匹配到订单履约
java·spring boot
paopaokaka_luck12 小时前
小学非遗科普平台(AI 非遗科普问答,ECharts学情数据、非遗资源分类与审核,资源收藏下载与学习记录,学习任务发布和作品评分,活动报名签到与统计)
java·人工智能·spring·信息可视化·数据分析·echarts
Yize.13 小时前
Spring Task定时任务全解析:从入门到实战
java·spring
孙启超13 小时前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
白宇横流学长15 小时前
基于springboot的个人博客系统的设计与实现【源码+文档】
java·spring boot