• Java开发之框架(spring、springmvc、springboot、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配置的的信息封装成一个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. 映射文件:使用标签让当前mapper生效二级缓存
      在这里插入图片描述

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

    注意事项:

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

    ④ 问题总结

    在这里插入图片描述

    引用说明

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

  • 相关阅读:
    Matlab之四阶龙格—库塔法方法:解常微分初值问题
    商家码收钱扣手续费吗
    php代理刷访问量(附源码)
    vTaskDelay()函数(ms级别)
    Qt翻译(本地化)坑总结
    H5游戏分享-全民找房祖名qmxzfzm
    白帽SEO是什么?白帽SEO手法有哪些?
    Socket.D v2.4.9 发布
    科幻创新基站 打造科幻产业发展新范式 ——中关村科幻产业创新中心正式启航
    什么是主机安全,为什么我们需要主机安全。
  • 原文地址:https://blog.csdn.net/qq_48592827/article/details/132799792