面试--框架篇
spring框架中的单例bean是线程安全的吗?
spring框架中的bean默认是单例,
- singleton:bean在每个spring IOC容器中只有一个实例
- prototype:一个bean的定义可以有多个实例
spring框架中的单例bean是线程安全的吗?
不是线程安全的,
spring框架中有一个@Scope注解,默认的值是singleton,单例的
因为一般在spring的bean中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决
参考问答
什么是AOP?你们项目中有咩有使用AOP
AOP应用场景
记录操作日志
缓存处理
spring中内存的事务处理
spring中的事务如何实现
什么是AOP?
面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合项目中有咩有使用到AOP?
使用过。
spring中的事务是如何实现的?
本质是通过AOP功能,对方法前后进行拦截。在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务
参考问答
spring中事务失效的场景有哪些
(考察对spring框架的深入理解,复杂业务和编码经验)
异常捕获处理
如果没有捕获异常,事务回滚是正常的。
失效原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决方法:在catch块中添加throw new RuntimeException(e)抛出
抛出检查异常
失效原因:spring默认只会回滚非检查异常
解决办法:配置rollbackFor属性
@Transaction(rollbackFor=Exception.class)
非public方法导致的事务失效
原因:spring为方法创建代理、添加解决方法,前提条件都是该方法时public的
解决方法:改为public方法
spring事务失效的场景有哪些?
1、异常捕获处理
我记得项目中有个业务是保存优惠券信息之后,提取出秒杀券的信息保存。然后测试的时候,突然断网了,连接不上数据库的主机,程序异常,当时没有抛出这个异常,数据库中的数据就没有回滚,在catch块里面添加throw new RuntimeException(e)
2、抛出检查异常
业务是检查库存之后在数据库中扣减库存,然后创建订单,这个业务需要不定时的写到日志里面。但是有次日志文件误删了还是其他原因,业务报了FilenotFound异常,数据库数据之间也不一致,然后我是添加了注解@Transactional(RollBackFor = Excetption.class),并修改了写日志的逻辑
spring的bean的生命周期
BeanDefinition
spring的bean生命周期
spring中的循环引用
循环引用:
具体示例图
三级缓存解决循环依赖
一级缓存的作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖
二级缓存:如果要打破循环依赖,就需要一个中间人的参与,这个中间人就是二级缓存
但是代理对象无法缓存
构造方法出现了循环依赖怎么办(三级缓存gg)
三级缓存可以解决构造函数之后的循环依赖问题,但是构造函数是第一步
spring中的循环引用
构造方法出现了循环依赖怎么解决?
springmvc的执行流程知道吗?
视图阶段(JSP)
前后端分离阶段(接口开发、异步请求)
springmvc的执行流程
(视图jsp)
(版本二,前后端开发,接口开发)
springboot自动配置原理
Springboot自动配置原理
spring框架常见注解(spring、springboot、springmvc)
spring的常见注解
springmvc常见注解
springboot常见注解
mybatis执行流程
mybatis-config.xml
MappedStatement对象
mybatis执行流程
mybatis是否支持延迟加载
mybatis支持延迟加载,但默认没有开启
在mybatis-config.xml中开启延迟加载的全局设置
1 | <setting name="lazyLoadingEnabled" value = "true" /> |
在mapper文件中开启局部加载
1 | <resultMap id="userResultMap" type="user" autoMapping="true"> |
延迟加载的原理
mybatis是否支持延迟加载
延迟加载的底层原理
mybatis的一级、二级缓存用过吗?
一级缓存
二级缓存
二级缓存注意事项
mybatis一级、二级缓存用过吗?
mybatis的二级缓存什么时候会清理缓存中的数据