微信搜索【程序员囧辉】,关注这个坚持分享技术干货的程序员。
我的最新文章:百万级QPS,支撑淘宝双11商品浏览需要哪些技术
前言
之前在 4 年 Java 经验,阿里网易拼多多面试总结、心得体会 中列出了一些高频面试题,这些题目大部分是我自己在面试中碰到过的、小部分是我觉得比较重要的,但是当时并没有给出答案,后面收到有不少同学留言说希望给出答案。之前一直比较忙,所以没时间出。
最近换了工作后,没之前压力那么大了,所以想把这个之前留下的坑给填上。之后会针对这些题目按专题来给出对应的解析,同时结合当前的面试环境,适当补充点当前热门题目。
另外,针对这些面试题的重要程度/出现频率,我会给出一个评分(1~10),分值越高代表出现的概率越大,其中8分及以上的可以认为是高频面试题,评分仅供参考。
针对 Spring 这个知识点,面试中的重要程度综合评分为8分。
正文
Spring IoC 的容器构建流程(8分)
核心的构建流程如下,也就是 refresh 方法的核心内容:
Spring bean 的生命周期(10分)
bean 的生命周期主要有以下几个阶段,深色底的5个是比较重要的阶段。
BeanFactory 和 FactoryBean 的区别(6分)
BeanFactory:Spring 容器最核心也是最基础的接口,本质是个工厂类,用于管理 bean 的工厂,最核心的功能是加载 bean,也就是 getBean 方法,通常我们不会直接使用该接口,而是使用其子接口。
FactoryBean:该接口以 bean 样式定义,但是它不是一种普通的 bean,它是个工厂 bean,实现该接口的类可以自己定义要创建的 bean 实例,只需要实现它的 getObject 方法即可。
FactoryBean 被广泛应用于 Java 相关的中间件中,如果你看过一些中间件的源码,一定会看到 FactoryBean 的身影。
一般来说,都是通过 FactoryBean#getObject 来返回一个代理类,当我们触发调用时,会走到代理类中,从而可以在代理类中实现中间件的自定义逻辑,比如:RPC 最核心的几个功能,选址、建立连接、远程调用,还有一些自定义的监控、限流等等。
BeanFactory 和 ApplicationContext 的区别(6分)
BeanFactory:基础 IoC 容器,提供完整的 IoC 服务支持。
ApplicationContext:高级 IoC 容器,BeanFactory 的子接口,在 BeanFactory 的基础上进行扩展。包含 BeanFactory 的所有功能,还提供了其他高级的特性,比如:事件发布、国际化信息支持、统一资源加载策略等。正常情况下,我们都是使用的 ApplicationContext。
这边以电话来举个简单的例子:
我们家里使用的 “座机” 就类似于 BeanFactory,可以进行电话通讯,满足了最基本的需求。
而现在非常普及的智能手机,iPhone、小米等,就类似于 ApplicationContext,除了能进行电话通讯,还有其他很多功能:拍照、地图导航、听歌等。
Spring 的 AOP 是怎么实现的(5分)
本质是通过动态代理来实现的,主要有以下几个步骤。
1、获取增强器,例如被 Aspect 注解修饰的类。
2、在创建每一个 bean 时,会检查是否有增强器能应用于这个 bean,简单理解就是该 bean 是否在该增强器指定的 execution 表达式中。如果是,则将增强器作为拦截器参数,使用动态代理创建 bean 的代理对象实例。
3、当我们调用被增强过的 bean 时,就会走到代理