前言

回顾这一年,我的付出终归是没有白费的!很快,今天是 2022年了,激烈的金三银四已经没有多少日子就有上场了!所以今天,我挑选了“美团+字节+腾讯”等三家的一二三面问题,在此篇文章里做一个分享,希望看到的朋友可以做一个面试参考,并可自行测挑战一下你能走到哪一面,期待你的表现~

1.简单工厂(非 23 种设计模式中的一种)

实现方式:

BeanFactory。Spring 中的 BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 Bean 对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

实质:

由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

实现原理:

bean 容器的启动阶段:

  • 读取 bean 的 xml 配置文件,将 bean 元素分别转换成一个 BeanDefinition 对象。

  • 然后通过 BeanDefinitionRegistry 将这些 bean 注册到 beanFactory 中,保存在它的一个 ConcurrentHashMap 中。

  • 将 BeanDefinition 注册到了 beanFactory 之后,在这里 Spring 为我们提供了一个扩展的切口,允许我们通过实现接口 BeanFactoryPostProcessor 在此处来插入我们定义的代码。典型的例子就是:PropertyPlaceholderConfigurer,我们一般在配置数据库的 dataSource 时使用到的占位符的值,就是它注入进去的。

容器中 bean 的实例化阶段:

实例化阶段主要是通过反射或者 CGLIB 对 bean 进行实例化,在这个阶段 Spring 又给我们暴露了很多的扩展点:

  • 各种的 Aware 接口,比如 BeanFactoryAware,对于实现了这些 Aware 接口的 bean,在实例化 bean 时 Spring 会帮我们注入对应的 BeanFactory 的实例。

  • BeanPostProcessor 接口,实现了 BeanPostProcessor 接口的 bean,在实例化 bean 时 Spring 会帮我们调用接口中的方法。

  • InitializingBean 接口,实现了 InitializingBean 接口的 bean,在实例化 bean 时 Spring 会帮我们调用接口中的方法。

  • DisposableBean 接口,实现了 BeanPostProcessor 接口的 bean,在该 bean 死亡时 Spring 会帮我们调用接口中的方法。

设计意义:

**松耦合。**可以将原来硬编码的依赖,通过 Spring 这个 beanFactory 这个工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引入了第三方——spring 这个 beanFactory,由它来解决 bean 之间的依赖问题,达到了松耦合的效果.

**bean 的额外处理。**通过 Spring 接口的暴露,在实例化 bean 的阶段我们可以进行一些额外的处理,这些额外的处理只需要让 bean 实现对应的接口即可,那么 spring 就会在 bean 的生命周期调用我们实现的接口来处理该 bean。[非常重要]

2.工厂方法

实现方式:

FactoryBean 接口。

实现原理:

实现了 FactoryBean 接口的 bean 是一类叫做 factory 的 bean。其特点是,spring 会在使用 getBean()调用获得该 bean 时,会自动调用该 bean 的 getObject()方法,所以返回的不是 factory 这个 bean,而是这个 bean.getOjbect()方法的返回值。

例子:

典型的例子有 spring 与 mybatis 的结合。

代码示例:

说明:

我们看上面该 bean,因为实现了 FactoryBean 接口,所以返回的不是 SqlSessionFactoryBean 的实例,而是它的 SqlSessionFactoryBean.getObject() 的返回值。

3.单例模式

Spring 依赖注入 Bean 实例默认是单例的。

Spring 的依赖注入(包括 lazy-init 方式)都是发生在 AbstractBeanFactory 的 getBean 里。getBean 的 doGetBean 方法调用 getSingleton 进行 bean 的创建。

分析 getSingleton()方法

