前言

昨天,有个女孩子问我提高数据库查询性能有什么立竿见影的好方法?

这简直是一道送分题,我自豪且略带鄙夷的说,当然是加「索引」了。

她又不紧不慢的问,索引为什么就能提高查询性能。

这还用问,索引就像一本书的目录,用目录查当然很快。

她失望地摇了摇头,你说的只是一个类比,可为什么通过目录就能提高查询速度呢。

唉,对啊,通过书目可以快速查询,这只是一个现象,真正原因到底是什么呢。

那女孩看着诧异且表情僵硬的我,满意而又意味深长的笑笑:原来你这个男程序员也不会,看来我还得靠自己研究了。

哎,熬夜又要憔悴了我这该死的美貌。

来自同行的羞辱,是可忍孰不可忍?!

于是,我踏上了数据库索引学习的不归路,原来数据库索引使用了一种叫 B+ 树的古老数据结构,当然也有 Hash 等类型,暂且不说,可 B+ 树 这是个什么妖魔鬼怪呢?

下面就来浅尝辄止的扒一扒树的前世今生。

二、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容器销毁的时候进行方法的销毁!

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

四、对应源码结构图

最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

戳这里免费领取下面所有资料

由于篇幅有限,这里以图片的形式给大家展示一部分

戳这里免费领取下面所有资料

[外链图片转存中…(img-2mwnR2T2-1624600758368)]

Redis宕机数据丢失解决方案,不吃透都对不起自己相关推荐

  1. Redis宕机的解决方案

    宕机: 服务器停止服务 如果只有一台redis, 肯定会造成数据丢失. 多台reids或者是Redis集群,服务器宕机还有办法. 从的redis宕机怎么解决 配置主从复制的时候才配置从的redis, ...

  2. 读者诉苦:Redis 宕机,数据丢了,老板要辞退我

    最近跟一位读者聊天,小哥非常郁闷,公司的Redis宕机了,线上业务受到了影响,老板非常愤怒,小哥担心会不会被辞退! 我也很好奇,问小哥Redis主节点挂了,还有备机啊.怎么会影响到业务呢? 小哥说,他 ...

  3. Redis宕机了怎么办?

    运维工程师必备的认证[红帽liunx-RHCE 8] 1.什么是哨兵 哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个: 监控主数据库和从数据库是否运行正常: 主数据出现故障后自 ...

  4. java开发微信公众号图片上传功能,不吃透都对不起自己

    常见的分布式事务场景 分布式事务其实就在我们身边,你一直在用,但是你却一直不注意它. 转账 扣你账户的余额,增加别人账户余额,如果只扣了你的,别人没增加这是失败:如果没扣你的钱别人也增加了那银行的赔钱 ...

  5. redis数据丢失_Redis持久化Redis宕机或者出现意外删库导致数据丢失解决方案

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:xlecho 转载自: https://www.cnb ...

  6. mysql 互为主备 宕机 数据丢失_Devops部署-mysql主备多从搭建

    ​双主多从架构原理介绍 IP 端口 账号 密码 服务名 10.1.1.2 3306 root/sync abc123! 数据库A 10.1.1.3 3306 root/sync abc123! 数据库 ...

  7. mysql主备删除备数据,mysql 互为主备 宕机 数据丢失_Devops部署-mysql主备多从搭建...

    ​双主多从架构原理介绍 IP端口账号密码服务名 10.1.1.23306root/syncabc123!数据库A 10.1.1.33306root/syncabc123!数据库B 10.1.1.433 ...

  8. linux查看/etc/fastab,/etc/fastab文件丢失致系统宕机的解决方案

    以centos6.4为例 1)模拟环境(系统文件丢失,并且备份) [root@linux65-yhg ~]# cat /etc/fstab # # /etc/fstab # Created by an ...

  9. 如何化身BAT面试收割机?不吃透都对不起自己

    前言 多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线 ...

最新文章

  1. 我在PMCAFF,感觉身体被掏空
  2. cmd 顺序启动服务_window下启动redis步骤和服务报错解决办法
  3. android111 java中调用c代码
  4. 寒冷的高纬度——我的梦开始的地方
  5. jsp获取多个checkbox的值
  6. 与计算机相关的课外活动,课外活动学生论文,关于应用型院校计算机专业课外活动相关参考文献资料-免费论文范文...
  7. 一个java中HashMap和HashSet的应用实例
  8. 区块链应用 | 区块链的火爆会一直持续吗?
  9. Navicat Premium for Mac 11.1.8 免费中文破解版下载
  10. 人脸识别摄像头与普通摄像头的区别
  11. 汉诺塔(Hanoi)图解递归算法
  12. 能否构成三角形的条件代码_初中阶段数学三角形相关知识点汇总,超全
  13. 苹果Mac突然没有声音,3 种方法快速解决没声音的问题
  14. 自带浏览器打不开网页?
  15. Windows 11 新版 22598 发布!引入 4K 聚焦壁纸,优化全新任务管理器和媒体播放器...
  16. 边境的悍匪—机器学习实战:第十九 大规模训练和部署TensorFlow模型
  17. FutureTask源码学习
  18. “赛博空间之神”袁仁广
  19. 诚邀校友企业参加香港科大研究生线上宣讲及招聘会
  20. BUUCTF(大帝的密码武器)

热门文章

  1. 关于autoupgader的狗屎问题
  2. qt商业版和开源版的区别_微擎商业版系统V2.0.9全开源版纯净框架
  3. 计算机硬件系统一直延用,会计从业资格证考试:会计电算化计算机硬件系统
  4. 计算机一级应用于段落还是文字,计算机一级复习资料
  5. sweetalert php,SweetAlert插件
  6. 大工20秋计算机组成原理在线作业2,大工14秋《计算机组成原理》在线作业2答案...
  7. C语言游戏传递小秘密,C语言的那些小秘密之链表
  8. python软件是哪个国家的品牌_有哪些好用的软件被国人误认为是外国研发的?
  9. linux重启鼠标键盘服务,Linux 关闭服务后 鼠标 键盘用不了
  10. mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解