专项攻克——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应用就可以正常运行,实现分布式系统的各个功能。
相关推荐
vx-程序开发1 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
独行侠影a1 小时前
SpringBoot 分布式锁实战:Redisson 解决订单超卖并发问题
spring boot·分布式·后端
markinmarkin3 小时前
Spring 中有哪些方式可以把Bean 注入到IOC 容器?
java·spring
敲个大西瓜5 小时前
Springboot核心面试题
java·spring boot·后端
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ5 小时前
Spring‑AI Document 对象 JSON 字段详解
人工智能·spring·json
麻雀聊技术6 小时前
一重启 AI 就失忆?用 Spring AI + PostgreSQL 3步搞定“长期记忆”持久化(附完整代码)
java·spring·openai
码农进化录6 小时前
Java 程序员的 AI 进化论 | LangChain4j 入门,Java 开发者的 AI 应用框架
java·spring boot·openai
he___H7 小时前
Spring-Configur注解
java·spring
铃木之影8 小时前
Java 版本 RAG 示例(Spring AI + Milvus)
java·人工智能·spring