Java面试题库——SSM框架

embedded/2024/10/30 22:36:50/

一、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/embedded/133725.html

相关文章

【网络】1.UDP通信

UDP通信 1 server1.1 server建立的步骤1.2 运行server 2 client2.1 client的建立步骤2.2 运行client 3 总结3.1 server3.2 client 1 server server的启动方式是&#xff1a;./udpserver 8080 --> 格式就是./proc port端口 port端口自己指定 1.1 server建立的步骤 获取文件描…

Redis慢查询分析优化

文章目录 一、定义二、慢查询参数配置三、慢查询日志四、排查步骤五、Redis变慢原因 一、定义 在Redis执行时耗时超过某个阈值的命令&#xff0c;称为慢查询。 慢查询日志帮助开发和运维人员定位系统存在的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间&…

【GO实战课】第七讲:电子商务网站(7):性能优化和测试

1. 简介 本课程将探讨电子商务网站的性能优化和测试,以及使用GO语言实现。在本课程中,我们将介绍如何设计一个高性能、可扩展和可靠的电子商务网站,并演示如何使用GO语言编写相关代码。 本课程的目标是帮助学生理解电子商务网站的性能优化和测试原则,并提供一个实际的项目…

解决ElasticSearch启动成功却无法在浏览器访问问题

目录 前言&#xff1a; 问题复现 &#xff1a; 解决问题&#xff1a; 1、修改sysctl.conf文件 2、在sysctl.conf文件增加这段东西 3、 然后保存退出&#xff0c;输入以下命令使其生效 结语&#xff1a; 前言&#xff1a; 这篇文章是小白我今天突然启动es&#xff0c;发现e…

【视频混剪Demo】FFmpeg的使用【Windows】

#1024程序员节 | 征文# 目录 一、简介 二、音频素材页 2.1 功能描述 &#x1f449; 搜索 &#x1f449; 添加 &#x1f449; 删除 2.2 效果展示 2.3 代码实现 &#x1f449; 前端 &#x1f449; 后端 三、视频素材页 3.1 功能描述 &#x1f449; 搜索 &#x1…

力扣hot100-->递归/回溯

目录 递归/回溯 1. 17. 电话号码的字母组合 2. 22. 括号生成 3. 39. 组合总和 4. 46. 全排列 5. 78. 子集 递归/回溯 1. 17. 电话号码的字母组合 中等 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到…

macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程

想要把dmg格式转成iso格式&#xff0c;然后能在虚拟机上用&#xff0c;最起码新版的macOS镜像是不能用UltraISO&#xff0c;dmg2iso这种软件了&#xff0c;你直接转放到VMware里绝对读不出来&#xff0c;办法就是&#xff0c;在Mac系统中转换为cdr&#xff0c;然后再转成iso&am…

Knife4j配置 ▎使用 ▎教程 ▎实例

knife4j简介 支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。 提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试.参数和格式都…