Java面试题库——SSM框架

ops/2024/11/2 18:09:47/

一、Spring

1.为什么使用Spring?

方便解耦,便于开发;
支持aop切面编程;
声明式事务的支持;
方便程序的测试;
方便集成各种优秀的框架;
降低JavaEE API的使用难度。

2.什么是AOP?

AOP面向切面编程:通过预编译的方式和运行期间动态代理实现程序功能的统一维护的一种技术。
通俗解释:在运行期间,动态的将代码切入到类的指定方法、指定位置的编程思想就是面向切面的编程。

3.什么是IOC?

IOC控制反转:它是一种设计思想,在java开发中,将设计好的对象交给容器控制,而不是显示地用代码进行对象的创建。
把创建和查找依赖对象的控制权交给IOC容器,由IOC容器进行注入、组合对象,这样对象与对象之间是低耦合,便于测试,功能可复用,使得程序的整个体系结构可维护、灵活性、扩展性变高。

4.spring主要有哪些模块?

Spring Core:框架的基础部分,提供IOC容器,对bean进行管理。
Spring Context:基于bean提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。
Spring DAO:提供了JDBC的抽象层,它可消除冗长的JDBC编程和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。
Spring ORM:提供常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、hibernate、Mybatis等。
Spring AOP:提供面向切面编程。
Spring Web:提供了基础的Web开发的上下文信息,可与其他Web进行集成。
Spring Web MVC:提供了Web应用的Model0-View-Controller全功能实现。

5.Spring常用的注入方式

setter(设值)注入
构造器注入
基于注解的注入

6.spring提供的注解类有哪些?

@Component:可以用于注解所有bean
@Repository:主要用于注解dao层的bean
@Controller:主要用于注解控制层的bean
@Service:主要用于注解服务层的bean
@Scope:用于指定对象作用范围

7.Bean的作用域

singleton:单例,默认作用域
prototype:原型,每次创建一个新对象
request:请求,每次HTTP请求创建一个新对象,适用于WebApplicationContext环境下
session:会话,同一个会话共享一个实例,不同会话使用不同实例
application:生命周期
websocket:生命周期

8.spring里的bean是线程安全的吗?

Spring中的Bean本身不具备线程安全的特性

9.spring自动装配bean有哪些方式?

default:默认的方式,和no方法一样
no:不自动装配,需要使用<ref/>节点或参数
byName:根据名称装配
byType:根据类型装配
constructor:根据构造函数进行装配

10.spring实现事务的方式有哪些?

编程式事务管理,需要在代码中调用beginTransaction()、commit()、rolback()等事务管理相关的方法。
基于TransactionProxyFactoryBean的声明式事务管理
基于@Transactional的声明式事务管理
基于Aspectj AOP配置事务

11.事务隔离级别

READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

12.事务产生的并发问题

脏读:表示一个事务能够读取到另一个事务还未提交的数据。
不可重复读:是指在一个事务内,多次读同一数据,读取了修改前的数据。
幻读:指同一事务内多次查询返回的结果集不一样。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

二、Spring MVC

1.说一下SpringMVC运行流程

(1)捕获:用户向服务器发送请求,请求被前端控制器DispatcherServlet捕获;
(2)查找handler:DispatcherServlet对请求URL进行解析,得到请求资源标识符URI。然后根据该URI,调用HandlerMapping处理器映射器找到具体的处理器Handler,生成处理器对象及处理器拦截器,一并返回给DispatcherServlet;
(3)执行Handler:DispatcherServlet调用HandlerAdapter处理器适配器,请求执行Handler。Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象;
(4)解析视图:DispatcherServlet将ModelAndView传给viewResolver视图解析器进行解析;
(5)渲染返回:通过ViewResolver结合Model和View,来渲染视图,DispatcherServlet将渲染结果返回给客户端。

2.SpringMVC有哪些组件?

上述流程可以看出包含以下组件:
DispatcherServlet:前端控制器:接收请求,响应结果,相当于转发器。
HandlerMapping:处理器映射器:根据请求的URL来查找Handler。
HandlerAdatpter:处理器适配器:负责执行Handler。
Handler:处理器:执行返回ModelAndView。
ViewResolver:视图解析器::进行视图解析,将ModelAndView解析成真正的视图(View)。
View:视图:View是一个接口,它的实现类支持不同的视图类型,如jsp、freemaker、pdf等。其它还有:
HandlerInterceptor:拦截器
MultipartResolver:文件上传处理器
HandlerExceptionResolver:异常处理器
HttpMessageConverter:消息转换器

3.@RequestMapping的作用是什么?

@RequestMapping是一个用来处理请求地址映射的注解,可以用在类或者方法上,用来标识http请求地址与Controller类方法之间的映射。

4.@GetMapping和 @PostMapping 区别

@GetMapping是一个组合注解 是@RequestMapping(method = RequestMethod.GET)的缩写,用于处理 HTTP GET 请求。
@PostMapping是一个组合注解 是@RequestMapping(method = RequestMethod.POST)的缩写,用于处理 HTTP POST 请求。

5.说一下@RequestBody和@ResponseBody

@RequestBody:注解实现接收http请求的JSON数据,将JSON转换为java对象。
@ResponseBody:注解实现将Controller方法的返回对象转化为json对象响应给用户。

6.forward和redirect的区别?

redirect是重定向;forward是转发。
redirect是客户端发起的请求;forward是服务端发起的请求。
redirect浏览器显示被请求的URL;forward浏览器地址不显示被请求的URL。
redirect重新开始一个request,原页面的request生命周期结束;forward另一个连接时,request变量是在其生命周期内。
redirect实质上是两次HTTP请求;forward是一次请求。

7.如何解决乱码问题?

