Spring进阶学习(附面试快速答法)

文章目录

  • 1、Bean线程安全问题
    • 小总结
    • 面试快速答法
  • 2、AOP
    • 小总结
    • 面试快速答法
  • 3、bean的生命周期
    • 小总结
    • 面试快速答法
  • 4、循环引用
    • 小总结
    • 面试快速答法
  • 5、SpringMVC的执行流程
    • 小总结
    • 面试快速答法
  • 6、Springboot自动配置原理
    • 小总结
    • 面试快速答法
  • 7、Spring框架常见注解
    • 面试快速答法
  • 8、MyBatis的执行流程
    • 面试快速答法
  • 9、Mybatis是否支持延迟加载?
    • 小总结
    • 面试快速答法
  • 10、MyBatis的一级、二级缓存
    • 小总结
    • 面试快速答法

思维导图

在这里插入图片描述

1、Bean线程安全问题

Spring框架中的单例bean是线程安全的吗?

Spring框架中的bean是单例的吗?

是的,Spring框架中有一个@Scope注解,默认的值就是singleton,单例的

在这里插入图片描述
在这里插入图片描述

但是单例bean不是线程安全的

举个栗子:我们看一段服务器中的代码片段

在这里插入图片描述

小总结

Spring框架中的单例bean是线程安全的吗?

不是线程安全的

Spring框架中有一个@Scope注解,默认的值就是singleton,单例的。

因为一般在spring的bean的中都是注入无状态的对象,没有线程安全问题

如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决

面试快速答法

在这里插入图片描述

2、AOP

什么是AOP,你们项目中有没有使用到AOP?

AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块

这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

常见的AOP使用场景:

  • 记录操作日志

  • 缓存处理

  • Spring中内置的事务处理

记录操作日志思路

在这里插入图片描述

获取请求的用户名、请求方式、访问地址、模块名称、登录ip、操作时间,记录到数据库的日志表中

比如现在有一个新增用户的逻辑

在这里插入图片描述

使用aop中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数以后,保存到数据库

Spring中的事务是如何实现的?

Spring支持编程式事务管理和声明式事务管理两种方式。

  • 编程式事务控制:需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用

  • 声明式事务管理:声明式事务管理建立在AOP之上。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
    在这里插入图片描述

Spring中事务失效的场景有哪些

主要体现对spring框架的深入理解、复杂业务的编码经验

  • 异常捕获处理

  • 抛出检查异常

  • 非public方法

情况一:异常捕获处理
在这里插入图片描述

情况二:抛出检查异常

在这里插入图片描述

情况三:非public方法导致的事务失效

在这里插入图片描述

小总结

什么是AOP

面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合

你们项目中有没有使用到AOP

记录操作日志,缓存,spring实现的事务

核心是:使用aop中的环绕通知+切点表达式(找到要记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等),获取到这些参数以后,保存到数据库

Spring中的事务是如何实现的?

其本质是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

Spring中事务失效的场景有哪些

①异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出

②抛出检查异常,配置rollbackFor属性为Exception

③非public方法导致的事务失效,改为public

面试快速答法

在这里插入图片描述
在这里插入图片描述

3、bean的生命周期

我们需要了解Spring容器是如何管理和创建bean实例的,方便调试和解决问题

BeanDefinition

Spring容器在进行实例化时,会将xml配置的的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean

在这里插入图片描述

我们看一下BeanDefinition接口提供的方法

在这里插入图片描述

  • beanClassName:bean 的类名
  • initMethodName:初始化方法名称
  • properryValues:bean 的属性值
  • scope:作用域
  • lazyInit:延迟初始化

接下来我们看整个的流程

在这里插入图片描述

小总结

Spring的bean的生命周期

①通过BeanDefinition获取bean的定义信息

②调用构造函数实例化bean

③bean的依赖注入

④处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)

⑤Bean的后置处理器BeanPostProcessor-前置

⑥初始化方法(InitializingBean、init-method)

⑦Bean的后置处理器BeanPostProcessor-后置

⑧销毁bean

面试快速答法

在这里插入图片描述
在这里插入图片描述

4、循环引用

Spring中的循环引用

比如说现在有两个类

在这里插入图片描述

在创建A对象的同时需要使用到B对象,在创建B对象的同时需要使用到A对象

接下来看看死循环产生的过程

在这里插入图片描述

那怎么解决呢?

spring提供了三级缓存来解决循环依赖问题,对应的三级缓存如下所示:

在这里插入图片描述

缓存名称源码名称作用
一级缓存singletonObjects单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
二级缓存earlySingletonObjects缓存早期的bean对象(生命周期还没走完)半成品
三级缓存singletonFactories缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖

