跳至主要內容

EkkoSonya's Blog

好好学习,天天向上

Spring系列八股13 - 事务

事务

Spring 提供了两种事务管理方式,编程式事务和声明式事务

编程式事务就是我们要手动调用事务的开始、提交、回滚这些操作,虽然灵活但是代码比较繁琐

声明式事务只需要在需要事务的方法上加上 @Transactional 注解就好了,Spring 会帮我们自动处理事务的整个生命周期

声明式事务原理

Spring 的声明式事务管理是通过 AOP 和代理机制实现的,大致可以分为两个阶段

第一个阶段发生在 Spring 容器启动时,它会扫描所有的 Bean


codejavaspring八股大约 10 分钟
Spring系列八股14 - MVC1 (基本概念)

MVC

MVC 分层介绍

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范

用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑

  • 视图(view): 为用户提供使用界面,与用户直接进行交互。
  • 模型(model): 代表一个存取数据的对象或 JAVA POJO(Plain Old Java Object,简单java对象)
    • 它也可以带有逻辑,主要用于承载数据,并对用户提交请求进行计算的模块,模型分为两类
    • 一类称为数据承载 Bean
      • 所谓数据承载 Bean 是指实体类(如:User类),专门为用户承载业务数据的
    • 一类称为业务处理 Bean
      • 业务处理 Bean 是指 Service 或 Dao 对象,专门用于处理用户提交请求的。
  • 控制器(controller): 用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。它使视图与模型分离

codejavaspring八股大约 3 分钟
Spring系列八股15 - MVC2 (Spring MVC)

MVC

Spring MVC 是 Spring 框架对 MVC 模式的具体实现,专门用于构建 Web 应用

MVC        →  一种设计思想(模式)
Spring MVC →  Spring 对这个思想的落地实现

核心组件

请求进来
   ↓
DispatcherServlet(前端控制器,所有请求的入口)
   ↓
HandlerMapping(找到对应的 Controller)
   ↓
Controller(处理请求,调用 Service)
   ↓
返回 ModelAndView / JSON
   ↓
响应给客户端

codejavaspring八股大约 5 分钟
Spring系列八股16 - MVC3 (Spring MVC 流程)

MVC3

前后端分离下 Spring MVC 流程

传统 MVC:         前后端分离:
Controller         Controller
    ↓                  ↓
返回 ModelAndView   返回 JSON 数据
    ↓                  ↓
服务端渲染 HTML     前端自己渲染页面

codejavaspring八股大约 4 分钟
Spring系列八股17 - MVC4 (RESTful)

MVC4

RESTful

RESTful(Representational State Transfer,表现层状态转化)本身并不是一种标准、协议或技术,而是一种软件架构风

当一个 Web 服务(API)的设计符合 REST 架构风格时,我们就称它为 RESTful API

简单来说,RESTful 提倡用 URL 定位资源,用 HTTP 动词(GET, POST, PUT, DELETE 等)描述操作

1. Resource(资源)

在 REST 理念中,网络上的所有事物都被抽象为“资源”。一个资源可以是一个实体(如用户、订单、文章),也可以是一个集合(如用户列表)。


codejavaspring八股大约 4 分钟
Spring系列八股18 - SpringBoot (分析1)

SpringBoot

Spring Boot 可以说是 Spring 生态的一个重大突破,它极大地简化了 Spring 应用的开发和部署过程

以前我们用 Spring 开发项目的时候,需要配置一大堆 XML 文件,包括 Bean 的定义、数据源配置、事务配置等等,非常繁琐

而且还要手动管理各种 jar 包的依赖关系,很容易出现版本冲突的问题, 部署的时候还要单独搭建 Tomcat 服务器,整个过程很复杂

Spring Boot 就是为了解决这些痛点而生的

“约定大于配置”是 Spring Boot 最核心的理念


codejavaspring八股大约 11 分钟
Spring系列八股19 - SpringBoot2 (自动装配分析 @Import)

SpringBoot

@Import

它的核心作用是:将指定的类、配置类或动态生成的 Bean 注册到 Spring 的 IoC 容器中

@ComponentScan 只能扫描你项目包路径下的类。但如果你想导入一个外部 jar 包里的类,或者一个不在扫描路径下的配置类,@ComponentScan 就够不着了。

@Import 就是解决这个问题的。

引入普通类或 @Configuration


codejavaspring八股大约 4 分钟
Spring系列八股20 - SpringBoot3 (Spring Boot 启动原理)

SpringBoot

alt text
  • 创建 SpringApplication 实例,并识别应用类型,比如说是标准的 Servlet Web 还是响应式的 WebFlux,然后准备监听器和初始化监听容器。
  • 创建并准备 ApplicationContext,将主类作为配置源进行加载。
  • 刷新 Spring 上下文,触发 Bean 的实例化,比如说扫描并注册 @ComponentScan 指定路径下的 Bean
  • 触发自动配置,在 Spring Boot 2.7 及之前是通过 spring.factories 加载的,3.x 是通过读取 AutoConfiguration.imports,并结合 @ConditionalOn 系列注解依据条件注册 Bean
  • 如果引入了 Web 相关依赖,会创建并启动 Tomcat 容器,完成 HTTP 端口监听

codejavaspring八股大约 16 分钟
Spring系列八股21 - SpringBoot4

SpringBoot4

自动装配面试回答

目的: 根据引入的 Starter 依赖,自动把相关的 Bean 注册到容器,省去手动配置

@SpringBootApplication 是入口,它是个组合注解,其中 @EnableAutoConfiguration 负责开启自动配置。

@EnableAutoConfiguration 内部通过 @Import(AutoConfigurationImportSelector.class) 引入了核心选择器。


codejavaspring八股大约 3 分钟
Spring系列八股22 - SpringBoot5 (Spring Boot Starter)

SpringBoot5

Spring Boot Starter

Starter 的核心思想是把相关的依赖打包在一起,让开发者只需要引入一个 starter 依赖,就能获得完整的功能模块

当我们在 pom.xml 中引入一个 starter 时,Maven 就会自动解析这个 starter 的依赖树,把所有需要的 jar 包都下载下来

每个 starter 都会包含对应的自动配置类,这些配置类通过条件注解来判断是否应该生效

比如当我们引入了 spring-boot-starter-web,它会自动配置 Spring MVC、内嵌的 Tomcat 服务器等


codejavaspring八股大约 3 分钟