框架篇八股(自用)

框架篇

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.只有会话提交或者关闭之后,一级缓存中的数据才会转移到二级缓存中

相关推荐
Cuit小唐2 天前
C++ 状态模式详解
开发语言·c++·状态模式
周努力.3 天前
设计模式之状态模式
设计模式·状态模式
阑梦清川6 天前
计算机体系架构-----设计模式:状态模式(从程序员加班问题切入)
设计模式·架构·状态模式
智想天开6 天前
16.状态模式:思考与解读
设计模式·状态模式
Code哈哈笑7 天前
【图书管理系统】详细讲解用户登录:后端代码实现及讲解、前端代码讲解
前端·spring boot·后端·spring·状态模式
文件夹__iOS7 天前
状态模式 VS 策略模式
状态模式·策略模式
常某某的好奇心8 天前
状态模式(State Pattern)
状态模式
magic 2458 天前
深入理解 Spring MVC:DispatcherServlet 与视图解析机制
java·servlet·状态模式·springmvc
碎梦归途12 天前
23种设计模式-行为型模式之状态模式(Java版本)
java·jvm·设计模式·状态模式·软考·软件设计师·行为模式