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 的执行流程知道嘛

  1. 用户发送请求至前端控制器 DispatcherServlet;
  2. DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 Handle;
  3. 处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生 成)一并返回给 DispatcherServlet;
  4. DispatcherServlet 调用 HandlerAdapter 处理器适配器;
  5. HandlerAdapter 经过适配调用具体处理器(Handler,也叫后端控制器);
  6. Handler 执行完成返回 ModelAndView;
  7. HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给 DispatcherServlet;
  8. DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;
  9. ViewResolver 解析后返回具体 View;
  10. DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
  11. 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 如何获取生成的主键

我知道的有二种方式

  1. 在 insert 标签上, 使用 useGeneratedKeys="true"keyProperty="userId"
  2. 在 insert 表内部, 使用 selectKey标签 , 里面使用select last_insert_id()查询生成的 ID 返回

15- 当实体类中的属性名和表中的字段名不一样 ,怎么办

第 1 种: 通过在查询的 SQL 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

第 2 种: 通过 ResultMap 来映射字段名和实体类属性名

16- Mybatis 如何实现多表查询

Mybatis 是新多表查询的方式也有二种 :

第一种是 : 编写多表关联查询的 SQL 语句 , 使用 ResultMap 建立结果集映射 , 在 ResultMap 中建立多表结果集映射的标签有associationcollection

<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 表的子标签associationcollection标签的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框架篇的更多相关文章

  1. 面试必问之JVM篇

    前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记.现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书. 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干 ...

  2. BATJ面试必会之 Spring 篇(一)

    译者:深海 校对:方腾飞 出自并发编程网 – ifeve.com 目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP ...

  3. BATJ面试必会之并发篇

    一.线程状态转换 新建(New) 可运行(Runnable) 阻塞(Blocking) 无限期等待(Waiting) 限期等待(Timed Waiting) 死亡(Terminated) 二.使用线程 ...

  4. 企业面试问题收集-ssm框架

    springMVC 1)    简单介绍下你对springMVC的理解? Spring MVC Framework有这样一些特点: 1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对 ...

  5. 02 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之Service层

    作者:nnngu 项目源代码:https://github.com/nnngu/nguSeckill 首先在编写Service层代码前,我们应该首先要知道这一层到底是干什么的. Service层主要负 ...

  6. 初级Java面试题 – SSM框架篇

    加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Spring的优点/对Spring的理解 Spring的AOP编程 Spring的IOC Spri ...

  7. Java面试必问通信框架NIO,原理详解

    NIO 流与块 通道与缓冲区 缓冲区状态变量 文件 NIO 实例 选择器 套接字 NIO 实例 内存映射文件 NIO与IO对比 Path Files NIO 新的输入/输出 (NIO) 库是在 JDK ...

  8. 一篇SSM框架整合友好的文章(一)

    转载请标明出处: http://blog.csdn.net/forezp/article/details/53730333 本文出自方志朋的博客 最近实在太忙,之前写的<rxjava系列文章&g ...

  9. SSM 框架集-01-详细介绍-入门问题篇

    SSM 框架集-01-详细介绍-入门问题篇 刚开始了解 SSM,首先先解决几个基础问题 1.什么是 SSM 框架集? SSM(Spring+SpringMVC+MyBatis)框架集由 Spring. ...

  10. python笔记39-unittest框架如何将上个接口的返回结果给下个接口适用(面试必问)

    前言 面试必问:如何将上个接口的返回结果,作为下个接口的请求入参?使用unittest框架写用例时,如何将用例a的结果,给用例b使用. unittest框架的每个用例都是独立的,测试数据共享的话,需设 ...

随机推荐

  1. [工具/Maven]Maven工程目录结构 | Maven自动构建骨架(maven-archetype)中quickstart与webapp的区别

    1 maven-archetype-quickstart 1.1 IDEA中的前期准备 1.2 自动构建后 ↓pom.xml↓ <?xml version="1.0" enc ...

  2. day72:drf:反序列化功能&模型类序列化器Modelserializer&drf视图APIView

    目录 1.续:反序列化功能(5-8) 1.用户post类型提交数据,反序列化功能的步骤 2.反序列化功能的局部钩子和全局钩子 局部钩子和全局钩子在序列化器中的使用 反序列化相关校验的执行顺序 3.反序 ...

  3. 手机号码归属地 API 实现个性化推荐的思路分析

    前言 随着移动互联网和智能手机的普及,越来越多的人使用手机上网和购物,移动营销已成为企业获取用户和提升品牌知名度的重要手段.手机号码归属地 API 作为移动营销的关键工具,具有广阔的应用前景. 本文将 ...

  4. Yii framework 应用小窍门

    Yii framework 应用小窍门     1. Yii Framework] 如何获取当前controller的名称?  下面语句就可以获取当前控制器的名称了! Php代码   Yii::app ...

  5. 颜值即正义,献礼就业季,打造多颜色多字体双飞翼布局技术简历模版(Resume)

    一年好景君须记,最是橙黄橘绿时.金三银四,秣马厉兵,没有一个好看的简历模板怎么行?无论是网上随便下载还是花钱买,都是一律千篇的老式模版,平平无奇,味同嚼蜡,没错,蜡都要沿着嘴角流下来了.本次我们基于H ...

  6. 安装Zookeeper和Kafka集群

    安装Zookeeper和Kafka集群 本文介绍如何安装Zookeeper和Kafka集群.为了方便,介绍的是在一台服务器上的安装,实际应该安装在多台服务器上,但步骤是一样的. 安装Zookeeper ...

  7. java递归算法之老鼠找路

    (上图出自B站韩顺平教育) 从上图的(1,1)处,寻找到(6,5)处的路线,红色格子是障碍 public class MiGong { public static void main(String[] ...

  8. TEMP_FAILURE_RETRY宏的用法

    #define TEMP_FAILURE_RETRY(expression) \     (__extension__\      ({ long int __result;\          do ...

  9. [C++核心编程] 4.3、类和对象-C++对象模型和this指针

    文章目录 4.3 C++对象模型和this指针 4.3.1 成员变量和成员函数分开存储 4.3.2 this指针概念 4.3.3 空指针访问成员函数 4.3.4 const修饰成员函数 4.3 C++ ...

  10. 「微服务」这10道Consul面试题值得一看

    前言 Consul 是一种非常强大的分布式服务发现和配置管理工具,它可以帮助开发人员和运维人员更好地管理和维护分布式系统. 但是,使用 Consul 也需要投入一定的人力和物力,需要根据实际情况进行选 ...