Spring 总结
磊磊

Spring 总结的代码在这

常见面试题

  • Spring 核心是什么?
    Spring Core Container
    • IoC(Inversion of Control,控制反转):创建对象交给spring去做,通过反射;创建Bean;
    • AOP(Aspect-Oriented Programming,面向切面编程):通过切面实现横切关注点的模块化。

创建bean的方式:
基于 XML (配置 指定路径。class.forName())
基于注解(@Component、@Service、@Repository、@Controller)
基于 Java 配置类(通过 @Configuration 和 @Bean 注解,在 Java 类中显式定义 Bean。
基于 FactoryBean(通过实现 FactoryBean 接口,自定义 Bean 的创建逻辑。也需要依赖xml/注解)

  • DI(Dependency Injection,依赖注入) IOC 包括了DI,DI

    构造函数注入
    Setter 方法注入
    字段注入
    方法注入


  • Spring AOP的理解
    • 切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)。
    • 动态代理(JDK 动态代理(默认,不是接口再用别的,原理是反射)、CGLIB 代理(用继承关系,asm写字节码做的))。

  • Spring 事务的理解:
    • 开启事务得 @EnableTransactionManagement、配置bean:DataSource、TransactionManager

事务的传播行为(Propagation Behavior):
传播行为定义了事务方法在调用其他事务方法时的行为。Spring 支持以下传播行为:

传播行为类型 描述
REQUIRED(默认) 如果当前存在事务,则加入该事务;否则,创建一个新事务。
REQUIRES_NEW 总是创建一个新事务,如果当前存在事务,则挂起当前事务。
SUPPORTS 如果当前存在事务,则加入该事务;否则,以非事务方式执行。
NOT_SUPPORTED 以非事务方式执行,如果当前存在事务,则挂起当前事务。
MANDATORY 必须在一个已存在的事务中执行,否则抛出异常。
NEVER 必须在一个不存在的事务中执行,否则抛出异常。
NESTED 如果当前存在事务,则在嵌套事务中执行;否则,创建一个新事务。

  • bean的生命周期
    • 实例化前准备beanDefine map(单例/多例、依赖情况、init-method 和 destroy-method、lazy、Primary注解、order 注解)
    • 实例化 (就是通过反射创建出来)
    • 属性注入 (也叫依赖注入,循环依赖涉及到2、3级缓存)
    • bean 初始化(主要是自定义bean,各种aware接口,然后@preConstruct,bean注解的init-method,beanPostProcessor 接口)
    • bean 缓存,放到一级缓存,从里面取就可以用了
    • bean 摧毁(@preDestroy、bean注解的destroy-method一些测试场景)

  • Spring MVC 的理解

tomcat 是一个容器负责管理和运行Servlet,我们这边就要给具体的Servlet实现。
我们写Servlet 要写各种如实现HttpServlet的doGet、doPost方法。还有filter过滤器等,然后还要在web.xml里面配置路径方便tomcat寻找映射关系

现在SpringWeb 有MVC框架,@Controller @ResponseBody @GetMapping @RequestParam 帮助我们减少这些配置。
具体的流程为:

  1. 客户端发起请求
  2. DispatcherServlet(派遣Servlet 主要用来分发各种任务)
  3. HandlerMapping(处理器映射器,查找Handle方法即对应的Controller路径以及GetMapping这种路径、还有加上拦截器Intercept,作为HandlerExecutionChain(执行链路)返回给DispatcherServlet)
  4. HandlerAdapter(处理器适配器、解析@RequestParam @RequestBody这种执行请求参数)
  5. Handle(执行对应方法,返回ModeAndView对象给DispatcherServlet)

    我们项目一般前后端分离很少用ModeAndView返回,都是自定义对象返回,框架会将对象自动序列化为 JSON 格式返回

  6. ViewResolver (视图解析器、解析ModeAndView对象、并在模板引擎渲染 如JSP,Freemarker)

tomcat 部署一个web应用的目录如下:
WEB-INF 目录位于每个 Web 应用的根目录下,通常路径如下:

1
2
3
4
5
6
7
webapps/your-web-app/
├── WEB-INF/
│ ├── web.xml
│ ├── classes/
│ └── lib/
├── index.jsp
└── ...

作用

  • web.xml:Web 应用的配置文件,用于定义 Servlet、过滤器、监听器等。
  • classes/:存放 Web 应用的自定义类文件(如 Servlet、工具类等)。
  • lib/:存放 Web 应用的第三方依赖库(JAR 文件)。