POST请求:在web.xml文件中配置一个characterEncodingFilter过滤器,设置成utf-8。
GET请求:对参数进行重新编码。String name=New String(request.getParamter("name").getBytes("ISO8859-1","utf-8"));

三、Mybatis

1.#{}和 ${}的区别是什么?

#{}是预编译处理,${}是字符串替换
使用#{}可以预防SQL注入

2.Mybatis有几种分页方式?

数组分页
SQL分页
拦截器分页
RowBounds分页

3.RowBounds分页是一次性查询全部结果吗?为什么?

不是。Mybatis是JDBC的封装,在jdbc驱动中有一个Fetch Sise的配置,它规定了每次最多从数据库查询多少条数据,假如要查询更多的数据,它会执行next的时候,去查询更多的数据。这样可以有效的防止内存溢出。

4.Mybatis逻辑分页和物理分页的区别是什么?

逻辑分页是一次性查询很多条数据,然后再在结果中检索分页的数据,这样做的弊端是需要消耗大量的内存,有内存溢出的风险,对数据库压力较大。
物理分页是从数据库查询指定条数的数据,弥补了一次性查出所有数据的种种缺点。

5.Mybatis是否支持延迟加载?延迟加载的原理是什么?

支持。设置lazyLoadingEnable=trtue即可。
延迟加载的原理是调用的时候触发加载,而不是在初始化的时候就加载信息。

6.说一下Mybatis的缓存机制

一级缓存:一级缓存的作用域是一个sqlsession对象,第一次查询数据时会保存到sqlsession对象中,第二次如果查询相同的数据,则直接从sqlsession获取,直接获取的前提是这期间这个对象中的数据没有改变,即增删改操作;反之,若有改变,则自动清除sqlsession缓存,重新进行查询,这并不代表我们关闭了sqlsession。无需任何配置,默认开启一级缓存。
二级缓存:二级缓存是多个sqlsession共享的,是sqlsession factory级别的,根据mapper的namespace划分区域的,相同的namespace的mapper查询的数据缓存在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分的。每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询结果写入缓存。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+SQL语句。value为从查询出来映射生成的java对象。sqlsession执行insert、update、delete等操作commit提交后会清空缓存区域,防止脏读数据。缓存更新机制:当某一个作用域(一级缓存Session/二级缓存Mapper)进行了增删改操作后,默认该作用域下所有select中的缓存将被clear。

7.Mybatis和Hibernate有什么区别?

Mybatis入门比较简单,使用门槛更低
SQL直接优化上,Mybatis要比Hibernate方便
Hibernate数据库移植性远大于Mybatis
缓存机制上,Hibernate要比Mybatis更好一些

8.myBatis有哪些执行器?

SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

9.Mybatis分页插件的实现原理是什么?

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

10.Mybatis如何编写一个自定义插件?

Mybatis自定义插件主要借助Mybatis四大对象:
Executor:拦截执行器的方法(log)记录
StatementHandler:拦截sql语法构建的处理
ParameterHandler:拦截参数的处理
ResultSetHandler:拦截结果集的处理

http://www.ppmy.cn/ops/130485.html

相关文章

抖音短剧小程序上线:短视频平台的全新娱乐体验

抖音短剧小程序的开发是一个结合了创意与技术的过程&#xff0c;旨在通过简洁而富有吸引力的方式&#xff0c;向用户提供高质量的短剧内容。随着移动互联网的快速发展&#xff0c;短视频平台成为了人们日常生活中不可或缺的一部分&#xff0c;而短剧作为一种新兴的内容形式&…

Python | Leetcode Python题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution:def findMaxLength(self, nums: List[int]) -> int:# 前缀和字典: key为1的数量和0的数量的差值,value为对应坐标hashmap {0:-1}# 当前1的数量和0的数量的差值counter ans 0for i,num in enumerate(nums):# 每多一个1…

C#版的有道智云对话接口

public class YoudaoTalk { public static string appKey "您的应用ID";//"您的应用ID"; public static string appSecret "您的应用密钥";//"您的应用密钥"; //应用名称 一对一对话 //已选服务 小P老…

从0开始学统计-什么是Z-score

引言 Z-score起源于19世纪后期&#xff0c;基于标准正态分布&#xff08;高斯分布&#xff09;理论。这一概念建立在标准差的基础上&#xff0c;用于衡量数据点相对于平均值的偏离程度。通过将数据点的偏离转换为标准差单位&#xff0c;便可以使用Z-score比较不同数据集中的数…

【视频】OpenCV:识别颜色、绘制轮廓

1、安装OpenCV库 sudo apt install libopencv-dev2、链接库 将 OpenCV 头文件路径和库添加到CMake中,在 CMakeLists.txt 中添加 1)查找库 find_package(OpenCV REQUIRED) 或者 find_package(OpenCV REQUIRED core imgproc highgui) 2)添加头文件路径 include_directories…

【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台

今天我们来借助若依来快速的搭建一个基于springboot的Java管理后台&#xff0c;后台网页使用vue3和 Element Plus来快速搭建。这里我们可以借助若依自动生成Java和vue3代码&#xff0c;这就是若依的强大之处&#xff0c;即便你不会Java和vue开发&#xff0c;只要跟着石头哥也可…

传感器图像分割系统:创新探讨教学

传感器图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-ODConv&#xff06;yolov8-seg-SPDConv等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…

JS:列表操作

目录 1、列表截取2、列表数据包含3、列表筛选4、极值操作5、获取列表对象某一属性构建列表6、获取元素在列表中的下标7、列表去重 1、列表截取 列表截取&#xff1a;List.slice(start, end)&#xff0c;左闭右开 var dataList [1,2,3,4,5,6] var resultList dataList.slice(0…