public?Object?getSingleton(String?beanName){
????//参数true设置标识允许早期依赖
????return?getSingleton(beanName,true);
}
protected?Object?getSingleton(String?beanName,?boolean?allowEarlyReference)?{
????//检查缓存中是否存在实例
????Object?singletonObject?=?this.singletonObjects.get(beanName);
????if?(singletonObject?==?null?&&?isSingletonCurrentlyInCreation(beanName))?{
????????//如果为空,则锁定全局变量并进行处理。
????????synchronized?(this.singletonObjects)?{
????????????//如果此bean正在加载,则不处理
????????????singletonObject?=?this.earlySingletonObjects.get(beanName);
????????????if?(singletonObject?==?null?&&?allowEarlyReference)?{??
????????????????//当某些方法需要提前初始化的时候则会调用addSingleFactory?方法将对应的ObjectFactory初始化策略存储在singletonFactories
????????????????ObjectFactory<?>?singletonFactory?=?this.singletonFactories.get(beanName);
????????????????if?(singletonFactory?!=?null)?{
????????????????????//调用预先设定的getObject方法
????????????????????singletonObject?=?singletonFactory.getObject();
????????????????????//记录在缓存中,earlysingletonObjects和singletonFactories互斥
????????????????????this.earlySingletonObjects.put(beanName,?singletonObject);
????????????????????this.singletonFactories.remove(beanName);
????????????????}
????????????}
????????}
????}
????return?(singletonObject?!=?NULL_OBJECT???singletonObject?:?null);
}

getSingleton()过程图

ps:spring 依赖注入时,使用了 双重判断加锁 的单例模式

总结

**单例模式定义:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。

**spring 对单例的实现:**spring 中的单例模式完成了后半句话,即提供了全局的访问点 BeanFactory。但没有从构造器级别去控制单例,这是因为 spring 管理的是任意的 java 对象。

4.适配器模式

实现方式:

SpringMVC 中的适配器 HandlerAdatper。

实现原理:

HandlerAdatper 根据 Handler 规则执行不同的 Handler。

实现过程:

DispatcherServlet 根据 HandlerMapping 返回的 handler,向 HandlerAdatper 发起请求,处理 Handler。

HandlerAdapter 根据规则找到对应的 Handler 并让其执行,执行完毕后 Handler 会向 HandlerAdapter 返回一个 ModelAndView,最后由 HandlerAdapter 向 DispatchServelet 返回一个 ModelAndView。

实现意义:

HandlerAdatper 使得 Handler 的扩展变得容易,只需要增加一个新的 Handler 和一个对应的 HandlerAdapter 即可。

因此 Spring 定义了一个适配接口,使得每一种 Controller 有一种对应的适配器实现类,让适配器代替 controller 执行相应的方法。这样在扩展 Controller 时,只需要增加一个适配器类就完成了 SpringMVC 的扩展了。

5.装饰器模式

实现方式:

Spring 中用到的包装器模式在类名上有两种表现:一种是类名中含有 Wrapper,另一种是类名中含有 Decorator。

实质:

动态地给一个对象添加一些额外的职责。

就增加功能来说,Decorator 模式相比生成子类更为灵活。

6.代理模式

实现方式:

AOP 底层,就是动态代理模式的实现。

动态代理:

在内存中构建的,不需要手动编写代理类

静态代理:

需要手工编写代理类,代理类引用被代理对象。

实现原理:

切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP 容器会为目标对象创建动态的创建一个代理对象。SpringAOP 就是以这种方式织入切面的。

织入:把切面应用到目标对象并创建新的代理对象的过程。

7.观察者模式

实现方式:

spring 的事件驱动模型使用的是 观察者模式 ,Spring 中 Observer 模式常用的地方是 listener 的实现。

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟 HR 谈薪资。