安全性

  • WEB-INF 目录是受保护的,无法通过 URL 直接访问。
    • 例如,http://localhost:8080/your-web-app/WEB-INF/web.xml 会返回 404 错误。
  • 只有 Tomcat 服务器可以访问 WEB-INF 目录中的内容。
    web.xml:Web 应用的配置文件,用于定义 Servlet、过滤器、监听器等。
    classes/:存放 Web 应用的自定义类文件(如 Servlet、工具类等)。
    lib/:存放 Web 应用的第三方依赖库(JAR 文件)。

  • 常用设计模式
    • 枚举策略模式
    • 单例模式
    • 构建者模式
    • 工厂模式
    • 适配器模式

  • 深拷贝、浅拷贝
    • Java Object有克隆的方法,要实现CloneAble的接口,然后默认是浅克隆引用不会是新的(共用一个对象),基本数据类型就赋值。
    • 深克隆可以重写方法,或者用第三方工具反序列化这样

  • 分布式事务 seata 的理解
    • TC(Transaction Coordinator,事务协调器)
    • TM(Transaction Manager,事务管理器):开启全局事务:向 TC 发起全局事务的开启请求,获取全局事务 ID(XID)。 提交或回滚全局事务:根据业务逻辑的执行结果,向 TC 发起全局事务的提交或回滚请求。
    • RM(Resource Manager,资源管理器):管理 Undo Log:在事务提交时删除 Undo Log,在事务回滚时根据 Undo Log 恢复数据。

AT示例流程
假设一个分布式事务涉及两个服务:订单服务(Service A)和库存服务(Service B)。

  1. 开启全局事务
    • TM 向 TC 发起请求,TC 生成 XID 并返回。
    • TM 将 XID 传递给 Service A 和 Service B 的 RM。
  2. 执行本地事务
    • Service A 的 RM 执行本地事务(如创建订单),生成 undo log,提交本地事务。
    • Service B 的 RM 执行本地事务(如扣减库存),生成 undo log,提交本地事务。
  3. 提交全局事务
    • TM 向 TC 发起提交请求。
    • TC 通知 Service A 和 Service B 的 RM 删除 undo log。
  4. 回滚全局事务
    • 如果某个 RM 执行失败,TM 向 TC 发起回滚请求。
    • TC 通知 Service A 和 Service B 的 RM 根据 undo log 执行补偿操作。
seata原理(点击展开)

image


  • seata 常用模式
    • AT
      • 原理:主要是数据补偿机制:一阶tc创建提交,rm 生成 undo.log。二阶回滚就用undo.log进行事务的补偿
      • 缺点:最终一致性,一阶状态可能出现某种意义上的赃读(因为一阶要提交)
    • XA
      • 原理:一阶 TM 通知所有 RM 准备提交事务。RM 执行本地事务,并返回准备结果(成功或失败)。二阶参与者有不同意就回滚
      • 缺点:死锁:一阶段 参与者持有排他锁且不提交,如果多个参与者同时修改同一行数据,可能会导致死锁。
    • TCC(Try confirm cancel)
      • 原理:好像是数据库给你加字段,看了一下代码入侵比较严重
    • saga
      • 原理:处理长事务用,好像得有个状态机各种流程,他一般用于处理第三方接口支付失败等,一致性方案是自定义方法进行补偿,要写很多方法.
      • 缺点:他没有隔离性可言

  • SpringBoot 自动装配流程
    • boot前要手动配置DataSource数据库连接池,现在他帮你配好了。

  • ThreadLocal 了解过没

  • Redis 线程锁

  • 跨域怎么出现的,怎么解决

Spring 总结

一、Spring 概述

Spring 的核心思想

  • IoC(Inversion of Control,控制反转):将对象的创建和依赖关系交给 Spring 容器管理。
  • AOP(Aspect-Oriented Programming,面向切面编程):通过切面实现横切关注点的模块化。

二、Spring 核心模块

三、Spring 数据访问

  1. Spring JDBC
    • 简化 JDBC 操作,提供 JdbcTemplate。(statement那些)
  2. Spring Transactions
    • 声明式事务管理(@Transactional)。
    • 事务传播行为、隔离级别。

四、Spring Web 模块

  1. Spring MVC(Model-View-Controller)
    • 基于 MVC 模式的 Web 框架。
    • 控制器(Controller url那层)、视图(View JSP)、模型(Model dao层)。
  2. RESTful 支持
    • @RestController@RequestMapping@RequestBody 等注解。

五、Spring 集成

  1. Spring Boot
    • 快速构建 Spring 应用,提供自动配置和约定大于配置。
    • 内嵌服务器(Tomcat、Jetty 等)。
  2. Spring Cloud
    • 微服务架构支持,集成服务发现、配置中心、熔断器等。
  3. Spring Security
    • 认证与授权,支持 OAuth2、JWT 等。
  4. Spring Batch
    • 批处理框架,适用于大数据处理任务。

六、Spring 高级特性

  1. Spring Aware 接口
    • ApplicationContextAwareBeanFactoryAwareBeanNameAware 等。
  2. Spring 事件机制
    • 事件发布与监听(ApplicationEvent@EventListener)。
  3. Spring 测试支持
    • 集成测试框架(@SpringBootTest@MockBean)。
由 Hexo 驱动 & 主题 Keep
访客数 访问量