在这里插入图片描述

如果要想打破循环依赖, 就需要一个中间人的参与, 这个中间人就是二级缓存。

在这里插入图片描述

一级缓存和二级缓存能解决一般对象的循环依赖,但如果对象是代理对象呢,就需要借助三级缓存

三级缓存解决循环依赖

在这里插入图片描述

三级缓存解决了大部分的循环依赖问题(也就是setter方法注入的循环依赖 )

那构造方法出现了循环依赖又该如何解决呢?

在这里插入图片描述

小总结

Spring中的循环引用?

循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A

循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖

①一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象

②二级缓存:缓存早期的bean对象(生命周期还没走完)

③三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

构造方法出现了循环依赖怎么解决?

A依赖于B,B依赖于A,注入的方式是构造函数

原因:由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入

解决方案:使用@Lazy进行懒加载,什么时候需要对象再进行bean对象的创建

面试快速答法

在这里插入图片描述
在这里插入图片描述

5、SpringMVC的执行流程

SpringMVC的执行流程知道嘛

Springmvc的执行流程是这个框架最核心的内容

  • 视图阶段(老旧JSP等)

  • 前后端分离阶段(接口开发,异步)

在这里插入图片描述

在这里插入图片描述

小总结

SpringMVC的执行流程知道嘛(版本1:视图版本,jsp)

① 用户发送出请求到前端控制器DispatcherServlet

②DispatcherServlet收到请求调用HandlerMapping(处理器映射器)

③HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给 DispatcherServlet。

④DispatcherServlet调用HandlerAdapter(处理器适配器)

⑤HandlerAdapter经过适配调用具体的处理器(Handler/Controller)

⑥Controller执行完成返回ModelAndView对象

⑦HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet

⑧DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)

⑨ViewReslover解析后返回具体View(视图)

⑩DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)

⑪DispatcherServlet响应用户

SpringMVC的执行流程知道嘛(版本2:前后端开发,接口开发)

①用户发送出请求到前端控制器DispatcherServlet

②DispatcherServlet收到请求调用HandlerMapping(处理器映射器)

③HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。

④DispatcherServlet调用HandlerAdapter(处理器适配器)

⑤HandlerAdapter经过适配调用具体的处理器(Handler/Controller)

⑥方法上添加了@ResponseBody

⑦通过HttpMessageConverter来返回结果转换为JSON并响应

面试快速答法

在这里插入图片描述
在这里插入图片描述

6、Springboot自动配置原理

Springboot中最高频的一道面试题,也是框架最核心的思想

我们看一下项目的启动类

在这里插入图片描述

点进源码:
在这里插入图片描述

我们点进RedisAutoConfiguration看看

在这里插入图片描述

小总结

Springboot自动配置原理

1, 在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

  • @SpringBootConfiguration

  • @EnableAutoConfiguration

  • @ComponentScan

2, 其中@EnableAutoConfiguration是实现自动化配置的核心注解。 该注解通过@Import注解导入对应的配置选择器。

内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。 在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。

3, 条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。

面试快速答法

在这里插入图片描述

7、Spring框架常见注解

  • Spring 的常见注解有哪些?

  • SpringMVC常见的注解有哪些?

  • Springboot常见注解有哪些?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

面试快速答法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、MyBatis的执行流程

在这里插入图片描述

①读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件

②构造会话工厂SqlSessionFactory

③会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)

④操作数据库的接口,Executor执行器,同时负责查询缓存的维护

⑤Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息

⑥输入参数映射

⑦输出结果映射

面试快速答法

在这里插入图片描述

9、Mybatis是否支持延迟加载?

Mybatis支持延迟记载,但默认没有开启

什么叫做延迟加载?

举个栗子:现在有一个用户表和一个订单表

在这里插入图片描述
在这里插入图片描述

小总结

MyBatis是否支持延迟加载?

  • 延迟加载的意思是:在需要用到数据的时候才进行加载,不需要用到数据时就不加载数据
  • MyBatis支持一对一关联对象和一对多关联集合对象的延迟加载
  • 在MyBatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false,默认是关闭的

延迟加载的底层原理知道吗?

  1. 使用CGLIB创建目标对象的代理对象

  2. 当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询

  3. 获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了

面试快速答法

在这里插入图片描述
在这里插入图片描述

10、MyBatis的一级、二级缓存

本地缓存,基于PerpetualCache,本质是一个HashMap

  • 一级缓存:作用域是session级别

  • 二级缓存:作用域是namespace和mapper的作用域,不依赖于session

