框架篇八股(自用)
框架篇
Spring框架中的bean不是线程安全的
@Scope()
singleton单例
prototype多例
一个类中有可修改的成员变量需要考虑线程安全
bean没有可变状态(service类,DAO类)
某种程度单例bean是线程安全的
AOP面向切面编程,抽取公共行为和逻辑,封装成可重用的模块(切面)
记录操作日志
缓存处理
Spring中内置的事务处理
常用环绕通知
@Around(切面类)
Spring
编程式事务控制:TransactionTemplate 对业务代码侵入 不常用
声明式事务管理:@Transaction
本质通过AOP对方法前后进行拦截
在方法开始前加入一个事务
在执行完目标方法之后根据执行情况提交或者回滚事务
事务失效的场景
异常捕获处理
try catch
目标自己处理掉异常,事务通知无法获悉
在catch块中添加RuntimeException抛出
抛出检查异常
Spring默认只会回滚非检查异常
在注解里面配置rollbackFor属性
非public方法
事务通知前提是方法是public
bean的生命周期
BeanDefinition
Spring容器进行实例化,xml配置的<bean>的信息封装成BeanDefinition对象
1.构造函数:实例化Bean
Bean的创建和初始化赋值是分开的
2.依赖注入
3.Aware接口
4.Bean前置处理器
5.初始化方法:InitializingBean 自定义init方法
6.Bean后置处理器 AOP 动态代理
7.销毁Bean
三级缓存解决Spring中的循环引用(依赖注入出问题)
一级缓存:单例池,初始化完成的bean
二级缓存:缓存早期的bean对象(生命周期没有走完)
三级缓存:对象工厂,用来创建对象(代理对象)
spring框架依据三级缓存已经解决了大部分的循环依赖
构造方法循环依赖问题
在注入的参数前加@lazy注解
SpringMVC执行流程
视图阶段(老旧JSP)
1.请求到前端控制器
2.前端控制器调用处理器映射器
3.处理器映射器找到具体处理器,生成处理器对象以及处理器拦截器,返回给前端控制器
4.处理器前端控制器调用处理器适配器
5.处理器适配器适配到具体处理器
6.controller执行完返回ModeAndView给处理器适配器
7.处理器适配器将ModeAndView返回给前端控制器
8.前端控制器将ModeAndView传给视图解析器
9.视图解析器解析后返回具体的视图
10.前端控制器根据视图进行渲染
11.响应用户
前后端分离阶段(接口开发,异步)
1.请求到前端控制器
2.前端控制器调用处理器映射器
3.处理器映射器找到具体处理器,生成处理器对象以及处理器拦截器,返回给前端控制器
4.处理器前端控制器调用处理器适配器
5.处理器适配器适配到具体处理器
6.方法添加@ResponseBody
7.通过HttpMessageConverter返回结果转换为JSON并响应
Springboot自动配置原理
@SpringBootApplication包含三个注解
@SpringBootConfiguration 与@Configuration注解作用相同,配置类
@ComponentScan 组件扫描 默认引导类所在包及其子包
@EnableAutoConfiguration 实现自动化配置的核心注解
该注解通过@import注解导入对应的配置选择器
读取该项目和该项目引用的jar包的classpath路径下
META-INF/spring.factories文件中所配置的全类名
根据条件注解所指定的条件决定是否导入Spring容器中
@ConditionalOnClass 判断是否有对应的class文件
Mybatis执行流程
1.读取配置文件
2.创建会话工厂SqlSessionFactory
3.会话工厂创建SqlSession对象(包含执行sql语句的所有方法)
4.操作数据库的接口,Executor执行器,同时负责查询缓存的维护
5.Executor接口执行方法中有一个MappedStatement类型的参数,封装了映射信息
6.输入参数映射
7.输出结果映射
Mybatis支持延时加载,默认没有开启
原理:
1.使用CGLIB创建目标对象的代理对象
2.调用目标方法时,进入拦截器invoke方法,发现目标方法为null值,执行sql查询
3.获取数据后,调用set方法设置属性值,再继续查询目标方法,就有值
本地缓存:本质是一个HashMap
一级缓存:作用域是session级别
二级缓存:作用域是namespace和mapper的作用域,不依赖session
一级缓存:HashMap本地存储,Session进行flush或close,Session中所有的Cache清空
默认打开一级缓存
二级缓存:HashMap存储,不依赖于SQL session 默认关闭二级缓存
全局配置文件
映射文件<cache/>
1.数据更新机制:某一个作用域(一级缓存Session/二级缓存Namespace)进行新增、
修改、删除操作后,默认该作用域下的所有select中的缓存被clear
2.二级缓存需要缓存的数据实现Serializable
3.只有会话提交或者关闭之后,一级缓存中的数据才会转移到二级缓存中