Spring IOC理解
IOC控制翻转是一种设计思想,它将原本是在程序运行时才创建并管理的对象交给Spring框架创建和管理,控制权由应用代码转移到了 Spring 容器,控制权发生了反转。让开发者能够专注于业务逻辑层的开发,大大降低了模块之间的耦合度,提高开发效率和代码可维护性。
AOP理解
AOP就是面向切面编程,它是一种编程思想和方法,它将影响多个对象的公共行为抽离并封装,实现了与业务逻辑的解耦,减少重复代码,增强代码可维护性,提高开发效率。
Spring循环依赖问题是什么?Spring循环依赖如何解决?
Spring循环依赖问题是指在Spring容器中,两个或多个Bean之间存在直接的或间接的依赖关系,导致在创建和初始化这些Bean时形成了一个闭环,使得Spring容器无法正确地创建和初始化这些Bean。
- 构造器循环依赖:这种循环依赖发生在Bean之间的构造器相互引用。
- setter循环依赖:这种循环依赖发生在Bean的setter注入方法中。
Spring循环依赖的解决方式可以归纳为以下几点:
- 重新设计代码结构
- 使用@Lazy注解
- 使用setter注入代替构造器注入
- 分离接口和实现
- 利用Spring的三级缓存机制
三级缓存机制解决循环依赖:其中一级缓存用于存储完全初始化好的单例 Bean,二级缓存用于存储早期暴露的 Bean 实例,部分初始化的 Bean。三级缓存用于存储 Bean 工厂,主要用于创建 Bean 的代理对象。假设现在有两个对象 A 依赖 B,B 依赖 A。那么在A创建过程中发现需要属性 B,查找发现 B 还没有在一级缓存中,于是先将 A 放到三级缓存中,此时的 A 不完整,没有属性,但是可以引用。接下来就去实例化B。B 开始创建,此时发现需要A,于是B先查一级缓存寻找A,如果没有,再查二级缓存,如果还没有,再查三级缓存,找到了A,然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A。B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中的状态)。然后回来接着创建A,此时B已经创建结束,可以直接从一级缓存里面拿到B,这样 A 就完成了创建,并将A放到一级缓存。
作用域是什么?
- singleton:单例作用域,所有对该Bean的请求都返回同一个Bean实例。
- prototype:原型作用域,每次请求时都创建一个新的Bean实例。
- request:请求作用域,每个HTTP请求都会创建一个新的Bean实例,该Bean实例仅在当前请求内有效。
- session:会话作用域,每个HTTP会话都会创建一个新的Bean实例,该Bean实例仅在当前会话内有效。
- application:全局作用域,一个bean 定义对应于单个ServletContext 的生命周期。
- websocket: HTTP WebSocket 作用域,一个bean 定义对应于单个websocket 的生命周期。
Spring事务传播行为
Spring 事务传播行为(Transaction Propagation Behavior)定义了在事务方法被调用时,事务如何传播。Spring 提供了多种传播行为,允许开发者定义事务的边界和行为。这些传播行为通过@Transactional注解的propagation属性来配置。
1. REQUIRED(默认值)
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
2. REQUIRES_NEW
总是创建一个新的事务。如果当前存在事务,则挂起当前事务。
3. SUPPORTS
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式继续执行。
4. NOT_SUPPORTED
总是以非事务方式执行,如果当前存在事务,则挂起当前事务。
5. MANDATORY
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
6. NEVER
总是以非事务方式执行,如果当前存在事务,则抛出异常。
7. NESTED
如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。
注意:嵌套事务依赖于底层的事务管理器支持,如 JDBC 的Savepoints。
Spring事务回滚流程?
1.先做准备工作,解析各个方法上事务相关的属性,根据具体的属性来判断是否开启新事务。
2.当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事务。
3.执行具体的sql逻辑操作
4.在操作的过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚具体的逻辑是通过doRollBack方法来实现的,实现的时候也是先获取连接对象,通过连接对象来回滚。
5.如果执行过程中,没有发生任何异常,那么会通过commitTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法来实现的,实现的时候也是先获取连接对象,通过连接对象提交。
6.当事务执行完毕之后需要清除相关的事务信息