一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存

在这里插入图片描述

二级缓存:基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用 PerpetualCache,HashMap 存储

在这里插入图片描述

注意事项:

  1. 对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear

  2. 二级缓存需要缓存的数据实现Serializable接口

  3. 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中

小总结

Mybatis的一级、二级缓存用过吗?

  • 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存

  • 二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用 PerpetualCache,HashMap 存储。需要单独开启,一个是核心配置,一个是mapper映射文件

Mybatis的二级缓存什么时候会清理缓存中的数据?

当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear

面试快速答法

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4861.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库原理】MyShop 商城数据库设计(SQL server)

MyShop 商城数据库设计 项目背景定义课程设计要求概念结构设计逻辑结构设计数据结构的描述用户信息数据结构的描述地址信息数据结构的描述商品类别数据结构的描述商品数据结构的描述购物车数据结构的描述订单数据结构的描述订单项数据结构的描述 物理结构设计用户表结构地址表结…

2013年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。🐳 💕兴趣爱好:b站天天刷&…

基于appnium+python+夜神模拟器的自动化

目录 1、安装夜神模拟器 2、定位元素 3、开始编码 首先搭好appnium环境!参考https://www.cnblogs.com/testlearn/p/11419797.html 1、安装夜神模拟器 下载安装夜神模拟器后,在cmd命令输入adb connect 127.0.0.1:62001,显示出设备则表示…

Elasticsearch:实用 BM25 - 第 2 部分:BM25 算法及其变量

这是第一部分 “Elasticsearch:实用 BM25 - 第 1 部分:分片如何影响 Elasticsearch 中的相关性评分” 的续篇。 BM25算法 我将尽可能深入这里的数学以解释正在发生的事情,但这是我们查看 BM25 公式的结构以深入了解正在发生的事情的部分。 首…

threejs使用外部模型

个人博客地址: https://cxx001.gitee.io 前面我们都是用Threejs提供的几何体来创建网格,对于简单几何体(如球体和方块)来说非常有效,但当你想要创建复杂的三维模型时,这不是最好的方法。通常情况下,你可以使用三维建模工具&#…

Kafka详解

文章目录 1、kafka简单介绍2、kafka使用场景3、kafka基本概念4、kafka集群1、数据冗余2、分区的写入1、使用 Partition Key 写入特定 Partition2、由 kafka 决定3、自定义规则 3、读取分区数据 5、提交策略6、kafka如何保证高并发 1、kafka简单介绍 kafka是一款分布式、支持分…

IDEA远程DeBug调试

1. 介绍 当我们在开发过程中遇到一些复杂的问题或需要对代码进行调试时,远程调试是一种非常有用的工具。使用 IntelliJ IDEA 进行远程调试可以让你在远程服务器上的应用程序中设置断点、查看变量和执行调试操作。 远程调试的好处如下: 提供更方便的调试…

《Opencv3编程入门》学习笔记—第十一章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第十一章 特征检测与匹配 一、SURF特征点检测 太复杂了!全是公式! (一)SURF算法概览 SURF,SpeededUp Rebus…

无广告 齐全 简洁 免费的音乐开源软件(支持 电脑max win linux 手机 )——lxMusic

无广告 齐全 简洁 免费的音乐开源软件(支持 电脑max win linux 手机 )——lxMusic 话不多说先上效果 (真香) 下载地址(官方) https://www.lanzoui.com/b0bf2cfa/ 密码:glqw 软件安装包说明 文…

对 tcp out-of-window 的安全建议

TCP 收到一个 out of window 报文后会立即回复一个 ack,这是 RFC793 中 SEGMENT ARRIVES 段的要求。但这是为什么?难道不是默默丢弃才对吗? 对 oow 报文回复 ack,岂不是把正确的 ack 号回过去了吗,这样攻击者盲打一番…

Qt在Ubuntu下如何进行桌面软件开发?

文章目录 0.引言1.新建项目2.编写第一个程序3.在Qt外部启动程序 0.引言 笔者研究的方向涉及在ubuntu中运行代码,早先是直接利用控制台运行代码文件,在控制台中虽然设法将代码精简到一个三个文件中,只需要在控制台运行这三个文件即可&#xff…

MySQL数据库增删改查及聚合查询SQL语句学习汇总

目录 数据库增删改查SQL语句 MySQL数据库指令 1.查询数据库 2.创建数据库 3.删除数据库 4.选择数据库 创建表table 查看所有表 创建表 查看指定表的结构 删除表 数据库命令进行注释 增删改查(CRUD)详细说明 增加 SQL库提供了关于时间的…