字节跳动面试分享:java工程师进阶路线(代码片段)

程序员DCS阿里 程序员DCS阿里     2022-12-09     665

关键词:

二、Spring生命周期的大胆猜测

这里分享一个阅读源码的小技巧:捉大放小,连蒙带猜!8字真言,我们在阅读源码过程中,因为你要知道,每一个被开源出来的优秀框架,其源码的体系都是极其庞大复杂的,我们不能面面俱到,所以在看源码过程中一定不能被细枝末节缠住,一定要先理清楚整个框架的一个大致思想和大致的框架体系,再去搞那些细枝末节,其效率会好很多,其次在看源码过程中,我们一定要大胆的去想,去猜测,如果这个功能让你自己去写,你会怎么实现!

我们今天学习SpringBean的生命周期也是按照这个8字真言去学习,通过我们之前所学,Spring大致有以下的功能:

  1. 他会帮我们自动的创建对象然后保存起来!
  2. 他会帮我们完成属性的填充!
  3. 如果我们设置了Aop的功能,他会帮我们自动的代理,实现切面功能!

我们从平常的使用中,至少可以得知以上的三点,如果让你自己去实现,必会如何实现呢?

  • 首先他既然能够帮我们自己创建对象,那么他肯定是通过反射来创建的,通过反射来创建,就必定绕不过去要使用Class对象创建,那么我们如何获取Class对象呢? 去扫描项目,将指定的包下的加了注解的类文件切割获取Class名称,通过反射加载Class名称,反射创建java对象!
  • 我们要完成属性的填充,为了方便和性能方面,我肯定会把这些创建好的对象保存起来,无疑Map容器是最合适的!
  • 我们在创建一个对象完成之后,反射拿到里面的属性,如果需要填充,我们先去我们之前保存的容器里面去取,取不出来在反射吧这个依赖的属性创建出来,然后填充进对象再保存在容器里面,从而完成了属性的注入!
  • 填充完成属性之后,我们那当前对象,取与Aop逻辑进行对比,判断是否需要代理,不需要则创建完成,保存进Map容器,需要代理则对当前这个类进行jdk或者cglib的代理然后再保存进容器里面!

于是乎,我们自己实现了一个Spring管理一个Bean的所有过程,画个图,他大概长这样!

自己实现看起来,整个流程就很清晰,扫描、创建、注入、代理、保存一应俱全,但是Spring的实现方式远比我们自己实现的要复杂的多得多!

三、Spring的生命周期流程

Spring作者希望,Spring再着手管理一个Bean的时候,它希望能够让Spring的使用者能够插手,Spring把一个类对象变成一个Java Object的每一步,怎么理解呢?

比如我们买了一栋新房子,这个房子需要取装修,你自己去装修诚然不够专业,不能够面面俱到,所以是我们就找了一个装修公司帮助我们装修新房,于是装修公司就开始预先画好的图纸进行装修,但是在装修的过程中,你为了让自己的新家更加温馨,你想挂一些壁画在墙上,但是图纸上却没有!于是你就找装修公司,要求装修公司在新家的墙上挂上一些壁画!装修公司在接受到你的请求之后,就吩咐装修的工人在图纸之外去给你在墙上挂上壁画之后,然后再接着装修!

上面这个小故事有 这样几个角色,我们把它和Spring对照起来!

  • 你:代表框架的使用者!
  • 新房:代表一个Class文件,你自己也能够装修,但是不够专业,所以交给装修公司! 那么你自己创建对象可能某些使用用起来很麻烦,所以我们交给了Spring容器!
  • 装修公司:代表着Spring容器!
  • 图纸:代表预设步骤,Spring原本就存在的步骤!
  • 工人:Spring提供的各种接口!我们可以通过Spring工厂提供的接口做各种自定义的配置!

上面的小故事,大致可以描述Spring生命周期的核心思想!Spring再对一个Class文件实例化成具体的Spring Bean的时候,它提供了各种接口,由我们自己实现!然后再实例化过程中,不同的时机,去调用不同的接口!从而完成Spring的整个生命周期的创建!

