02-面试必会-SSM框架篇
01-什么是 Spring IOC 和 DI ?
IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转 移,从程序代码本身转移到了外部容器。
DI : 依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中。
02-有哪些不同类型的依赖注入实现方式?
依赖注入分为接口注入,Setter 方 法注入和构造器注入以及注解注入
构造器注入 : 顾名思义, 就是在类中提供有参构造方法, 创建 Bean 的时候会自动执行构造方法将依赖数据注入进去
Setter 方法注入 : 顾名思义, 就是提供属性对应的 setter 方法 , 创建 Bean 的时候会自动执行 Setter 方法将依赖数据注入进去
注解注入 : 就是在属性上使用一些注入注入数据, 经常用的有 @Autowired , @Resource ,@Qualifier 注解
@Autowired : 默认根据类型注入 , 按照类型匹配多个 Bean,再按照属性名称注入
@Resource : 默认按照名称注入 , 如果找不到对应的 Bean,按照类型注入 , 也可以指定按照名称注入(name)或者按照类型注入(type)
@Qualifier : 结合@Autowired 注解一起使用, 如果按照类型匹配多个 Bean , 通过@Qualifier 注解指定按照名称注入的属性名称
03- Spring 支持的几种 bean 的作用域 Scope
Spring 框架支持以下五种 bean 的作用域:
singleton : bean 在每个 Spring ioc 容器中只有一个实例。
prototype:一个 bean 的定义可以有多个实例。
request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。
session:在一个 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。
global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基 于 web 的 Spring ApplicationContext 情形下有效。
04- Spring 框架中的单例 bean 是线程安全的吗?
不是,Spring 框架中的单例 bean 不是线程安全的 , spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
但是我们一般在使用单例 Bean 的时候, 不会设置共享数据, 所以也就不会存在线程安全问题 ! 从这个角度讲单例 bean 也是线程安全的
05- spring 自动装配 bean 有哪些方式?
在 Spring 框架 xml 配置中共有 5 种自动装配:
- byName:通过 bean 的名称进行自动装配,如果一个 bean 的 property 与另一 bean 的 name 相 同,就进行自动装配。
- byType:通过参数的数据类型进行自动装配。
- constructor:利用构造函数进行装配,并且构造函数的参数通过 byType 进行装配。
- setter 方法 : 根据属性的 setter 方法注入
- 注解注入
09- JDK 动态代理和 CGLIB 动态代理的区别
Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理:
JDK 动态代理只提供接口的代理,不支持类的代理
Proxy.newProxyInstance(类加载器, 代理对象实现的所有接口, 代理执行器)
CGLIB 是通过继承的方式做的动态代理 , 如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。
Enhancer.create(父类的字节码对象, 代理执行器)
10- 什么是 AOP , 你们项目中有没有使用到 AOP
AOP 一般称为面向切面编程,作为面向对象的一种补充,用于 将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模 块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时 提高了系统的可维护性。
在我们的项目中我们自己写 AOP 的场景其实很少 , 但是我们使用的很多框架的功能底层都是 AOP , 例如 : 权限认证、日志、事务处理等
11- SpringMVC 的执行流程知道嘛

