知己知彼,百战不殆:“金三银四”横扫BAT面试之Spring108问!

674 阅读17分钟

说在前面

过年之后相信有一部分的人,早已磨刀霍霍向大厂。势必要大展拳脚,必将在大厂内创出一片天地。但是,想必大家都知道:最近几年的最严重的互联网寒冬来临,各位兄弟都会说“江湖再见”。耳边总是充刺着流言蜚语,这个地方裁员了,这个地方缩减HC。弄得人心慌慌。年后将是一片血雨腥风,程序界的江湖将在这一天精彩斑斓。

但我们要知道,寒冬之中,什么是最珍贵,就让鄙人告诉你:人才。只要有过硬的技术和装备,在逆风直下的情况下,咱们也能迎难而上,打他个戳手不及。不是“李云龙”大哥说:“过狭路相逢勇者胜。”

金三银四俗称跳槽黄金季,虽然今年的情况可能“特殊”点,但也不影响大家拿高薪,去更牛逼的公司,认识更多大牛,提升自己的职场竞争力的想法。

那怎样才能通过BAT面试官的考核?怎样成为一名Offer收割机?

收割Offer有一个最直接的公示:Offer=硬实力+软实力+好的心态,三者缺一不可

硬实力

这里说的硬实力,也就是技术上的真实积累。

怎么来体现你的技术实力?总的分为:技术深度和技术广度这两方面

技术广度通俗的讲,就是你熟悉该技术点的使用以及基本原理。一般面试官在面试首轮会问很多技术点,来考核你是否能正确使用。

技术深度通俗的讲,就是深入技术原理的同时,还知道优劣势比较,以及同类产品的横向和纵向比较,以及非常重要的应用场景。比如:消息队列MQ,市面有哪些MQ,RabbitMQ、RocketMQ、ActiveMQ…等等他们各自的架构设计,优劣势比较,各自的应用场景(并发量和使用优劣比较等)。以及MQ的消息去重,如何保证消息不丢失等。这样就沿着MQ这个话题,深入的去考核你对MQ的掌握程度。

技术包括了

网络编程

  • Http和Https
  • OSI7层模型
  • 网络安全防范:CSRF、XSS等

算法和数据结构

  • 数组、链表、二叉树、队列
  • 红黑树、AVL树、Hash树、Tire树、B树、B+树
  • 各类排序算法以及复杂度分析(快排、归并、堆)
  • 二分查找和各种变种的二分查找
  • 手写算法等

JVM

  • 内存回收算法
  • 垃圾收集器
  • 性能调优

并发编程

  • 多线程
  • NIO
  • 并发容器
  • 并发工具类
  • …等

数据库

  • mysql和nosql
  • 索引、慢查询、事务
  • 大数据方案:分库分表、读写分离、数据主从同步

分布式架构设计

  • Redis问得比较多(建议重点掌握)
  • 消息队列Kafka、RabbitMQ、RocketMQ(阿里会问)
  • 微服务:Dubbo、Spring Cloud等

负载均衡

  • 分布式理论:CAP、BASE等
  • 应用系统拆分
  • 分布式锁、分布式事务、分布式全局唯一ID…等

软实力

软实力在面试过程中也尤为重要(有时候真的要更重要),主要是指和面试官的沟通,对一个问题的阐述方式和表达方式,逻辑思维能力等。

面试过程全程微笑,项目描述需要严谨的表述,个人的优缺点基本要做到随口而出…等这些其实就是软实力的体现。

Spring面试108问

一个好的面试问题能使应聘者的本性显露出来——诚实,可信,反应敏锐等等。这里我整理出关于 Spring 的面试题。希望这个总结能为面试官和应聘者提供一些参考,若你能轻而易举回答所有问题,相信这一块的面试就不必担心了。

PS:因文章篇幅问题,我这里没有全部进行解答,我已经整理打包成PDF文档,有需要的可以关注我的公众号【风平浪静如码】获取资料!

Spring基础68题

1.什 么 是 spring?

