面试八股文--框架篇(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 &gt;= #{begin}</if><if test="end != null">and create_time &lt;= #{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:打包并安装到本地仓库

 


都看到这里了,给个小心心♥呗~

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

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

相关文章

【SQL Server数据库备份详细教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

nVisual对接企业微信实现机房设备与连接变更的自动化审批

企业微信的审批可以根据企业实际业务流程创建自动化的审批流&#xff0c;nVisual可以进行机房设备与线缆的可视化规划设计&#xff0c;结合企业微信与nVisual实现机房设备与线缆变更的自动审批&#xff0c;可以显著提高机房运维变更效率与规范性。 一、业务流程 1、业务流程 …

【PCB工艺】时序图(Timing Diagram)

时序图&#xff08;Timing Diagram&#xff09;是描述数字电路信号随时间变化的图示&#xff0c;广泛用于分析和设计时序逻辑电路&#xff0c;如锁存器&#xff08;Latch&#xff09;、触发器&#xff08;Flip-Flop&#xff09;、计数器、状态机等。这篇文章从时序图的原理、构…

华为HG532路由器RCE漏洞 CVE-2017-17215 复现

华为HG532路由器RCE漏洞 CVE-2017-17215 CVE-Description Huawei HG532 with some customized versions has a remote code execution vulnerability. An authenticated attacker could send malicious packets to port 37215 to launch attacks. Successful exploit could l…

调用deepseek大模型时智能嵌入函数

DeepSeek-R1 当前炙手可热,以其强大的自然语言处理和推理能力而广受赞誉。饶是如此,却并不原生支持函数调用(function_call),这是开发过程中不可或缺的一部分。虽有第三方调校的模型支持,然终非官方自带,还需假以时日。本文虽然简短,应该是全网写得最通透的了吧。 …

MATLAB绘图配色包说明

本栏目将分享MATLAB数据分析图表&#xff0c;该贴讲述配色包的使用 将配色包colormap_nclCM文件夹添加到路径close all&#xff08;尽量不要删&#xff09;&#xff0c;使用map colormap(nclCM(309))时会多出来一张空白图片。配色资源来自slandarer&#xff1b;找不到合适颜色…

Scala

Scala 一、Scala 简介 Scala是一种多范式的编程语言&#xff0c;融合了面向对象编程和函数式编程的特性&#xff0c;以下为你详细介绍&#xff1a; 1、起源与发展 ①起源&#xff1a;Scala由瑞士洛桑联邦理工学院的Martin Odersky教授在2001年开始设计&#xff0c;并于2004…

PostgreSQL: GIN 索引详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

方法指南:利用边缘计算实现低延迟直播流媒体服务

假设你的公司需要提供直播的流媒体服务&#xff0c;然而你们最近遇到了流量意外激增或中断的情况。那么你和你的团队可能就必须争分夺秒地排除故障修复延迟&#xff0c;毕竟这种中断可能会给观众带来严重问题&#xff0c;也会给你的团队带来巨大挑战。 问题的根源往往在于&…

MySQL数据库入门

目录 前言 一、安装软件 二、普通指令使用 三、MySQL接口API相关函数 1、API函数使用步骤 2、mysql_init-MYSQL对象初始化 3、mysql_real_connect()——数据库引擎建立连接 4、mysql_close()——关闭数据库连接 5、mysql_query()——查询数据库某表内容 6、mysql_stor…

K8S学习之基础五十七:部署代码扫描工具sonarqube

部署代码扫描工具sonarqube 拉取postgres、sonarqube镜像&#xff0c;在harbor上创建postgres、sonarqube项目&#xff0c;将镜像上传至harbordocker pull postgres docker pull sonarqube docker tat postgres:latest 172.16.80.140/postgres/postgres:latest docker tat sona…

个人学习编程(3-24) 数据结构

括号的匹配&#xff1a; if((s[i]) && now() || (s[i]] && now[)){ #include <bits/stdc.h>using namespace std;int main() {char s[300];scanf("%s",&s);int i;int len strlen(s);stack <char> st;for (i 0; i < len; i){if(…

Redis6为什么引入了多线程?

大家好&#xff0c;我是锋哥。今天分享关于【Redis6为什么引入了多线程&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis6为什么引入了多线程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 6 引入了多线程的主要目的是为了提升 Redis…

电力物联网数据采集装置 高精度电能计量表

摘要 随着现代电力系统的复杂化和负荷多样化&#xff0c;电能质量问题日益突出。高精度电能质量监测装置在配电系统中的应用&#xff0c;可以有效监测和分析谐波、不平衡、电压暂升暂降等电能质量问题&#xff0c;为电网优化运行和故障诊断提供重要数据支持。本文以APM电能质量…

element-plus中,Tour 漫游式引导组件的使用

目录 一.Tour 漫游式引导组件的简单介绍 1.作用 2.基本使用 3.展示效果 二.实战1&#xff1a;介绍患者病历表单 1.要求 2.实现步骤 3.展示效果 结语 一.Tour 漫游式引导组件的简单介绍 1.作用 快速了解一个功能/产品。 2.基本使用 从官网复制如下代码&#xff1a; &…

【Unity网络编程知识】使用Socket实现简单TCP通讯

1、Socket的常用属性和方法 创建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用属性 1&#xff09;套接字的连接状态 socketTcp.Connected 2&#xff09;获取套接字的类型 socketTcp.So…

【C++游戏引擎开发】《线性代数》(1):环境配置与基础矩阵类设计

一、开发环境配置 1.1 启用C 20 在VS2022中新建项目后右键项目 1.2 启用增强指令集 1.3 安装Google Test vcpkg安装使用指南 vcpkg install gtest:x64-windows# 集成到系统目录&#xff0c;只需要执行一次&#xff0c;后续安装包之后不需要再次执行 vcpkg integrate inst…

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

前言 在如今的 Flutter 大潮下&#xff0c;本系列是让你看完会安心的文章。本系列将完整讲述&#xff1a;如何快速从0开发一个完整的 Flutter APP&#xff0c;配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧&#xff0c;并针对…

Spring 事件监听机制介绍以及源码分析

在复杂的业务系统中&#xff0c;模块间的过度耦合往往会导致代码维护困难、扩展性受限。Spring 事件监听机制基于观察者模式&#xff0c;提供了一种优雅的解耦方案&#xff0c;使得组件间通过事件驱动实现松耦合通信。这种机制不仅被 Spring 框架内部使用&#xff08;如容器生命…

【VSCode的安装与配置】

目录&#xff1a; 一&#xff1a;下载 VSCode二&#xff1a;安装 VSCode三&#xff1a;配置 VSCode 一&#xff1a;下载 VSCode 下载地址&#xff1a;https://code.visualstudio.com/download 下载完成之后&#xff0c;在对应的下载目录中可以看到安装程序。 二&#xff1a;安装…