Spring的生命周期大致分为以下部分!

  1. 扫描项目,将项目指定目录下的Class文件转换为Class对象!

  2. 读取Class对象属性包装为BeanDefinition,然后保存再一个Map中!(不难理解,他是为了后续创建或者读取这个类的信息更加方便取而创立的)

  3. 将全部的类转化为 BeanDefinition 并保存之后,开始调用第一个回调接口BeanFactoryPostProcessor#postProcessBeanFactory()!

    • 它的调用时机是将扫描到的Class文件转换为 BeanDefinition 之后调用的,我们可以通过回调的方法获取所有的BeanDefinition ,而后续的所有对Class的操作都是基于BeanDefinition 操作的,所以,我们可以通过修改它,来改变后续的流程!
  4. 先从当前的容器对象取当前要创建的对象,当取出来的对象为null时开始着手创建对象!

  5. 做一系列的验证,比如验证这个类是否被排除、是否正在创建中、是否有依赖Bean【@DependsOn】注解、是否时单例等等!

  6. 验证通过之后,开始通过反射创建这个对象!

  7. 合并BeanDefinition ,这里涉及到Spring之前版本使用的父子容器的概念,属于另外一个知识点不做讲解!

  8. 判断当前对象是不是单例、是不是支持循环引用、是不是正在创建等!

  9. 执行第二个接口回调InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()方法!

    • 它的执行时机时实例化完成之后,属性填充之前,它的返回值是一个布尔值,当返回false时,不做自动属性填充!
  10. 执行第三个接口回调InstantiationAwareBeanPostProcessor#postProcessProperties()方法!

    • 他的执行时机是,实例化之后,属性填充检查之后,属性填充之前!它会返回一个属性,后续的属性填充会使用这个方法返回的值!我们可以在这个方法里面修改对应Bean的注入的值!
  11. 填充属性到对象!

  12. 调用第四个回调接口BeanNameAware#setBeanName()方法!

    • 调用时机:属性填充给完毕后,调用初始化方法之前;它的功能是能获取bean的Name!
  13. 调用第五个回调接口BeanClassLoaderAware#setBeanClassLoader()

    • 调用时机:BeanNameAware之后,他的功能是传入bean的类加载器;
  14. 调用第六个回调接口BeanFactoryAware#setBeanFactory()!

    • 调用时机:BeanClassLoaderAware之后,用于设置beanFactory!
  15. 调用第七个回调接口BeanPostProcessor#postProcessBeforeInitialization()方法

    • 调用时机是部分Aware之后,初始化方法之前!传入当前实例化好的对象和beanName,再初始化前做修改!
  16. 回调第八个比较重要的生命周期的初始化方法,它可以是一个InitializingBean接口的bean,也可以是xml中配置的类,也可以是被加了@PostConstruct注解的方法!

    • 该方法内部逻辑可以用户自己编写,调用时机为:实例化完成之后调用!
  17. 回调第九个回调接口 BeanPostProcessor#postProcessAfterInitialization()方法!

    • 该方法的调用时机为初始化方法执行之后,这里也是Bean实例化后的最后一步,也是SpringAop实现的重要的一步!
  18. 注册销毁方法,以便Spring容器销毁的时候进行方法的销毁!

整体的方法流程示例图如下:

四、对应源码结构图

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

如何获得这套优质的资料呢?

98157162)]

[外链图片转存中…(img-XmcUddz3-1626698157163)]

[外链图片转存中…(img-mor6I09K-1626698157164)]

如何获得这套优质的资料呢?

Java面试精选题、架构实战文档传送门:戳这里免费领取

sql查询语句先执行select,字节跳动算法工程师面试(代码片段)

SELECT<返回数据列表>#返回的单列必须在groupby子句中,聚合函数除外DISTINCT#数据除重ORDERBY<排序条件>#排序LIMIT<行数限制>其实,引擎在执行上述每一步时,都会在内存中形成一张虚拟表,然后对虚拟表... 查看详情

java面试者的经历,吐血分享字节跳动的java面试经验技巧

...享一份资深Java面试官整理的「 大厂高频核心面试题 」字节跳动面试题Http协议cookiesession介绍一下session表结构怎么设计,储存在哪里?你们的sessioncookie在项目里运用到哪里?算法题:[删除链表中重复的节点]在... 查看详情

字节跳动面经分享(android客户端)(代码片段)

...双非学校,且非科班生,有三个App上架,大三在读9月1号投了字节的简历,9月中旬参加了笔试,9月底收到字节面试邀请10月初参加了第一轮面试,10月中旬参加了二面,10月27日参加了三面10月28日offermail一面(60分钟)前15分钟个人介绍,什么时... 查看详情

字节跳动面试210615大数据java(搜索二叉树后续遍历,非递归)(代码片段)

 面试的是一位大数据组的老大,上来就让先写一个搜索二叉树后续遍历,半小时写出来。因为当时太紧张没写出来后面捋了一下思路写出来了。这个其实很考虑思想的转变过程,和大家分享一下解法,经过检验10... 查看详情

