Java开发之框架(spring、springmvc、springboot、mybatis)【面试篇 完结版】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、框架知识分布
  • 二、Spring
    • 1. spring-单例bean
      • ① 问题引入
      • ② 单例bean是线程安全的吗
      • ③ 问题总结
      • ④ 实战面试
    • 2. spring-AOP
      • ① 问题引入
      • ② AOP记录操作日志
      • ③ Spring事务如何实现的
      • ④ 问题总结
    • 3. Spring-事务失效的场景
      • ① 问题引入
      • ② 情况一:异常捕获处理
      • ③ 情况二:抛出检查异常
      • ④ 非public方法导致事务失效
      • ⑤ 问题总结
    • 4. Spring-bean的生命周期(难)
      • ① 问题引入
      • ② BeanDefinition(Bean的定义信息)
      • ③ 问题总结
    • 5. Spring-bean的循环依赖
      • ① 问题引入
      • ② Spring的循环依赖
      • ③ 问题总结
  • 三、SpringMVC
    • 1. SpringMVC-执行流程
      • ① 问题引入
      • ② 视图阶段(JSP)
      • ③ 前后端分离阶段(接口开发,异步)
      • ④ 问题总结
  • 四、SpringBoot
    • 1. springboot-自动配置
      • ① 问题引入
      • ② 问题总结
  • 五、Spring-框架中常见的注解
    • 1. spring常见的注解
    • 2. springMVC常见注解
    • 3.springboot常见注解
  • 六、Mybatis
    • 1. Mybatis-执行流程
      • ① 问题引入
      • ② Mybatis执行流程
    • 2. Mybatis支持延迟加载
      • ① 问题引入
      • ② 立即加载
      • ③ 延迟加载
      • ④ 问题总结
    • 3. Mybatis-一级二级缓存
      • ① 问题引入
      • ② 一级缓存
      • ③ 二级缓存
      • ④ 问题总结
  • 引用说明


前言

本文主要记录spring的单例bean、切面编程AOP、spring事务、循环依赖、常见注解等


提示:以下是本篇文章正文内容,下面案例可供参考

一、框架知识分布

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

二、Spring

1. spring-单例bean

① 问题引入

在这里插入图片描述
Spring框架中的bean是单例的
在这里插入图片描述
singleton :bean在每个Spring IOC容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。

② 单例bean是线程安全的吗

count是可修改的成员变量需要考虑线程安全
userService是无法修改的成员变量不需要考虑线程安全
在这里插入图片描述

③ 问题总结

在这里插入图片描述

④ 实战面试

在这里插入图片描述

2. spring-AOP

① 问题引入

在这里插入图片描述
AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码降低模块间的耦合度,同时提高了系统的可维护性。

常见的AOP使用场景:
1.记录操作日志(每一个service记录操作)
2.缓存处理(业务加缓存,写在AOP的切面拦截需要添加缓存的业务方法)
3.Spring中内置的事务处理

② AOP记录操作日志

获取请求的用户名、请求方式、访问地址、模块名称、登录ip、操作时间,记录到数据库的日志表中,如下图所示:
在这里插入图片描述
后台有四个请求接口,需要记录操作日志,使用AOP提供的环绕通知做一个切面,相当于一个通过的代码,遇到请求的时候就可以执行这段代码。
在这里插入图片描述
代码解释:https://zhuanlan.zhihu.com/p/596205936?utm_id=0

③ Spring事务如何实现的

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

  1. 编程式事务控制:需使用TransactionTemplate来进行实现,对业务代码有侵入性,项目中很少使用
  2. 声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能**,对方法前后进行拦截**,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。(常用)
    在这里插入图片描述

④ 问题总结

在这里插入图片描述

3. Spring-事务失效的场景

① 问题引入

在这里插入图片描述
对spring框架的深入理解、复杂业务的编码经验

  1. 异常捕获处理
  2. 抛出检查异常
  3. 非public方法

② 情况一:异常捕获处理

转账的代码中出现一个异常,由于这个异常会被try-catch捕获却没有抛出,所以可能导致事务失效(如果异常没有被捕获,就会发生事务回滚)
在这里插入图片描述
原因分析: 事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉
解决方法: 在catch块添加throw new RuntimeException(e)抛出
在这里插入图片描述

③ 情况二:抛出检查异常

系统找不到指定文件,抛出一个检查异常
在这里插入图片描述
原因分析: Spring 默认只会回滚非检查异常
解决方法: 配置rollbackFor属性Transactional(rollbackFor=Exception.class),一旦出现异常都会被事务控制
在这里插入图片描述

