黑马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 延迟加载的原理

  1. 使用CGLIB创建目标对象的代理对象
  2. 当调用目标方法user.getOrderList()时,进入拦截器invoke方法,发下user.getOrderList()是null值,执行sql查询order列表
  3. 把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生效二级缓存

 注意事项:

总结

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

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

相关文章

electron下载文件

const http require(http); const https require(https); const fs require(fs); const { URL } require(url); const path require(path);// 下载文件函数 function downloadFile(url, savePath) {return new Promise((resolve, reject) > {try {console.log(开始下载…

快速掌握 GO 之 RabbitMQ 结合 gin+gorm 案例

更多个人笔记见&#xff1a; &#xff08;注意点击“继续”&#xff0c;而不是“发现新项目”&#xff09; github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习&#xff0c;学习过程中还会不断补充&…

android FragmentManager 删除所有Fragment 重建

在Android开发中&#xff0c;管理Fragment是一项常见任务&#xff0c;有时需要删除所有Fragment并重新创建。这在某些场景下&#xff0c;例如用户需要重置应用状态或切换内容时&#xff0c;显得尤为重要。本文将详细介绍如何通过 FragmentManager删除所有Fragment并重建。 一、…

ubuntu之开机自启frpc

在 Ubuntu 系统中为 frpc 设置开机自启&#xff08;以 frpc -c frpc.toml 命令为例&#xff09;&#xff0c;可以通过 systemd 服务实现。以下是详细步骤&#xff1a; 创建 systemd 服务文件 sudo vim /etc/systemd/system/frpc.service 写入以下内容&#xff08;根据你的路…

推荐一款PDF压缩的工具

今天一位小伙伴找来&#xff0c;问我有没有办法将PDF变小的办法。 详细了解了一下使用场景&#xff1a; 小伙伴要在某系统上传一个PDF文件&#xff0c;原文件是11.6MB&#xff0c;但是上传时系统做了限制&#xff0c;只能上传小于10MB的文件&#xff0c;如图&#xff1a; 我听…

JDK21深度解密 Day 11:云原生环境中的JDK21应用

【JDK21深度解密 Day 111】云原生环境中的JDK21应用 本文是《JDK21深度解密:从新特性到生产实践的全栈指南》专栏的第11天内容,聚焦云原生环境中的JDK21应用。我们将深入探讨如何在容器化、微服务、Serverless等云原生架构中充分发挥JDK21的技术优势,提升Java应用的性能、稳…

Java-redis实现限时在线秒杀功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql数据库表设…

QT- QML Layout+anchors 布局+锚点实现窗口部件权重比例分配

布局管理 简单比较两种界面管理锚点布局实现比例布局布局管理实现比例布局循环依赖问题简谈 在日常打螺丝中&#xff0c;我们偶尔会需要实现界面各组件能按比例放置&#xff0c;自适应各种分辨率的需求。我用锚点和布局都实现过相关界面&#xff0c;记录下来两种方式实现的差异…

Java项目OOM排查

排查思路 Java项目出现OOM&#xff08;Out Of Memory&#xff0c;内存溢出&#xff09;问题时&#xff0c;排查思路如下&#xff1a; 确认OOM类型&#xff1a; Java Heap Space&#xff1a;堆内存溢出&#xff0c;通常是对象创建过多或内存泄漏。PermGen Space&#xff1a;永久…

vue+threeJs 生成云状特效屏幕

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vuethreeJs 生成云状特效屏幕”。 动态云状特效示例图 二、实例代码 <!--创建一个动态数字屏幕--> <template><div class"pageBox"><div class"leftBox" ref"lef…

ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”

“高内聚、低耦合”是面向对象编程中非常重要的设计原则&#xff0c;它有助于提高代码的可维护性、扩展性和复用性。 1. 初衷&#xff1a;为什么会有这个原则&#xff1f; 在软件开发中&#xff0c;随着业务需求的复杂化&#xff0c;代码难免会变得越来越庞大。如果开发者将一…