2.使 用 Spring 框 架 的 好 处 是 什 么 ?

  • 轻 量:Spring 是 轻 量 的 , 基 本 的 版 本 大 约 2MB。
  • 控 制 反 转 :Spring 通 过 控 制 反 转 实 现 了 松 散 耦 合 , 对 象们 给 出 它 们 的 依 赖 , 而 不 是 创 建 或 查 找 依 赖 的 对 象 们 。
  • 面 向 切 面 的 编 程(AOP):Spring 支 持 面 向 切 面 的 编 程 ,并 且 把 应 用 业 务 逻 辑 和 系 统 服 务 分 开 。
  • 容 器 :Spring 包 含 并 管 理 应 用 中 对 象 的 生 命 周 期 和 配置 。
  • MVC 框 架:Spring 的 WEB 框 架 是 个 精 心 设 计 的 框 架 ,是 Web 框 架 的 一 个 很 好 的 替 代 品 。
  • 事 务 管 理:Spring 提 供 一 个 持 续 的 事 务 管 理 接 口 , 可 以扩 展 到 上 至 本 地 事 务 下 至 全 局 事 务 (JTA) 。
  • 异 常 处 理:Spring 提 供 方 便 的 API 把 具 体 技 术 相 关 的 异常 ( 比 如 由 JDBC,Hibernate or JDO 抛 出 的 ) 转 化 为一 致 的 unchecked 异 常 。

3.Spring 由 哪 些 模 块 组 成?

4.核 心 容 器 ( 应 用 上 下 文) 模 块

这 是 基 本 的 Spring 模 块 , 提 供 spring 框 架 的 基 础 功能 ,BeanFactory 是 任 何 以 spring 为 基 础 的 应 用 的 核心 。Spring 框 架 建 立 在 此 模 块 之 上 , 它 使 Spring 成 为一 个 容 器。

5.BeanFactory – BeanFactory 实 现 举 例

Bean 工 厂 是 工 厂 模 式 的 一 个 实 现 , 提 供 了 控 制 反 转 功能 , 用 来 把 应 用 的 配 置 和 依 赖 从 正 真 的 应 用 代 码 中 分离 。最 常 用 的 BeanFactory 实 现 是 XmlBeanFactory 类 。

6.XMLBeanFactory

最 常 用 的 就 是org.springframework.beans.factory.xml.XmlBeanFactory , 它 根 据 XML 文 件 中 的 定 义 加 载 beans。 该 容 器从 XML 文 件 读 取 配 置 元 数 据 并 用 它 去 创 建 一 个 完 全 配 置的 系 统 或 应 用。

7.解 释 AOP 模 块

AOP 模 块 用 于 发 给 我 们 的 Spring 应 用 做 面 向 切 面 的 开发 , 很 多 支 持 由 AOP 联 盟 提 供 , 这 样 就 确 保 了 Spring和 其 他 AOP 框 架 的 共 通 性 。 这 个 模 块 将 元 数 据 编 程 引 入Spring。

8.解 释 JDBC 抽 象 和 DAO 模 块

通 过 使 用 JDBC 抽 象 和 DAO 模 块 , 保 证 数 据 库 代 码 的 简洁 , 并 能 避 免 数 据 库 资 源 错 误 关 闭 导 致 的 问 题 , 它 在 各种 不 同 的 数 据 库 的 错 误 信 息 之 上 , 提 供 了 一 个 统 一 的 异常 访 问 层 。 它 还 利 用 Spring 的 AOP 模 块 给 Spring 应用 中 的 对 象 提 供 事 务 管 理 服 务 。

9.解 释 对 象/关 系 映 射 集 成 模 块

10.解 释 WEB 模 块

11.Spring 配 置 文 件

12.什 么 是 Spring IOC 容 器