这边给大家一个建议,如果你的理想薪资是 30K,你完全可以跟 HR 谈 33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是 25K,你可以跟 HR 讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个 20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java 架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有 Java 核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring 源码合集+Java 架构实战电子书。![在这里插入图片描**《一线大厂 Java 面试真题解析+Java 核心总结学习笔记+最新全套讲解视频+实战项目源码》**

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

,咱们下期见。收藏 等于白嫖,点赞才是真情。

java 反射面试,Spring-MVC 必看笔记相关推荐

  1. Java反射机制大神必学系列之 ,高级与低级的差别在哪里?

    Java反射机制大神必学系列之 ,高级与低级的差别在哪里? java学习爱好者 2019-05-20 19:08 前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来 ...

  2. JAVA 实习面试题大全必看

    JAVA 实习面试题大全必看 JavaSE 88 基础语法 9 Q1:简单说说Java有哪些数据类型 答:①分为基本数据类型和引用数据类型.②基本数据类型包括:数值型(byte.short.int.l ...

  3. Java程序员总结出必看的初级~高级技术面试题

    1换位思考下,如果你面试官,你会怎么做 1只能通过简历和面试来衡量,别无他法.如果某位大牛确认能力很行,但面试时无法充分地自证能力,那对不起了,过不了,现实就这样. 2如果面试官由于能力不行,招进来一 ...

  4. Java校招面试经验汇总,看完直接跪服

    美团技术一面20分钟 晚7点,因为想到下周一才面试,我刚准备出去打个羽毛球,北京的电话就来了.面试官各种抱歉,说开会拖延了. 1.自我介绍 说了很多遍了,很流畅捡重点介绍完. 2.问我数据结构算法好不 ...

  5. Java中级篇——Spring MVC 是什么(附加响应状态代码列举)

    1.关于springMVC 基于Spring框架,主要解决后端服务器接受客户端服务器接受客户提交的请求,并给予响应相关的问题.的框架 目录 1.关于springMVC 基于Spring框架,主要解决后 ...

  6. java书籍_Java程序员必看的 13 本 Java 书籍!

    原文:Java程序员必看的 13 本 Java 书籍! 作者: java技术栈 关乎于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是:多!看!书! 毕竟,书是学习的海洋呢!So,J ...

  7. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  8. 高级java知识结构图,Spring高级框架课程笔记 PDF 下载

    主要内容: Spring ⾼级框架(讲师:应癫) ssh = spring + struts + hibernate ssm = spring + springmvc + mybatis spring ...

  9. java 反射机制 视频_【视频笔记】Java反射机制笔记

    Java 语言的反射机制 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法.对于任意一个对象,可以调用它的任意一个方法. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

最新文章

  1. 排序算法之冒泡,选择,插入
  2. 皮一皮:这小伙子怎么能掌握这么多高深技术!!!
  3. layui学习资料汇总
  4. 003_数据模型一览
  5. Bigo 实时计算平台建设实践
  6. jzoj3913-艰难的选择【差分,统计】
  7. !--more--搭建的博客设置主页内容高度
  8. 画质与性能双重加持,Unity超越游戏的“炫技”
  9. rsync 全网备份企业案例
  10. 并行学习框架下基于GAN的城市道路网短时路段交通预测方法
  11. java不想被gc,Java GC 必知必会
  12. error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCR...
  13. Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染
  14. 在安卓系统上使用NFC技术的模拟M1卡的探索之路
  15. C# 中国大陆二代身份证号生成及格式验证
  16. 2017-4-6 四月生花,冷暖自知
  17. 【django】图形验证码接口设计、后端逻辑、前端逻辑【15】
  18. 注册验证码短信收不到是怎么回事
  19. Hutool做excel的解析
  20. 2022年全球市场总线插头总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. 【入门软件测试01-抖音项目】
  2. 线上翡翠原石怎么引流,做翡翠的几个高效的引流渠道
  3. 戏曲《未央宫》郭德纲
  4. (4.6.29.3)插件化之代码加载:启动Activity等四大组件之hook方式
  5. java开发文件夹加密解密程序_Java应用开发:文件加密解密
  6. Gap year 资料整理
  7. field list什么意思_手机NFC功能有什么用?这5点你需要知道,生活常用!
  8. UML之深入浅出类图讲义
  9. web前端开发企业命名规范
  10. 索菲亚·阿莫鲁索 不良女青年的“逆袭”