面试八股文--框架篇(SSM)
一、Spring框架
1、什么是spring
Spring框架是一个开源的Java平台应用程序框架,由Rod Johnson于2003年首次发布。它提供了一种全面的编程和配置模型,用于构建现代化的基于Java的企业应用程序。Spring框架的核心特性包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问、消息传递、远程调用等。
2、Spring IoC
IoC(Inversion of Control:控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。
Q:Spring框架中的单例bean是线程安全的吗?
不是,Spring框架的默认值是singleton单例的。一般在spring的bean中注入都是无状态对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的。可以考虑使用多例(prototype)或者加锁来实现。
// 单例模式
public class Singleton {private static Singleton instance = null;private Singleton() {System.out.println("Singleton created");}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);}
}
3、AOP(Aspect-Oriented Programming:面向切面编程)
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
4、Spring MVC
Spring MVC是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

当然,这是传统的Spring MVC框架,前后端分离时,后端通常不再返回具体的视图,而是返回纯数据(通常是 JSON 格式),由前端负责渲染和展示。因此Controller会直接返回JSON数据交由前端处理,这是通过@RestController实现的
4、Spring框架的常见注解
- Spring:@Component、@Controller、@Service、@Repository、@Autowired、@Bean、@Aspect、@Before、@After
- SpringMVC:@RequestMapping、@RequestBody、@RequesParam、@ResponseBody
- SpringBoot:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
5、SpringBoot自动配置
在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解对三个注解进行了封装,分别是:
· @SpringBootConfiguration
· @EnableAutoConfiguration
· @ComponentScan
其中@EnableAutoConfiguration是实现自动化配置的核心注解,该注解通过@import注解导入对应的配置选择器。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。
@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching
@EnableScheduling
public class SkyApplication {public static void main(String[] args) {SpringApplication.run(SkyApplication.class, args);log.info("server started");}
}
6、常见的请求类型
5 种常见的请求类型:
- GET:请求从服务器获取特定资源。举个例子:
GET /users(获取所有学生) - POST:在服务器上创建一个新的资源。举个例子:
POST /users(创建学生) - PUT:更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:
PUT /users/12(更新编号为 12 的学生) - DELETE:从服务器删除特定的资源。举个例子:
DELETE /users/12(删除编号为 12 的学生) - PATCH:更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新)
二、Redis
1、Redis的介绍
(1)Redis
Redis是一个开源的(open source)、内存中的数据结构存储系统,它支持多种数据结构,如字符串、哈希表、列表、集合、有符号整数和浮点数等,并提供了多种操作数据结构的命令。Redis基于内存的key-value结构数据库
(2)Redis数据类型
- 字符串 string :SET key value,GET key
- 哈希 hash:HSET key filed value,HGET key filed
- 列表 list:LPUSH key value, RPOP key
- 集合 set:SADD key mebmer, SMEMBERS key
- 有序集合 sorted set:ZADD key score member
2、Redis的作用--缓存
使用Redis作为访问和数据库(DB)之间的纽带,遇到查询,先查Redis缓存,查到了直接返回,没查到再去数据库,这样能提高访问效率,减小数据库压力。但可能会有以下问题:
(1)击穿:指的是大量无效的查询一直进行访问,Redis中查不到,要持续访问DB,给DB带来负担,甚至导致崩溃(恶意访问,攻击)
解决方法:- 无效查询就在Redis中存储空字符串,可以不用访问DB(但可能存储大量空字符串)
- 采用布隆过滤器(常见操作)布隆过滤器使用bitmap存储,可以直接过滤掉无效访问。(但也有误判率)
(2)穿透:指的是一个热点的key过期了,但有大量查询热点key的需求到来,导致访问DB频繁,导致DB崩溃
解决方法:- 采用锁:即一个进程到来后,发现Redis中没有该缓存,直接获得锁,然后去数据库中查询,其他进程来了之后,由于没有获得锁,只能等待。查询成功后存入Redis,可以直接返回(高一致性,但可用性低)
- 采用逻辑过期:热点key不让其真正过期,而使用一个逻辑过期字段,这样一个进程进行查询后,直接返回旧值,然后获得一个锁,建立一个新的进程去数据库进行查找,其他进程来了之后,由于没有锁,因此也无法访问数据库,直接返回旧值,直到该查询更新(保证了高可用性,但一致性低)
(3)雪崩:很多key同时过期,而当大量查询来的时候,会给数据库造成压力,导致DB崩溃。
解决方法:给不同的key设置不同的过期时间,例如1-5min随机random
(4)双写一致性:提问(Redis作为缓存,mysql的数据如何和redis进行同步呢?)
解决方法:延迟双删(删除缓存--修改数据库--(延时)--删除缓存 -->依旧有脏数据风险
要保证一致性:加锁! 为了提高性能:采用共享锁(可以读不能写)和读写锁(读写都不行,也叫排他锁)
提高可用性,只能保证最终一致性:- 异步通知(MQ、canal(基于mysql))
(5)持久化(Redis作为缓存数据的持久化是怎么做的?)
Redis提供了两种策略:RDB和AOF
- RDB(Redis Database Backup files)是一个快照文件,用于将redis内存中的数据存储到磁盘中,当redis实例宕机恢复数据的时候,可以从RDB快照中直接恢复
- AOF(Append Only files)的含义是追加文件,当Redis中有操作写命名时,AOF会记录下这些命令,当redis实例宕机恢复数据的时候,可以重新执行一遍命令来恢复数据
- RDB更快,但可能丢失数据,AOF慢,但丢数据风险小很多,一般一起用
(6)数据过期策略
Redis的数据过期策略:
- 惰性删除:设置过期时间,当访问key的时候,查看是否过期,过期则删除,反之返回
- 定期删除:每隔一段时间就对一些key进行检查,删除里面的过期key。两种模式:SLOW是定时任务,默认10hz,每次不超过25ms,FAST频率不固定
- 一般惰性删除+定期删除两种配合使用
(7)数据淘汰策略(内存不足怎么办)
redis中提供了多种数据淘汰策略,默认是noeviction,即不删除任何数据,当内存不足的时候直接报错。但我们也可以采取其他方式,其中有两个重要概念,一个是LRU(最近最少使用),当前时间减去最近一次使用时间,越大则删除优先级越高,一般是对热点数据的保存。另一个是LFU(最少频率使用),是一段时间内的访问频率,频率越低删除优先级越高。
策略:allkeys-lru淘汰策略,这样留下来的都是热点key
3、Redis的作用--分布式锁
Redis的分布式锁主要利用Redis的setnx命令,其底层是lua脚本实现的(保证原子性)

redisson实现的分布式锁--可重入,在Redission的分布式锁中提供了一个WatchDog,一个线程获取锁成功后,WatchDog会给持有锁的线程续期。
redission实现的分布式锁--主从一致性:RedLock(红锁):不能在一个redis实例上创建锁
三、Mybatis
1、Mybatis介绍
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。
2、常见问题
Q1:#{} 和 ${} 的区别是什么?
-
#{}是预编译处理,防止 SQL 注入,sql查询时会替换为?
<select id="countByMap" resultType="java.lang.Integer">select count(id) from user<where><if test="begin != null">and create_time >= #{begin}</if><if test="end != null">and create_time <= #{end}</if></where>
</select>
-
${}是字符串替换,有 SQL 注入风险
select * from users order by ${orderCols}
-
一般参数传递使用
#{},动态表名/列名使用${}
Q2:MyBatis 的动态 SQL 有哪些标签?
-
<if>、<choose>/<when>/<otherwise> -
<trim>、<where>、<set> -
<foreach>:常用于 IN 查询 -
<bind>:创建变量
Q3:如何实现分页查询?
-
物理分页:使用 PageHelper 插件
PageHelper.startPage(pageNum,pageSize);
-
逻辑分页:RowBounds(不推荐)
-
手动编写 LIMIT 语句
Q4:MyBatis 的 xml 映射文件中,不同的 xml 映射文件,id 是否可以重复?
不同的 xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复;毕竟 namespace 不是必须的,只是最佳实践而已。
原因就是 namespace+id 是作为Map<String, MappedStatement>的 key 使用的,如果没有 namespace,就剩下 id,那么,id 重复会导致数据互相覆盖。有了 namespace,自然 id 就可以重复,namespace 不同,namespace+id 自然也就不同。
四、Maven
1、maven介绍
Maven 是一个强大的项目管理和构建工具,主要用于 Java 项目。它提供了一套标准化的项目结构、依赖管理和构建生命周期
核心特点:
-
依赖管理:自动下载和管理项目所需的库文件(JAR)
-
标准化项目结构:约定优于配置
-
构建生命周期:定义明确的构建阶段(compile, test, package等)
-
插件体系:丰富的插件支持各种构建需求
-
多模块支持:便于管理大型项目的多个子模块
2、常见问题
Q1:Maven 的坐标(GAV)是什么?
-
groupId:组织或项目的唯一标识(如:com.company.project) -
artifactId:项目的唯一模块标识 -
version:项目的版本号
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
Q2:依赖冲突如何解决?
-
最短路径优先
-
声明优先(先声明的依赖优先)
-
使用
<exclusions>排除特定依赖 -
使用
mvn dependency:tree分析依赖树
Q3:Maven 的生命周期有哪些阶段?

-
package 和 install 的区别?
-
package:打包到项目的target目录 -
install:打包并安装到本地仓库
-
都看到这里了,给个小心心♥呗~
相关文章:
面试八股文--框架篇(SSM)
一、Spring框架 1、什么是spring Spring框架是一个开源的Java平台应用程序框架,由Rod Johnson于2003年首次发布。它提供了一种全面的编程和配置模型,用于构建现代化的基于Java的企业应用程序。Spring框架的核心特性包括依赖注入(DI…...
跨语言语言模型预训练
摘要 最近的研究表明,生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中,我们将这一方法扩展到多种语言,并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型(XLM)的方法:一种…...
[识记]Mysql8 远程授权
今天在测试docker时,因更换为Mysql8,使用SQL方式实现远程授权,其方式方法同于Mysql,但语句稍有不同,仅供参考。 登录mysql mysql -u root -p 输入密码: [请依据交互输入你的mysql密码]切换数据库 use mysql;选择需要…...
Nodejs上传文件的问题
操作系统:window和linux都会遇到 软件环境:v20.10.0的Nodejs 1、前端代码如下: 2、后端Nodejs 2.1、注册接口 2.2、上传接口 其中memoryUpload方法代码如下: 3、用页面上传文件 查看具体报错原因: TypeError: sourc…...
无人机螺旋桨平衡标准
螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音,并加速关键部件的磨损,从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架,定义了可接受的不平衡…...
Qt开发:双缓冲机制
文章目录 什么是双缓冲机制?Qt 中的双缓冲实现方式 什么是双缓冲机制? 双缓冲(Double Buffering) 是一种减少屏幕绘制闪烁的技术,广泛用于图形渲染和游戏开发。 它的基本原理是: 先在后台缓冲区࿰…...
HandyJSON原理
HandyJSON 的优势 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 应用广泛. 在 App 的使用过程中, 服务端给移动端发送的大部分都是 JSON 数据, 移动端需要解析数据才能做进一步的处理. 在解析JSON数据这一块, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …...
SpringBoot+策略模式+枚举类,使用配置文件改进,优雅消除if-else,完全符合OOP原则
需求分析 公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...
[力扣每日一练]关于MySQL和pandas的正则表达式应用
一:题目要求 表:Users-------------------------- | Column Name | Type | -------------------------- | user_id | int | | email | varchar | -------------------------- (user_id) 是这张表的唯一主键。 每一行包含用…...
每日免费分享之精品wordpress主题系列~DAY16
主题介绍: 今日在网上寻找wordpress主题的时候逛到了大叔的网站,赶脚这个主题蛮不错的,于是百度一下,果然,这个主题很受欢迎。作为主题下载站追梦者也不甘落后,马上就发布出来了,希望对你们有用…...
OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程,隐藏了许多底层细节…...
MySQL 用户权限与安全管理
MySQL 用户权限与安全管理 在数据库系统中,用户权限与安全管理是保障数据安全性、完整性和隐私性的核心机制。MySQL 提供了丰富的权限管理功能,可以精细地控制用户对数据库、表以及其他数据库对象的访问权限,同时也支持各种安全管理策略来防…...
dify + deepseek /qwen + win +xinference 等完成知识库建设
Dify.AI The Innovation Engine for Generative AI Applications 简介:Dify是一个用于构建人工智能应用程序的开源平台。我们将后端即服务和LLMOps相结合,简化了生成式人工智能解决方案的开发,使开发人员和非技术创新者都可以使用。CPU>…...
模数转换电路(A/D转换器)
A/D转换,是将输入的模拟电压量转换成相应的数字量。 A/D转换器的类型很多,按工作原理可分为直接转换型和间接转换型两大类。前者直接将模拟电压量转换成数字量,后者是先将模拟电压量转换成一个中间量,再将中间量转换成数字量。 …...
算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码
一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…...
OpenAI深夜直播「偷袭」谷歌!GPT-4o原生图像生成:奥特曼带梗图,AGI战场再燃战火
引言:AI战场的「闪电战」 当谷歌刚刚发布「地表最强」Gemini 2.5 Pro时,OpenAI立即以一场深夜直播「闪电反击」——GPT-4o的原生图像生成功能正式上线!从自拍变梗图到相对论漫画,奥特曼(OpenAI团队)用一连…...
【深度学习】Cross-Attention(交叉注意力)机制详解与应用
Cross-Attention(交叉注意力)机制详解与应用 文章目录 Cross-Attention(交叉注意力)机制详解与应用引言什么是Cross-Attention?Cross-Attention的数学表示Cross-Attention与Self-Attention的区别Cross-Attention的应用…...
《大语言模型赋能证券业开发安全:海云安技术方案在上交所专刊发表》
近日,海云安《大语言模型在证券业开发安全领域的探索与实践》技术方案经过上海证券交易所(以下简称”上交所“)行业专家评审后正式收录于《交易技术前沿——网络安全专刊(2025年第1期 总第61期)》。 证券信息技术研究…...
光流 | 基于光流的人体异常行为检测算法原理,公式,算法改进,matlab代码
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 人体异常行为检测 一、算法原理与数学模型1. 核心原理2. 关键公式二、算…...
【蓝桥杯】单片机设计与开发,中断系统,外部中断(下)
一、例程一:外部中断执行函数 #include<stc15.h>void main(void) {P20XA0;P00X00;P20X80;P00XFF;IT00;//设置外部中断0;上升沿下降沿均可//IT01;//设置外部中断0;仅下降沿EX01;//允许中断0申请中断EA 1;//打开CPU总中断while(1); }voi…...
【测试工具】如何使用 burp pro 自定义一个拦截器插件
在 Burp Suite 中,你可以使用 Burp Extender 编写自定义拦截器插件,以拦截并修改 HTTP 请求或响应。Burp Suite 支持 Java 和 Python (Jython) 作为扩展开发语言。以下是一个完整的流程,介绍如何创建一个 Burp 插件来拦截请求并进行自定义处理…...
MySQL、创建数据库、表、SQL 函数:数学函数、字符串函数、日期函数、聚合函数
DAY18.1 Java核心基础 MySQL 创建数据库 数据库是一个服务,实际开发需要根据具体的项目创建对应的数据库实例 create database mytest1 default character set utf8 collate utf8_general_ci; create database mytest2 default character set utf8 collate utf8…...
关于我对接了deepseek之后部署到本地将数据存储到mysql的过程
写在前面 今天写一下使用nodejs作为服务端,vue作为客户端,mysql的数据库,对接deepseek的全过程,要实现一个很简单的效果就是,可以自由的询问,然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…...
23种设计模式-策略(Strategy)设计模式
策略设计模式 🚩什么是策略设计模式?🚩策略设计模式的特点🚩策略设计模式的结构🚩策略设计模式的优缺点🚩策略设计模式的Java实现🚩代码总结🚩总结 🚩什么是策略设计模式…...
【Exception】MybatisPlusException: can not find lambda cache for this entity
文章目录 环境 | Environment复现步骤 | Reproduction steps报错日志 | Error log源码 | Source CodeUserServiceImpl.javaAddressServiceImpl.javaAbstractSubTableBaseServiceImpl.javaUserEntity.javaAddressEntity.javaSubTableBaseEntity.java 原因分析 | Analysis解决方案…...
vue ts+Windi CSS
1、创建vue项目 trae(字节)打开一个空文件夹 npm install -g vue/cli vue create my-project cd my-project vue add typescript npm run serve vue项目创建完成 2、安装windicss vue add windicss vue.config.js配置 npm install vue-router …...
ffmpeg系列(三)—— 音频重采样
SwrContext 一、SwrContext 的重要字段 SwrContext 是音频重采样的核心配置对象,其关键字段决定了重采样的行为和性能。以下是常用字段及其作用: 字段名称类型作用典型值示例in_sample_rateint输入音频的采样率(Hz)。44100out_…...
Android Gradle 插件(AGP)版本与 Gradle 版本需要严格对应
一、AGP 与 Gradle 版本对照表 Android Gradle 插件版本对应 Gradle 版本适用 Android Studio 版本8.1.x8.2Arctic Fox (2020.3.1+)8.0.x8.0Arctic Fox (2020.3.1+)7.4.x7.5.1IntelliJ IDEA 2022+7.3.x7.4IntelliJ IDEA 2022+7.2.x7.3.3IntelliJ IDEA 2021.3+7.1.x…...
Angular由一个bug说起之十五:自定义基于Overlay的Tooltip
背景 工具提示(tooltip)是一个常见的 UI 组件,用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本,所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…...
使用 Chromedp 监听网页请求和响应
使用 Chromedp 监听网页请求和响应 在进行网络爬虫的时候,有很多网站都有反爬机制,比如你想抓点数据,结果发现每次请求都带一堆奇奇怪怪的参数 —— 什么 timestamp 签名、AES 加密的字段,还有各种 Token 令牌,跟密码…...
