1、Spring中事务失效的场景
在项目中,我遇到过几种导致事务失效的场景:
-
如果方法内部捕获并处理了异常,没有将异常抛出,会导致事务失效。因此,处理异常后应该确保异常能够被抛出。
-
如果方法抛出检查型异常(checked exception),并且没有在
@Transactional注解上配置rollbackFor属性为Exception,那么异常发生时事务可能不会回滚。 -
如果事务注解的方法不是公开(public)修饰的,也可能导致事务失效。

2、 SpringMVC的执行流程
老旧的视图阶段(JSP)

前后端分离

3、SpringBoot自动装配原理
Spring Boot的自动配置原理基于@SpringBootApplication注解,它封装了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。@EnableAutoConfiguration是核心,它通过@Import导入配置选择器,读取META-INF/spring.factories文件中的类名,根据条件注解决定是否将配置类中的Bean导入到Spring容器中。

4、Spring循环依赖怎么解决
循环依赖发生在两个或两个以上的bean互相持有对方,形成闭环。Spring框架允许循环依赖存在,并通过三级缓存解决大部分循环依赖问题:
-
一级缓存:单例池,缓存已完成初始化的bean对象。
-
二级缓存:缓存尚未完成生命周期的早期bean对象。
-
三级缓存:缓存
ObjectFactory,用于创建bean对象。
解决循环依赖的流程如下:
-
实例化A对象,并创建
ObjectFactory存入三级缓存。 -
A在初始化时需要B对象,开始B的创建逻辑。
-
B实例化完成,也创建
ObjectFactory存入三级缓存。 -
B需要注入A,通过三级缓存获取
ObjectFactory生成A对象,存入二级缓存。 -
B通过二级缓存获得A对象后,B创建成功,存入一级缓存。
-
A对象初始化时,由于B已创建完成,可以直接注入B,A创建成功存入一级缓存。
-
清除二级缓存中的临时对象A。
5、MyBatis执行流程
MyBatis的执行流程如下:
-
读取MyBatis配置文件
mybatis-config.xml。 -
构造会话工厂
SqlSessionFactory。 -
会话工厂创建
SqlSession对象。 -
操作数据库的接口,
Executor执行器。 -
Executor执行方法中的MappedStatement参数。 -
输入参数映射。
-
输出结果映射。


6、 MyBatis是否支持延迟加载

7、用过MyBatis的一级缓存和二级缓存吗?
一级缓存
一级缓存的作用域是sqlSession级别的,也就是说一个sqlSession下,同样的查询不会执行第二次,用第一次的结果,但是如过执行了更新,删除,插入的操作,会删除所有的一级缓存.一级缓存默认开启
拓展:同一个事务中默认是使用一个sqlSession的,如一个service的方法中加了 @Transactional那么这个方法里都用都一个sqlsesiion,如果没用加 @Transactional也就没开启事务,则这个方法每次执行mapper里的方法都会开启一个新的sqlsession.即使你连续查了同一条sql,这样是不是可以帮助理解一级缓存的作用域是sqlsession级别的.

二级缓存
二级缓存默认是不开启的,要打开配置,mapper的xml中也要开启,二级缓存的作用域是Namespaces级别的,



