Spring框架中的单例bean的线程是安全的吗?
答:不是线程安全的。
- 因为一般在spring的bean中都是注入无状态的对象,没有线程安全问题,如果bean中定义了可修改的成员变量,是要考虑线程安全问题的。可以使用多例或者加锁解决
- spring框架中有一个@Scope注解,默认的值是singleton,单例的
- 如果bean有多种状态的话,就需要自行保证线程安全,最明显的解决办法就是将多态bean的作用由singleton变更为prototype
什么是AOP
答:Aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般可以做公共日志保存,事务处理等。
项目中使用过Aop吗
答:我们当时是使用aop来记录系统的操作日志的,主要是使用aop的环绕通知+切点表达式。
- 这个表达式就是要找到记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,比如类信息、方法信息、注解等,获取到这些参数后,保存到数据库
spring中的事务是如何实现的
答:其本质是通过Aop功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务
spring中事务失效的场景
- 异常捕获处理:自己处理了异常,但是没有抛出,就会导致事务失效,所以解决办法就是,记得手动抛出异常
- 抛出检查异常:如果报错的话也会导致事务失效,最后在spring事务的注解上配置rollbackfor属性为Exception,这个样子不管什么异常,都会回滚事务
- 如果方法不是public修饰的话 也会导致事务失效
springBean的生命周期
之前看过一下源码所以了解一点,大概流程是这个样子的
- 通过BeanDefinition获取bean的定义信息,这里面封装了bean的所有信息
- 调用构造函数实例化bean
- bean的依赖注入 比如set方法的注入
- 处理Aware接口 就比如某个bean失效了Aware接口就会重写方法执行
- bean的后置处理BeanPostProcessor -前置方法
- 初始化方法
- bean的后置处理BeanPostProcessor -后置方法 主要是对bean进行增强,有可能在这里会产生代理对象
- 销毁bean
Spring中的循环引用
- 循环引用:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环,比如A依赖于B,B依赖于A
- 循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖
- 一级缓存:单列池,缓存已经经历了完整的生命周期,已经初始化完成bean的对象
- 二级缓存:缓存早期的bean对象(生命周期还没有走完)
- 三级缓存:缓存是ObjectFactory,表达对象工厂,用来创建某个对象的
构造方法出现了循环引用怎么解决?
原因:由于bean的生命周期中构造函数是第一个执行的,所以spring框架并不能解决构造函数的依赖注入
解决:使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建
SpringMvc的执行流程
springboot的自动配置原理
Mybatis的一级、二级缓存用过吗?
mybatis的一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作
用域为 Session,当Session进行flush或close之后,该Session中的所有Cache
就将清空,默认打开一级缓存
关于二级缓存需要单独开启
二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL
session,默认也是采用 PerpetualCache,HashMap 存储。
如果想要开启二级缓存需要在全局配置文件和映射文件中开启配置才行。
Mybatis的二级缓存什么时候会清理缓存中的数据
当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修
改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。