工作5年了还说不清bean生命周期?大厂offer怎么可能给你!

栏目: IT技术 · 发布时间: 5年前

内容简介:第一,这绝对是一个面试高频题。比第一还重要的第二,这绝对是一个让人爱恨交加的面试题。为什么这么说?我觉得可以从三个方面来说:所以说,遇到这个问题,要么颤抖着死去,要么就需要你有强大的忍住不笑了的能力(这个梗可懂)。

第一,这绝对是一个面试高频题。

比第一还重要的第二,这绝对是一个让人爱恨交加的面试题。为什么这么说?我觉得可以从三个方面来说:

  1. 先说会不会。看过源码的人,这个不难;没看过源码的人,无论是学、硬背、还是说,绝对是一个坎。

  2. 再说考察点。这个问题还是比较开放的。可以用三五句话讲出来,也可以揪着面试官聊半个小时。

  3. 最后说效果。说的不好,绝对“狠减分”;说的好了,也绝对“狠加分”。

所以说,遇到这个问题,要么颤抖着死去,要么就需要你有强大的忍住不笑了的能力(这个梗可懂)。

好吧好吧,既然都这么“硬核”了,我们没有理由不拿下。

接下来我尝试站在面试官的角度来分析,“他们”想考察的知识点,摸清了套路,再设法一点点的去“喂饱”面试官。

第一层:简单回答问题

面试官心里分析:

作为面试官,我提这个问题,想知道你是否有看源码的习惯或者说经历。通过你的回答,我能初步判断出,你平时是满足于“CRUD”完成需求?还是有好奇心去寻找底层是如何实现的?进而我也就能预判,如果招你进来,是一个偏执行性的人,还是能在团队中承担更多的责任,能主动探究和发现问题。

其实这相当于面试官给我们画好的圈子,只要我们提出几个关键点,即可证明我们看过。

非主流标准答案:

part1.

在真正开始bean的生命周期之前,会读取资源文件,生成BeanDefinition对象。BeanDefinition是bean的前生,bean是BeanDefinition的今世。BeanDefinition除了像Class那样描述了属性方法之类的外,还描述bean的其他特性,比如,是否单例,依赖关系等

part2.

在整个生命周期中,主要就是两件事,bean的创建和赋值以及依赖关系的注入;通过各个扩展点丰富bean的能力,比如BeanFactoryPostProcessor、BeanPostProcessor等。

第二层:展露亮点

面试官心里分析:

仅仅达到目标我们就满足了吗?当然不能,我们追求的,是卓越!如果我们能借助一个类似流程图之类的框架,把bean生命周期在最短的时间内,清晰,简明的描述出来,这就是让面试官眼前一亮的亮点。我会觉得你,除了好奇心和自驱力外,理解和总结能力也不错,以后我们称为同事沟通时,不会让我觉得经常鸡同鸭讲(别告诉我你没遇到过这种人,给他把方案讲三两遍,一直在点头,等做出来的活发现还是南辕北辙,这绝对不是笑话)。

非主流标准答案:

part1.

bean的生命周期,主要经历4个阶段,4类扩展。分别结合两张图来说明,先来看下4个阶段:

工作5年了还说不清bean生命周期?大厂offer怎么可能给你!

说明:怎么理解这个过程呢?

  • 类比我们自己构造一个对象,也是先调用构造函数创建,然后通过setter为属性赋值。分别对应了上图中的【实例化】和【为Bean属性赋值。

  • 这里提了初始化环节,该环节对应执行的,是我们在定义bean(比如xml配置,比如注解中配置)时,配置的init方法。

  • 最后一个注销,就更好理解了,在 Java 出现之前的C时代,是需要 程序员 自己管理内存的,那么在分配内存创建对象后,是需要自己注销对象释放内存的。那么既然已经在Java里了为什么还要明确的有这个环节呢?我理解,作为框架,首先不能完全依赖GC来回收对象,这样太被动了;另外,我都是框架了,框架二字意味着什么?超强的整合能力!翻译成人话就是,你想要的都在这,你想做什么我都给你留了“后门”(接口)。,那当你想在这个环节搞点什么事情的时候,却发现我无能为力,岂不是尬了?

part2.

接下来再来看4类扩展。所谓扩展,首先我们简单的理解下,无非就是提供了一系列的接口,你只要实现这些接口,就能在整个生命周期的某一个节点,执行你实现的方法逻辑,在这个方法里呢,可以拿到xxx对象(比如ApplicationContext,比如BeanDefinition,比如Bean等等);然后对这些对象做点什么。还是来看下图:

工作5年了还说不清bean生命周期?大厂offer怎么可能给你!

请看上图,一个色系代表一类接口。

  1. BeanFactoryPostProcessor接口,实现该接口可以拿到BeanDefinition,可以做修改。

  2. BeanPostProcessor接口,上图中的InstantiationAwareBeanPostProcessor是其子接口,所以都归为一类,都是和创建bean相关的。

  3. xxxAware接口,比如BeanNameAware,BeanFactoryAware,ApplicationContextAware,拿ApplicationContextAware来说,可以获取当前上下文,然后进而拿到bean的实例,进行处理。

  4. xxxBean接口,有三个典型应用:

    1. FactoryBean:能生产bean的工厂。

    2. InitializingBean:初始化bean时候可进行扩展

    3. DiposibleBean:注销bean时候可进行的扩展

第三层:释放个人魅力

面试官心里分析:

在讲清流程的基础上,如果你还能说一说框架在现实中的应用就更上一层楼了,我会认为你在工作中遇到问题时,工具箱里可选的 工具 更多。这无论从哪个角度来看,都能为团队带来正向的收益。

非主流标准答案:

  1. BeanFactoryPostProcessor接口应用:

    1. mybatis,就是实现该接口的子接口,来通过mapper接口和xml中的sql,生成对应的类的BeanDefinition,这样在使用时,就不用自己在写连接数据库,创建Session,执行查询等等逻辑了。

    2. 在spring-boot中,入口方法在标注了@Configuration注解的类中,那这个方法是如何注入到spring中的呢?扫描标注该注解的逻辑,就是写在实现了BeanFactoryPostProcessor接口的子接口的实例里。

    3. 还有直接实现BeanFactoryPostProcessor接口的,比如我们定义的DataSource中的占位符,替换成实际的值。

  2. BeanPostProcessor接口的应用:

    1. AOP中需要在创建实例前判断是否需要创建代理对象,相当于是阻断了实例的创建。就是在实现InstantiationAwareBeanPostProcessor接口的实例中实现的,执行的是xxxBefore()方法

    2. 我们常用@AutoAware注解,引入一个bean,其依赖注入就是在InstantiationAwareBeanPostProcessor.xxxPropertyValues()方法中实现的。

其他的,暂时不在这里列出,既然你看到了这篇文章,那么也参与进来,我们一起补全。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bulletproof Ajax中文版

Bulletproof Ajax中文版

Jeremy Keith / 刘申、宋薇 / 人民邮电出版社 / 2007-11 / 39.00元

本书介绍了如何构建无懈可击的Ajax Web应用程序,重点讲述如何在已有Web站点使用Ajax增强网站用户体验,从而尽可能地保证网站拥有最大限度的可移植性和亲和力,这正是目前大多数网站面临的需求。书中主要介绍了JavaScript、DOM、XMLHttpRequest、数据格式等,同时还提出了一种Hijax方法,即可以让Web应用程序平稳退化的方法。 本书适合各层次Web开发和设计人员阅读......一起来看看 《Bulletproof Ajax中文版》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试