- 用户发送请求至前端控制器 DispatcherServlet;
- DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 Handle;
- 处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生 成)一并返回给 DispatcherServlet;
- DispatcherServlet 调用 HandlerAdapter 处理器适配器;
- HandlerAdapter 经过适配调用具体处理器(Handler,也叫后端控制器);
- Handler 执行完成返回 ModelAndView;
- HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给 DispatcherServlet;
- DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;
- ViewResolver 解析后返回具体 View;
- DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
- DispatcherServlet 响应用户
12- Spring MVC 常用的注解有哪些?
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中 的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。
@ResponseBody:注解实现将 conreoller 方法返回对象转化为 json 对象响应给客户。
@Controller:控制器的注解,表示是表现层,不能用用别的注解代替
@RestController : 组合注解 @Conntroller + @ResponseBody
@GetMapping , @PostMapping , @PutMapping , @DeleteMapping ...
@PathVariable : 接收请求路径中的变量
@RequestParam : 接收请求参数
13- Mybatis #{}和${}的区别
#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。
Mybatis 在处理#{}时,#{}传入参数是以字符串传入,会将 SQL 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值。
#{} 可以有效的防止 SQL 注入,提高系统安全性;${} 不能防止 SQL 注入
#{} 的变量替换是在数据库系统中; ${} 的变量替换是在 数据库系统外
14- Mybatis 如何获取生成的主键
我知道的有二种方式
- 在 insert 标签上, 使用
useGeneratedKeys="true"和keyProperty="userId" - 在 insert 表内部, 使用
selectKey标签 , 里面使用select last_insert_id()查询生成的 ID 返回
15- 当实体类中的属性名和表中的字段名不一样 ,怎么办
第 1 种: 通过在查询的 SQL 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
第 2 种: 通过 ResultMap 来映射字段名和实体类属性名
16- Mybatis 如何实现多表查询
Mybatis 是新多表查询的方式也有二种 :
第一种是 : 编写多表关联查询的 SQL 语句 , 使用 ResultMap 建立结果集映射 , 在 ResultMap 中建立多表结果集映射的标签有association和collection
<resultMap id="Account_User_Map" type="com.heima.entity.Account">
<id property="id" column="id"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<association property="user">
<id property="id" column="uid"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</association>
</resultMap>
<!--public Account findByIdWithUser(Integer id);-->
<select id="findByIdWithUser" resultMap="Account_User_Map">
select a.*, username, birthday, sex, address from account a , user u where a.UID = u.id and a.ID = #{id} ;
</select>
第二种是 : 将多表查询分解为多个单表查询, 使用 ResultMap 表的子标签association和collection标签的select属性指定另外一条 SQL 的定义去执行, 然后执行结果会被自动封装
<resultMap id="Account_User_Map" type="com.heima.entity.Account" autoMapping="true">
<id property="id" column="id"></id>
<association property="user" select="com.heima.dao.UserDao.findById" column="uid" fetchType="lazy"></association>
</resultMap>
<!--public Account findByIdWithUser(Integer id);-->
<select id="findByIdWithUser" resultMap="Account_User_Map">
select * from account where id = #{id}
</select>
17-Mybatis 都有哪些动态 sql?能简述一下动 态 sql 的执行原理吗?
Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态 拼接 sql 的功能,Mybatis 提供了 9 种动态 sql 标签 trim|where|set|foreach|if|choose|when|otherwise|bind。
其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此 来完成动态 sql 的功能。
18- Mybatis 是否支持延迟加载?
Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是 一对一,collection 指的就是一对多查询。在 Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
19- 如何使用 Mybatis 实现批量插入 ?
使用 foreach 标签 , 它可以在 SQL 语句中进行迭代一个集合。foreach 标签的属性主 要有 item,index,collection,open,separator,close。
- collection : 代表要遍历的集合 ,
- item 表示集合中每一个元素进行迭代时的别名,随便起的变量名;
- index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置,不常用;
- open 表示该语句以什么开始
- separator 表示在每次进行迭代之间以什么符号作为分隔符
- close 表示以什么结束
20- Mybatis 批量插入是否能够返回主键
可以, 返回的主键在传入集合的每个对象属性中封装的
21- Mybatis 的一级、二级缓存 ?
一级缓存: 基于 SqlSession 级别的缓存 , 默认开启
二级缓存 : 基于 SqlSessionFactory 的 NameSpace 级别缓存 , 默认没有开启, 需要手动开启
# 配置cacheEnabled为true
<settings>...
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
...
</settings>
# 在映射配置文件中配置cache相关配置
<cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024">
</cache>
02-面试必会-SSM框架篇的更多相关文章
- 面试必问之JVM篇
前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记.现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书. 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干 ...
- BATJ面试必会之 Spring 篇(一)
译者:深海 校对:方腾飞 出自并发编程网 – ifeve.com 目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP ...
- BATJ面试必会之并发篇
一.线程状态转换 新建(New) 可运行(Runnable) 阻塞(Blocking) 无限期等待(Waiting) 限期等待(Timed Waiting) 死亡(Terminated) 二.使用线程 ...
- 企业面试问题收集-ssm框架
springMVC 1) 简单介绍下你对springMVC的理解? Spring MVC Framework有这样一些特点: 1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对 ...
- 02 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之Service层
作者:nnngu 项目源代码:https://github.com/nnngu/nguSeckill 首先在编写Service层代码前,我们应该首先要知道这一层到底是干什么的. Service层主要负 ...
- 初级Java面试题 – SSM框架篇
加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Spring的优点/对Spring的理解 Spring的AOP编程 Spring的IOC Spri ...
- Java面试必问通信框架NIO,原理详解
NIO 流与块 通道与缓冲区 缓冲区状态变量 文件 NIO 实例 选择器 套接字 NIO 实例 内存映射文件 NIO与IO对比 Path Files NIO 新的输入/输出 (NIO) 库是在 JDK ...
- 一篇SSM框架整合友好的文章(一)
转载请标明出处: http://blog.csdn.net/forezp/article/details/53730333 本文出自方志朋的博客 最近实在太忙,之前写的<rxjava系列文章&g ...
- SSM 框架集-01-详细介绍-入门问题篇
SSM 框架集-01-详细介绍-入门问题篇 刚开始了解 SSM,首先先解决几个基础问题 1.什么是 SSM 框架集? SSM(Spring+SpringMVC+MyBatis)框架集由 Spring. ...
- python笔记39-unittest框架如何将上个接口的返回结果给下个接口适用(面试必问)
前言 面试必问:如何将上个接口的返回结果,作为下个接口的请求入参?使用unittest框架写用例时,如何将用例a的结果,给用例b使用. unittest框架的每个用例都是独立的,测试数据共享的话,需设 ...
随机推荐
- 为什么 Python、Go 和 Rust 都不支持三元运算符?
在编程时,我们经常要作条件判断,并根据条件的结果选择执行不同的语句块.在许多编程语言中,最常见的写法是三元运算符,但是,Python 并不支持三元运算符,无独有偶,两个最热门的新兴语言 Go 和 Ru ...
- 全网最详细 二进制 k8s v1.25.x文档
二进制安装k8s v1.25.0 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k8s)二进制高可用安装部署,支持IPv4+IPv6双栈 ...
- 《花雕学AI》13:早出对策,积极应对ChatGPT带来的一系列风险和挑战
ChatGPT是一款能和人类聊天的机器人,它可以学习和理解人类语言,也可以帮人们做一些工作,比如翻译.写文章.写代码等.ChatGPT很强大,让很多人感兴趣,也让很多人担心. 使用ChatGPT有一些 ...
- Spring Boot 整合 xxl-job
官方文档:https://www.xuxueli.com/xxl-job/ XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线 ...
- CI框架内置分页代码
Controller 控制器代码 <?php defined('BASEPATH') OR exit('No direct script access allowed'); class Welc ...
- Vue中Key值的一些问题
1. Vue里面的key是一个特殊的变量,在元素当中是不体现出来的 2. 在解析成虚拟DOM的是,如果我们没有写key值,那么这个key就类似于下标 0 , 1 , 2 , 3.... 3. 使用列表 ...
- Java学习笔记04
1. 循环进阶 1.1 无限循环 概念 循环一直停不下来,又叫死循环. for格式 for (;;) { 循环语句; } while格式 while (true) { 循环语句; } do...w ...
- LeetCode SQL 基础题
链接: 力扣 个人做法: # Write your MySQL query statement below SELECT A.name Employee FROM Employee A,Employe ...
- Go语言网络编程:SSH连接
旨在提升Go语言网络编程能力 SSH是什么? SSH 为 Secure Shell 的缩写,为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SS ...
- react18中antd的Upload组件上传头像,并且拿到服务器返回的头像的url地址在页面中显示头像
业务需求:上传头像,上传完毕后拿到头像的url,把头像展示在页面中,最终把头像url和其他用户信息一起发送给服务器 上传头像流程 导入 Upload 组件和图标(一个加号,一个加载中) import ...