字节跳动大数据开发面试题-附答案(代码片段)

此面试题来自牛客网友分享的字节跳动应届一面,面试时长一小时。网友情况:985本硕。参考答案由本公众号提供。如有错误,欢迎指正!以下为面试过程中提问,岗位为大数据开发:自我介绍+项目介... 查看详情

这都没挂,2021字节跳动的android研发岗也太好进了吧?(面经+经验分享)(代码片段)

...xff0c;算是有大厂经验了,面试的岗位是Android应用开发工程师。职位描述:1、负责手机端系统应用的功能开发,维 查看详情

这都没挂,2021字节跳动的android研发岗也太好进了吧?(面经+经验分享)(代码片段)

...xff0c;算是有大厂经验了,面试的岗位是Android应用开发工程师。职位描述:1、负责手机端系统应用的功能开发,维 查看详情

字节跳动面试分享:java反射作用与意义

阿里一面:介绍一下自己。*项目参与的核心设计有哪些*java反射原理,注解原理?*ArrayList和LinkedList的插入和访问的时间复杂度?*说说一致性Hash原理*HashMap及线程安全的ConcurrentHashMap,以及各自优劣势*https和htt... 查看详情

涨薪10k的面试宝典,字节跳动十年测试经验分享!

背题是一个快速应付面试的方式,但如果你想在软件测试行业稳步前进、步步为营的话,建议大家还是有序学习软件测试知识,积累够了,转行、跳槽都是顺其自然的。在在给大家梳理面试题之前,先分享两... 查看详情

字节跳动java面试:java软件工程师简历描述项目

一、网络原理OSI与TCP/IP各层的结构与功能,都有哪些协议TCP建立连接的过程,为什么要三次握手?TCP、UDP协议的区别,各自的应用场景打开浏览器,输入URL地址,访问主页的过程HTTP有哪些方法?HTTP和HT... 查看详情

字节跳动技术总监自爆:java软件开发工程师面试题库中级

专题5:Java序列化1、什么是java序列化,如何实现java序列化?2、保存(持久化)对象及其状态到内存或者磁盘3、序列化对象以字节数组保持-静态成员不保存4、序列化用户远程对象传输5、Serializable实现序列化6、writeObject... 查看详情

字节跳动面试分享:java编程思想百度云

缓存雪崩缓存雪崩指的是Redis当中的大量缓存在同一时间全部失效,而假如恰巧这一段时间同时又有大量请求被发起,那么就会造成请求直接访问到数据库,可能会把数据库冲垮。缓存雪崩一般形容的是缓存中没有而... 查看详情

字节跳动面试官:java教学视频尚硅谷(代码片段)

异步复制MySQL的复制默认是异步的,主从复制至少需要两个MYSQL服务,这些MySQL服务可以分布在不同的服务器上,也可以在同一台服务器上。MySQL主从异步复制是最常见的复制场景。数据的完整性依赖于主库BINLOG的不丢... 查看详情

字节跳动面试经验汇总

...之后就重新规划了一下自己的职业方向,最终目标定在了字节跳动,比较年轻化的一家互联网公司,近几年的发展速度也比较快,综合方面来说比较适合自己,所以就投了字节的简历,Java研发方向的,之后接到面试通知,总共... 查看详情

字节跳动面试真题:现在的java开发主流技术(代码片段)

一、什么是ZooKeeperZooKeeper是一个分布式服务协调框架,提供了分布式数据一致性的解决方案,基于ZooKeeper的数据结构,Watcher,选举机制等特点,可以实现数据的发布/订阅,软负载均衡,命名服务,... 查看详情

字节跳动(抖音)android客户端实习3+1面经(代码片段)

很多朋友知道我在字节担任面试官,做公号的初衷之一也是希望能多一个为团队网络人才的渠道。但是一段时间下来发现真正找我咨询、内推的人并不多,不少同学对字节的面试有所忌惮,总担心准备不够。实际上字... 查看详情

2023秋招——大数据研发工程师提前批一面(代码片段)

...动数据研发面试经历-基础数仓.链接:2022百度大数据开发工程师实习面试经历.链接:2022暑期实习字节跳动数据研发面试经历-data部门链接:2 查看详情

2023秋招——大数据研发工程师提前批一面(代码片段)

...动数据研发面试经历-基础数仓.链接:2022百度大数据开发工程师实习面试经历.链接:2022暑期实习字节跳动数据研发面试经历-data部门链接:2 查看详情