黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)
一. 单例bean
Spring框架中的单例bean是线程安全的吗?
Spring框架中的bean是单例的,可以在注解@Scope()进行设置
- singleton:bean在每一个Spring IOC容器中只有一个实例。
- prototype:一个bean的定义可以有多个实例
总结
二. AOP
AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
以下详细说明一下AOP的使用场景
2.1 记录操作日志
当用户请求时,需要记录请求中的请求方式、访问地址等信息,
代码分析如下:
2.2 Spring中的事务是如何实现的
Spring支持编程式事务管理和声明式事务管理两种方式。
- 编程式事务控制:需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用
- 声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
在业务逻辑之前开启事务,在业务逻辑执行之后提交事务,如果出现异常,则进行回滚,要在方法前面加上注解@Transactional
总结
三. 事务失效
有三种事务失效的场景
- 异常捕获处理
- 抛出检查异常
- 非public方法
3.1 异常捕获处理
事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决方法是在catch块中添加throw new RuntimeException(e)抛出
3.2 抛出检查异常
原因是Spring默认只会回滚非检查异常
解决方法是配置rollbackFor属性@Transactional(rollbackFor=Exception.class)
3.3 非public方法导致的事务失效
总结
Spring中事务失效的场景有以下几种:
1.异常捕获处理,自己处理了异常,没有抛出,解决方法是手动抛出
2.抛出检查异常,配置rollbackFor属性为Exception
3.非public方法导致的事务失效,改为public
四. Spring的bean的生命周期
4.1 BeanDefinition
Spring容器在进行实例化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean
总结
五. Spring循环引用
循环引用可能出现死循环现象
5.1 三级缓存解决循环依赖
一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖
二级缓存
三级缓存
5.2 构造方法出现了循环依赖怎么解决
总结
六. SpringMvc执行流程
SpringMvc的执行流程是这个框架最核心的内容
- 视图阶段(老旧JSP等)
- 前后端分离阶段(接口开发、异步)
6.1 视图阶段(JSP)
6.2 前后端分离阶段(接口开发、异步)
总结
七. SpringBoot自动配置原理
- @SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是一个配置类
- @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包
- @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。
@EnableAutoConfiguration注解分析如下
总结
八. Spring框架常见注解(Spring、SpringBoot、SpringMvc)
8.1 Spring的常见注解
Spring的常见注解有哪些?
回答参照下表:
8.2 SpringBoot的常见注解
SpringBoot的常见注解有哪些?
回答参照下表:
8.3 SpringMvc的常见注解
SpringMvc的常见注解有哪些?
回答参照下表:
八. Mybatis执行流程
Mybatis执行流程
首先要定义核心配置文件mybatis-config.xml,作用一是加载环境配置,二是加载映射文件
操作数据库
总结
Mybatis执行流程是?
九. Mybatis延迟加载
Mybatis是否支持延迟加载?
9.1 什么是延迟加载
9.1 延迟加载的原理
- 使用CGLIB创建目标对象的代理对象
- 当调用目标方法user.getOrderList()时,进入拦截器invoke方法,发下user.getOrderList()是null值,执行sql查询order列表
- 把order查询上来,然后调用user.setOrderList(List<Order> orderList),接着完成user.getOrderList()方法的调用
总结
十. Mybatis一级二级缓存
Mybatis的一级,二级缓存用过吗?
10.1 一级缓存
基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存
10.2 二级缓存
基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储
二级缓存默认是关闭的
开启方式,两步走:
1. 全局配置文件
2.映射文件
使用<cache/>标签让当前mapper生效二级缓存
注意事项: