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 帮助我们减少这些配置。
具体的流程为:
- 客户端发起请求
- DispatcherServlet(派遣Servlet 主要用来分发各种任务)
- HandlerMapping(处理器映射器,查找Handle方法即对应的Controller路径以及GetMapping这种路径、还有加上拦截器Intercept,作为HandlerExecutionChain(执行链路)返回给DispatcherServlet)
- HandlerAdapter(处理器适配器、解析@RequestParam @RequestBody这种执行请求参数)
- Handle(执行对应方法,返回ModeAndView对象给DispatcherServlet)
我们项目一般前后端分离很少用ModeAndView返回,都是自定义对象返回,框架会将对象自动序列化为 JSON 格式返回
- ViewResolver (视图解析器、解析ModeAndView对象、并在模板引擎渲染 如JSP,Freemarker)
tomcat 部署一个web应用的目录如下:WEB-INF
目录位于每个 Web 应用的根目录下,通常路径如下:
1 | webapps/your-web-app/ |
作用
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)。
- 开启全局事务:
- TM 向 TC 发起请求,TC 生成 XID 并返回。
- TM 将 XID 传递给 Service A 和 Service B 的 RM。
- 执行本地事务:
- Service A 的 RM 执行本地事务(如创建订单),生成 undo log,提交本地事务。
- Service B 的 RM 执行本地事务(如扣减库存),生成 undo log,提交本地事务。
- 提交全局事务:
- TM 向 TC 发起提交请求。
- TC 通知 Service A 和 Service B 的 RM 删除 undo log。
- 回滚全局事务:
- 如果某个 RM 执行失败,TM 向 TC 发起回滚请求。
- TC 通知 Service A 和 Service B 的 RM 根据 undo log 执行补偿操作。
seata原理(点击展开)
- 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 数据访问
- Spring JDBC
- 简化 JDBC 操作,提供
JdbcTemplate
。(statement那些)
- 简化 JDBC 操作,提供
- Spring Transactions
- 声明式事务管理(
@Transactional
)。 - 事务传播行为、隔离级别。
- 声明式事务管理(
四、Spring Web 模块
- Spring MVC(Model-View-Controller)
- 基于 MVC 模式的 Web 框架。
- 控制器(Controller url那层)、视图(View JSP)、模型(Model dao层)。
- RESTful 支持
@RestController
、@RequestMapping
、@RequestBody
等注解。
五、Spring 集成
- Spring Boot
- 快速构建 Spring 应用,提供自动配置和约定大于配置。
- 内嵌服务器(Tomcat、Jetty 等)。
- Spring Cloud
- 微服务架构支持,集成服务发现、配置中心、熔断器等。
- Spring Security
- 认证与授权,支持 OAuth2、JWT 等。
- Spring Batch
- 批处理框架,适用于大数据处理任务。
六、Spring 高级特性
- Spring Aware 接口
ApplicationContextAware
、BeanFactoryAware
、BeanNameAware
等。
- Spring 事件机制
- 事件发布与监听(
ApplicationEvent
、@EventListener
)。
- 事件发布与监听(
- Spring 测试支持
- 集成测试框架(
@SpringBootTest
、@MockBean
)。
- 集成测试框架(