④ 非public方法导致事务失效

方法没有用public
在这里插入图片描述
原因分析: Spring为方法创建代理、添加事务通知、前提条件都是该方法是public的
解决方法: 方法改为public

⑤ 问题总结

在这里插入图片描述

4. Spring-bean的生命周期(难)

① 问题引入

在这里插入图片描述
Spring容器是如何管理和创建bean实例
方便调试和解决问题

② BeanDefinition(Bean的定义信息)

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

③ 问题总结

在这里插入图片描述

5. Spring-bean的循环依赖

① 问题引入

在这里插入图片描述
在创建A对象的同时需要使用的B对象,在创建B对象的同时需要使用到A对象

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

② Spring的循环依赖

在这里插入图片描述

Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:
在这里插入图片描述
如果要想打破循环依赖,就需要一个中间人的参与,这个中间人就是二级缓存。
一级和二级缓存可以解决一般对象的循环依赖
在这里插入图片描述
代理对象需要用到三级缓存
在这里插入图片描述
构造方法注入产生的循环依赖问题,使用延迟加载解决问题
在这里插入图片描述

③ 问题总结

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

三、SpringMVC

1. SpringMVC-执行流程

① 问题引入

在这里插入图片描述
Springmvc的执行流程是这个框架最核心的内容

  1. 视图阶段(老旧JSP等)
  2. 前后端分离阶段(接口开发,异步)

② 视图阶段(JSP)

重要的组件:前端控制器、处理器映射器、处理器适配器、视图解析器
在这里插入图片描述

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

在这里插入图片描述

④ 问题总结

在这里插入图片描述

在这里插入图片描述

四、SpringBoot

1. springboot-自动配置

① 问题引入

在这里插入图片描述
自动配置主要依赖于@SpringBootApplication注解,其中还包含了三个注解
在这里插入图片描述
@SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是
个配置类。
@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
@EnableAutoConfiguration: SpringBoot实现自动化配置的核心注解。

② 问题总结

在这里插入图片描述

五、Spring-框架中常见的注解

在这里插入图片描述

1. spring常见的注解

在这里插入图片描述

2. springMVC常见注解

在这里插入图片描述

3.springboot常见注解

在这里插入图片描述

六、Mybatis

1. Mybatis-执行流程

① 问题引入

在这里插入图片描述

  1. 理解了各个组件的关系
  2. Sql的执行过程(参数映射、sql解析、执行和结果处理)

② Mybatis执行流程

在这里插入图片描述

2. Mybatis支持延迟加载

① 问题引入

在这里插入图片描述

② 立即加载

查询用户信息的同时也可以查询到相关订单信息

UserMapper:
在这里插入图片描述

OrderMapper:
在这里插入图片描述

UserTest.java 打印输出用户信息
在这里插入图片描述

执行结果:
在这里插入图片描述

③ 延迟加载

fetchType="lazy" 开启局部延迟加载

UserMapper:
在这里插入图片描述

UserTest.java 打印输出用户信息
在这里插入图片描述

执行结果:先调用查询用户信息,然后因为调用了getOrderList(),所以还执行了查找对应订单的sql
在这里插入图片描述

在配置文件中开启全局延迟加载

在这里插入图片描述

延迟加载的原理

  1. 使用CGLIB创建目标对象的代理对象
  2. 调用目标方法user.getOrderList)时,进入拦截器invoke方法,发现user.getOrderList()是null值,执行sql查询order列表3.把order查询上来,然后调用user.setOrderList(List orderList),接着完成user.getOrderList()方法的调用
    在这里插入图片描述

④ 问题总结

在这里插入图片描述

3. Mybatis-一级二级缓存

① 问题引入

在这里插入图片描述

● 本地缓存:基于PerpetualCache,本质是一个HashMap
● 一级缓存:作用域是session级别
● 二级缓存:作用域是namespacemapper的作用域,不依赖于session

在这里插入图片描述

② 一级缓存

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

在这里插入图片描述
因为这两个都是查询的同一个id的用户信息,所以第二次查询的时候直接在缓存中取,而不需要再次执行SQL语句
在这里插入图片描述

③ 二级缓存

二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储(默认关闭)
在这里插入图片描述

在这里插入图片描述

开启二级缓存的两个步骤:

  1. 全局配置文件
    在这里插入图片描述

  2. 映射文件:使用<cache/>标签让当前mapper生效二级缓存
    在这里插入图片描述

  3. 执行结果:只调用了一次SQL
    在这里插入图片描述