Spring IOC 负 责 创 建 对 象 , 管 理 对 象 ( 通 过 依 赖 注 入(DI) , 装 配 对 象 , 配 置 对 象 , 并 且 管 理 这 些 对 象 的 整个 生 命 周 期。

13.IOC 的 优 点 是 什 么

IOC 或 依 赖 注 入 把 应 用 的 代 码 量 降 到 最 低 。 它 使 应 用 容易 测 试 , 单 元 测 试 不 再 需 要 单 例 和 JNDI 查 找 机 制 。 最小 的 代 价 和 最 小 的 侵 入 性 使 松 散 耦 合 得 以 实 现 。IOC 容器 支 持 加 载 服 务 时 的 饿 汉 式 初 始 化 和 懒 加 载 。

14.ApplicationContext 通 常 的 实 现 是 什 么?

  • FileSystemXmlApplicationContext :此 容 器 从 一 个XML 文 件 中 加 载 beans 的 定 义 ,XML Bean 配 置 文 件 的全 路 径 名 必 须 提 供 给 它 的 构 造 函 数 。
  • ClassPathXmlApplicationContext:此 容 器 也 从 一 个XML 文 件 中 加 载 beans 的 定 义 , 这 里 , 你 需 要 正 确 设 置classpath 因 为 这 个 容 器 将 在 classpath 里 找 bean 配置 。
  • WebXmlApplicationContext:此 容 器 加 载 一 个 XML文 件 , 此 文 件 定 义 了 一 个 WEB 应 用 的 所 有 bean。

15.Bean 工 厂 和 Application contexts 有 什 么 区别

Application contexts 提 供 一 种 方 法 处 理 文 本 消 息 , 一个 通 常 的 做 法 是 加 载 文 件 资 源 ( 比 如 镜 像 ) , 它 们 可 以向 注 册 为 监 听 器 的 bean 发 布 事 件 。 另 外 , 在 容 器 或 容器 内 的 对 象 上 执 行 的 那 些 不 得 不 由 bean 工 厂 以 程 序 化方 式 处 理 的 操 作 , 可 以 在 Application contexts 中 以 声明 的 方 式 处 理 。Application contexts 实 现 了MessageSource 接 口 , 该 接 口 的 实 现 以 可 插 拔 的 方 式 提供 获 取 本 地 化 消 息 的 方 法 。

16.一 个 Spring 的 应 用 看 起 来 象 什 么

  • 一 个 定 义 了 一 些 功 能 的 接 口 。
  • 这 实 现 包 括 属 性 , 它 的 Setter , getter 方 法 和 函 数等 。
  • Spring AOP
  • Spring 的 XML 配 置 文 件
  • 使 用 以 上 功 能 的 客 户 端 程 序

17.什 么 是 Spring 的 依 赖 注 入

18.有 哪 些 不 同 类 型 的 IOC( 依 赖 注 入 )方 式

  • 构 造 器 依 赖 注 入 :构 造 器 依 赖 注 入 通 过 容 器 触 发 一 个 类的 构 造 器 来 实 现 的 , 该 类 有 一 系 列 参 数 , 每 个 参 数 代 表一 个 对 其 他 类 的 依 赖 。
  • Setter 方 法 注 入:Setter 方 法 注 入 是 容 器 通 过 调 用 无 参构 造 器 或 无 参 static 工 厂 方 法 实 例 化 bean 之 后 , 调 用该 bean 的 setter 方 法 , 即 实 现 了 基 于 setter 的 依 赖 注入

19.哪 种 依 赖 注 入 方 式 你 建 议 使 用 , 构 造 器 注 入 , 还 是Setter 方 法 注 入

20.什 么 是 Spring beans?

21.一 个 Spring Bean 定 义 包 含 什 么

22.如 何 给 Spring 容 器 提 供 配 置 元 数 据?

23.你 怎 样 定 义 类 的 作 用 域?

当 定 义 一 个 在 Spring 里 , 我 们 还 能 给 这 个bean 声 明 一 个 作 用 域 。 它 可 以 通 过 bean 定 义 中 的scope 属 性来 定 义 。 如 , 当 Spring 要 在 需 要 的 时 候 每 次生 产 一 个 新 的 bean 实 例 ,bean 的 scope 属 性 被 指 定 为prototype。 另 一 方 面 , 一 个 bean 每 次 使 用 的 时 候 必 须返 回 同 一 个 实 例 , 这 个 bean 的 scope 属 性 必 须 设 为singleton。

24.解 释 Spring 支 持 的 几 种 bean 的 作 用 域

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 情 形 下 有 效 。缺 省 的 Spring bean 的 作 用 域 是 Singleton.

25.Spring 框 架 中 的 单 例 bean 是 线 程 安 全 的 吗

不 ,Spring 框 架 中 的 单 例 bean 不 是 线 程 安 全 的 。

26.解 释 Spring 框 架 中 bean 的 生 命 周 期

27.哪 些 是 重 要 的 bean 生 命 周 期 方 法 ? 你 能 重 载 它 们吗

28.什么是 Spring 的内部 bean

29.在 Spring 中如何注入一个 java 集合

30.什么是 bean 装配

31.什么是 bean 的自动装配

32.解释不同方式的自动装配

33.自动装配有哪些局限性

34.你可以在 Spring 中注入一个 null 和一个空字符串吗

35.什 么 是 基 于 Java 的 Spring 注 解 配 置? 给 一 些 注 解的 例 子

36.什 么 是 基 于 注 解 的 容 器 配 置

37.怎 样 开 启 注 解 装 配

38.@Required 注 解

39.@Autowired 注 解

40.@Qualifier 注 解

41.在 Spring 框 架 中 如 何 更 有 效 地 使 用 JDBC

42.JdbcTemplate

43.Spring 对 DAO 的 支 持

44.使 用 Spring 通 过 什 么 方 式 访 问 Hibernate

45.Spring 支 持 的 ORM

46.如 何 通 过 HibernateDaoSupport 将 Spring 和Hibernate 结 合 起 来

47.Spring 支 持 的 事 务 管 理 类 型

48.Spring 框 架 的 事 务 管 理 有 哪 些 优 点

49.你 更 倾 向 用 那 种 事 务 管 理 类 型

50.解 释 AOP

51.Aspect 切 面

52.在 Spring AOP 中 , 关 注 点 和 横 切 关 注 的 区 别 是 什么

53.连 接 点

连 接 点 代 表 一 个 应 用 程 序 的 某 个 位 置 , 在 这 个 位 置 我 们可 以 插 入 一 个 AOP 切 面 , 它 实 际 上 是 个 应 用 程 序 执 行Spring AOP 的 位 置 。

54.通 知

通 知 是 个 在 方 法 执 行 前 或 执 行 后 要 做 的 动 作 , 实 际 上 是程 序 执 行 时 要 通 过 SpringAOP 框 架 触 发 的 代 码 段 。 Spring 切 面 可 以 应 用 五 种 类 型 的 通 知 :

  • before: 前 置 通 知 , 在 一 个 方 法 执 行 前 被 调 用 。
  • after: 在 方 法 执 行 之 后 调 用 的 通 知 , 无 论 方 法 执 行 是 否成 功 。
  • after-returning: 仅 当 方 法 成 功 完 成 后 执 行 的 通 知 。
  • after-throwing: 在 方 法 抛 出 异 常 退 出 时 执 行 的 通 知 。
  • around: 在 方 法 执 行 之 前 和 之 后 调 用 的 通 知 。

55.切 点

切 入 点 是 一 个 或 一 组 连 接 点 , 通 知 将 在 这 些 位 置 执 行 。可 以 通 过 表 达 式 或 匹 配 的 方 式 指 明 切 入 点 。

56.什 么 是 引 入

57.什 么 是 目 标 对 象

58.什 么 是 代 理

59.有 几 种 不 同 类 型 的 自 动 代 理

60.什 么 是 织 入 。 什 么 是 织 入 应 用 的 不 同 点

61. 解 释 基 于 XML Schema 方 式 的 切 面 实 现

62.. 解 释 基 于 注 解 的 切 面 实 现

63.什 么 是 Spring 的 MVC 框 架

64.DispatcherServlet

Spring 的 MVC 框 架 是 围 绕 DispatcherServlet 来 设 计的 , 它 用 来 处 理 所 有 的 HTTP 请 求 和 响 应 。

65.WebApplicationContext

WebApplicationContext 继 承 了 ApplicationContext并 增 加 了 一 些 WEB 应 用 必 备 的 特有 功 能 , 它 不 同 于 一般 的 ApplicationContext , 因 为 它 能 处 理 主 题 , 并 找到 被 关 联 的 servlet。

66.什 么 是 Spring MVC 框 架 的 控 制 器

控 制 器 提 供 一 个 访 问 应 用 程 序 的 行 为 , 此 行 为 通 常 通 过服 务 接 口 实 现 。 控 制 器 解 析 用 户 输 入 并 将 其 转 换 为 一 个由 视 图 呈 现 给 用 户 的 模 型 。Spring 用 一 个 非 常 抽 象 的 方 式 实 现 了 一 个 控 制 层 , 允 许 用 户 创 建 多 种 用 途 的 控 制器。

67.@Controller 注 解

68.@RequestMapping 注 解

Spring进阶40题

1.什么是 Spring 框架?

Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring 框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成 Spring 框架,不必担心 Spring 是如何在后台进行工作的。

2.使用 Spring 框架能带来哪些好处

3.什么是控制反转(IOC)?什么是依赖注入

4.请解释下 Spring 框架中的 IoC?

5.BeanFactory 和 ApplicationContext 有什么区别

6.Spring 有几种配置方式

将 Spring 配置到应用开发中有以下三种方式:

  1. 基于 XML 的配置
  2. 基于注解的配置
  3. 基于 Java 的配置

7.如何用基于 XML 配置的方式配置 Spring

8.如何用基于 Java 配置的方式配置 Spring

9.怎样用注解的方式配置 Spring

10.请解释 Spring Bean 的生命周期

11.Spring Bean 的作用域之间有什么区别

Spring 容器中的 bean 可以分为 5 个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:

  • singleton:这种 bean 范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个 bean 的实例,单例的模式由 bean factory 自身来维护。
  • prototype:原形范围与单例范围相反,为每一个 bean 请求提供一个实例。
  • request:在请求 bean 范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回收。
  • Session:与请求范围类似,确保每个 session 中有一个 bean的实例,在 session 过期后,bean 会随之失效。
  • global-session:global-session 和 Portlet 应用相关。当你的应用部署在 Portlet 容器中工作时,它包含很多 portlet。如果你想要声明让所有的 portlet 共用全局的存储变量的话,那么这全局变量需要存储在 global-session 中。

12.什么是 Spring inner beans

13.Spring 框架中的单例 Beans 是线程安全的么

  • Spring 框架并没有对单例 bean 进行任何多线程的封装处理。关于单例 bean 的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的 Spring bean 并没有可变的状态(比 如 Serview 类和 DAO 类),所以在某种程度上说 Spring 的单例 bean 是线程安全的。如果你的 bean 有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。
  • 最浅显的解决办法就是将多态 bean 的作用域由“singleton”变更为“prototype”。

14.请举例说明如何在 Spring 中注入一个 Java Collection

15.如何向 Spring Bean 中注入一个 Java.util.Properties

16.请解释 Spring Bean 的自动装配

17.请解释自动装配模式的区别

18.如何开启基于注解的自动装配

19.请举例解释@Required 注解

20.请举例解释@Autowired 注解

21.请举例说明@Qualifier 注解

22.构造方法注入和设值注入有什么区别

23.Spring 框架中有哪些不同类型的事件

24.FileSystemResource 和 ClassPathResource 有何区别

在 FileSystemResource 中需要给出 spring-config.xml 文件在你项目中的相对路径或者绝对路径。在ClassPathResource中 spring 会在 ClassPath 中自动搜寻配置文件,所以要把ClassPathResource 文件放在 ClassPath 下。

如果将 spring-config.xml 保存在了 src 文件夹下的话,只需给出配置文件的名称即可,因为 src 文件夹是默认。

简而言之,ClassPathResource 在环境变量中读取配置文件,FileSystemResource 在配置文件中读取配置文件。

25.Spring 框架中都用到了哪些设计模式

Spring 框架中使用到了大量的设计模式,下面列举了比较有代表性的:

  1. 代理模式—在 AOP 和 remoting 中被用的比较多。
  2. 单例模式—在 spring 配置文件中定义的 bean 默认为单例模式。
  3. 模板方法—用来解决代码重复的问题。比如. RestTemplate,JmsTemplate, JpaTemplate。 4. 前端控制器—Spring 提供了 DispatcherServlet 来对请求进行分发。
  4. 视图帮助(View Helper )—Spring 提供了一系列的 JSP 标签,高效宏来辅助将分散的代码整合在视图里。
  5. 依赖注入—贯穿于 BeanFactory / ApplicationContext 接口的核心理念。
  6. 工厂模式—BeanFactory 用来创建对象的实例。

26.谈谈你对 spring IOC 和 DI 的理解,它们有什么区别

27.BeanFactory 接口和 ApplicationContext 接口有什么区别

28.spring 配置 bean 实例化有哪些方式

29.简单的说一下 spring 的生命周期

30.请介绍一下 Spring 框架中 Bean 的生命周期和作用域

31.Bean 注入属性有哪几种方式

spring 支持构造器注入和 setter 方法注构造器注入, 通过元素完成注入 setter 方法注入,通过元素完成注入【开发中常用方式】

32.什么是 AOP,AOP 的作用是什么

33.Spring 的核心类有哪些,各有什么作用

34.Spring 里面如何配置数据库驱动

35.Spring 里面 applicationContext.xml 文件能不能改成其他文件名

36.Spring 里面如何定义 hibernate mapping

37.Spring 如何处理线程并发问题

38.为什么要有事物传播行为

39.介绍一下 Spring 的事物管理

40.通知有哪些类型


共同进步,学习分享

没有人会讨厌和拒绝认真准备面试的人,所以不要认为面试就是必须用一个“素颜”的你去“真诚”的面对。

因文章篇幅问题,我这里没有全部进行解答,我已经整理打包成PDF文档,有需要的可以关注我的公众号【风平浪静如码】获取资料!

最后祝大家工作顺利,升职加薪,面试都能通过,offer拿到手软,早日找到心仪的工作~

部分资料展示

最后,用 Martin Fowler 的一句话作为结尾:「任何傻瓜都能写计算机能理解的代码,优秀的程序员编写人类能够理解的代码。」(Any fool can write code that a computer can understand. Good programmers write code that humans can understand)