Registry和docker有什么关系?

当遇到多个服务器需要同时传docker镜像的时候&#xff0c;一个一个的传效率会非常慢且压力完全在发送方的网络带宽&#xff1b;可以参考git hub&#xff0c;通常我们会用git push将代码传到git hub&#xff0c;如果谁需要代码用git pull就可以拉到自己的机器上&#xff0c;dock…

linux命令 systemctl 和 supervisord 区别及用法解读

目录 基础与背景服务管理范围配置文件和管理方式监控与日志依赖管理适用场景常用命令对照表实际应用场景举例优缺点对比小结参考链接 1. 基础与背景 systemctl 和 supervisord 都是用于管理和控制服务&#xff08;进程&#xff09;的工具&#xff0c;但它们在设计、使用场景和…

(11)java+ selenium->元素定位之By_tag_name

1.简介 继续WebDriver关于元素定位,这篇介绍By ClassName。tagName是DOM结构的一部分,其中页面上的每个元素都是通过输入标签,按钮标签或锚定标签等标签定义的。每个标签都具有多个属性,例如ID,名称,值类等。就其他定位符而言在Selenium中,我们使用了标签的这些属性值来…

2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家

前言 题解 2021 RoboCom 世界机器人开发者大赛-高职组&#xff08;复赛&#xff09;解题报告。 模拟题为主&#xff0c;包含进制转换等等。 最后一题&#xff0c;是对向量/自定义类型&#xff0c;重定义小于操作符。 7-1 人工智能打招呼 分值: 15分 考察点: 分支判定&…

day42 简单CNN

目录 一、从图像分类任务谈起 二、CNN架构解剖实验室 2.1 卷积层&#xff1a;空间特征的魔法师 2.2 归一化层&#xff1a;加速收敛的隐形推手 2.3 激活函数&#xff1a;非线性的灵魂 三、工程实践避坑指南 3.1 数据增强工程 3.2 调度器工程实战 四、典型问题排查手册 …

Gitee Wiki:以知识管理赋能 DevSecOps,推动关键领域软件自主演进

关键领域软件研发中的知识管理困境 传统文档管理模式问题显著 关键领域软件研发领域&#xff0c;传统文档管理模式问题显著&#xff1a;文档存储无系统&#xff0c;查找困难&#xff0c;降低效率&#xff1b;更新不及时&#xff0c;与实际脱节&#xff0c;误导开发&#xff1…

清理 pycharm 无效解释器

1. 起因&#xff0c; 目的: 经常使用 pycharm 来调试深度学习项目&#xff0c;每次新建虚拟环境&#xff0c;都是显示一堆不存在的名称&#xff0c;删也删不掉。 总觉得很烦&#xff0c;是个痛点。决定深入研究一下。 2. 先看效果 效果是能行&#xff0c;而且清爽多了。 3. …

【ConvLSTM第二期】模拟视频帧的时序建模(Python代码实现)

目录 1 准备工作&#xff1a;python库包安装1.1 安装必要库 案例说明&#xff1a;模拟视频帧的时序建模ConvLSTM概述损失函数说明&#xff08;python全代码&#xff09; 参考 ConvLSTM的原理说明可参见另一博客-【ConvLSTM第一期】ConvLSTM原理。 1 准备工作&#xff1a;pytho…

MySQL DDL操作全解析:从入门到精通,包含索引视图分区表等全操作解析

目录 一、DDL 基础概述 1.1 DDL 定义与作用 1.2 DDL 语句分类 1.3 数据类型与存储引擎 1.3.1 数据类型 1.3.2 存储引擎差异 二、基础 DDL 语句详解 2.1 创建数据库与表 2.1.1 创建数据库 2.1.2 创建表 2.2 修改表结构 2.2.1 添加列 2.2.2 修改列属性 2.2.3 删除列…