注意事项:

  1. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被clear
  2. 二级缓存需要缓存的数据实现Serializable接口
  3. 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中、

④ 问题总结

在这里插入图片描述

引用说明

https://www.bilibili.com/video/BV1yT411H7YK?p=35&vd_source=98092b0aee05ae7c890b09fe07f13df4

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

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

相关文章

C++ - map 的 例题

前言 本博客在 一下文章关于 map 和 set 讲解之下&#xff0c;对 map 当中的 operator[] &#xff08;&#xff09;函数的功能运用&#xff0c;感受 map 功能强大。 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 给定两个数组 nums1 和 nums2 &#xff0c;返回…

9.14号作业

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 有些功能&#xff0c;不会 #include <iostream>using namespace std; //创建vector类 class Vector { private:int *data;int size;int capacity; public://无参构造Vector(){}//拷贝构造Vector(c…

【C++】常用算术生成算法

0.前言 1.accumulate #include <iostream> using namespace std;// 常用算术生成算法 #include<vector> #include<numeric> //accumulate 的调用头文件void test01() {vector<int>v;for (int i 0; i < 100; i){v.push_back(i);}int total accumu…

【zlm】 webrtc源码讲解

目录 前端WEB 服务器收到请求 服务端的处理 播放 拉流 参考文章 前端WEB 服务器收到请求 POST /index/api/webrtc?applive&streamtest&typeplay HTTP/1.1 HttpSession::onRecvHeaderHttpSession::Handle_Req_POSTHttpSession::Handle_Req_POSTif (totalConte…

Java反射机制简单入门

标题 反射能干嘛获取Class对象的三种方式下面开始重点&#xff0c;需要掌握获取类的构造器并进行操作获取成员变量获取成员方法 这块建议先听第一个视频入门&#xff0c;第二个视频深入了解 视频学习地址1 视频学习地址1 正射:知道某个类&#xff0c;类的地址&#xff0c;通过…

水一下文章

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

云服务器下如何部署Django项目详细操作步骤

前期本人完成了“编写你的第一个 Django 应用程序”&#xff0c;有了一个简单的项目代码&#xff0c;在本地window系统自测没问题了&#xff0c;接下来就想办法部署到服务器上&#xff0c;可以通过公网访问我们的Django项目。将开发机器上运行的开发版软件实际安装到服务器上进…

华三路由交换技术基础——计算机网络基础

计算机网络&#xff1a; 定义&#xff1a;一组具有自治权的计算机互联的集合 作用&#xff1a; 1.共享信息资源 2.分解式处理信息 4.负载均衡 5.综合信息服务 它是计算机技术与通信技术的两个领域的结合 一&#xff0c;计算机网络中的基本概念&#xff1a; 局域网&#xff…

springboot MongoDB 主从 多数据源

上一篇&#xff0c;我写了关于用一个map管理mongodb多个数据源&#xff08;每个数据源&#xff0c;只有单例&#xff09;的内容。 springboot mongodb 配置多数据源 临到部署到阿里云的测试环境&#xff0c;发现还需要考虑一下主从的问题&#xff0c;阿里云买的数据库&#x…

ChatGPT 和 Elasticsearch:APM 工具、性能和成本分析

作者&#xff1a;LUCA WINTERGERST 在本博客中&#xff0c;我们将测试一个使用 OpenAI 的 Python 应用程序并分析其性能以及运行该应用程序的成本。 使用从应用程序收集的数据&#xff0c;我们还将展示如何将 LLMs 成到你的应用程序中。 在之前的博客文章中&#xff0c;我们构建…

DOM渲染与优化 - CSS、JS、DOM解析和渲染阻塞问题

文章目录 DOM渲染面试题DOM的渲染过程DOM渲染的时机与渲染进程的概述浏览器的渲染流程1. 解析HTML生成DOM树&#xff1a;遇到<img>标签加载图片2. 解析CSS生成CSSOM(CSS Object Model): 遇见背景图片链接不加载3. 将DOM树和CSSOM树合并生成渲染树&#xff1a;加载可视节点…

windows mysql8.0主从配置

windows mysql8.0主从配置 一、安装两个MySQL并配置 1. 主库配置my.ini&#xff0c;我的主库是安装版 [mysqld] # 设置mysql的安装目录 basedirD:\\soft\\mysql-5.7.39 # 设置mysql数据库的存放目录 datadirD:\\soft\\mysql-5.7.39\\data #设置3306端口 port3306 #主服务器…