1. 1 不可撤销
  2. 2 小年兽 程嘉敏
  3. 3 手放开 李圣杰
  4. 4 迷人的危险3(翻自 dance flow) FAFA
  5. 5 山楂树之恋 程佳佳
  6. 6 summertime cinnamons / evening cinema
  7. 7 不谓侠(Cover 萧忆情Alex) CRITTY
  8. 8 神武醉相思(翻自 优我女团) 双笙
  9. 9 空山新雨后 音阙诗听 / 锦零
  10. 10 Wonderful U (Demo Version) AGA
  11. 11 广寒宫 丸子呦
  12. 12 陪我看日出 回音哥
  13. 13 春夏秋冬的你 王宇良
  14. 14 世界が终わるまでは… WANDS
  15. 15 多想在平庸的生活拥抱你 隔壁老樊
  16. 16 千禧 徐秉龙
  17. 17 我的一个道姑朋友 双笙
  18. 18 大鱼  (Cover 周深) 双笙
  19. 19 霜雪千年(Cover 洛天依 / 乐正绫) 双笙 / 封茗囧菌
  20. 20 云烟成雨(翻自 房东的猫) 周玥
  21. 21 情深深雨濛濛 杨胖雨
  22. 22 Five Hundred Miles Justin Timberlake / Carey Mulligan / Stark Sands
  23. 23 斑马斑马 房东的猫
  24. 24 See You Again Wiz Khalifa / Charlie Puth
  25. 25 Faded Alan Walker / Iselin Solheim
  26. 26 Natural J.Fla
  27. 27 New Soul Vox Angeli
  28. 28 ハレハレヤ(朗朗晴天)(翻自 v flower) 猫瑾
  29. 29 像鱼 王贰浪
  30. 30 Bye Bye Bye Lovestoned
  31. 31 Blame You 眠 / Lopu$
  32. 32 Believer J.Fla
  33. 33 书信 戴羽彤
  34. 34 柴 鱼 の c a l l i n g【已售】 幸子小姐拜托了
  35. 35 夜空中最亮的星(翻自 逃跑计划) 戴羽彤
  36. 36 慢慢喜欢你 LIve版(翻自 莫文蔚) 戴羽彤
  37. 37 病变(翻自 cubi) 戴羽彤
  38. 38 那女孩对我说 (完整版) Uu
  39. 39 绿色 陈雪凝
  40. 40 月牙湾 LIve版(翻自 F.I.R.) 戴羽彤
夜空中最亮的星(翻自 逃跑计划) - 戴羽彤
00:00 / 04:10

夜空中最亮的星 能否听清

那仰望的人 心底的孤独和叹息

夜空中最亮的星 能否记起

那曾与我同行 消失在风里的身影

我祈祷拥有一颗透明的心灵

和会流泪的眼睛

给我再去相信的勇气

越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请指引我靠近你

夜空中最亮的星 是否知道

那曾与我同行的身影 如今在哪里

夜空中最亮的星 是否在意

是等太阳先升起 还是意外先来临

我宁愿所有痛苦都留在心底

也不愿忘记你的眼睛

哦 给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行 哒~

我祈祷拥有一颗透明的心灵

和会流泪的眼睛 哦

给我再去相信的勇气

哦 越过谎言去拥抱你

每当我找不到存在的意义

每当我迷失在黑夜里

噢喔喔 夜空中最亮的星

请照亮我向前行

spring-boot源码分析之BeanFactory · 贰

前言

BeanFactoryspring boot的最重要的核心组件,当然也是spring boot非常基础的组件,所以梳理清楚BeanFactory的源码才是梳理清楚Spring boot源码的关键。前天,我们分享了beanDefinitionNamesbeanDefinitionMap的初始化过程,虽然过程中有涉及到beanFactory的相关知识点,但是关于beanFactroy我们还没有正式地分析过它,关于它的初始化过程,也是一无所知,为了更系统地了解beanFactory,从今天开始我们开始更系统地分析beanFactory的相关源码,下面我们就先来看下BeanFactory的初始化过程。

BeanFactory初始化

今天我们依然是从一张时序图开始讲起,下面这张时序图就是spring boot容器的BeanFactory初始化过程,beanFactory初始化其实是和容器的初始化同时完成的,它也是容器初始化过程中的重要一步:

在上面的时序图中,最关键的内容就是AnnotationConfigServletWebServerApplicationContext的实例化过程,这里面涉及到java类的初始化流程:创建子类时,必须先调用父类无参构造方法,所以AnnotationConfigServletWebServerApplicationContext是在所有父类实例化完成后,才完成它自己的实例化过程的。下面我们就来看AnnotationConfigServletWebServerApplicationContext的初始化流程。

createApplicationContext

debug的过程中,我发现 BeanFactory在容器被创建后就已经被初始化,这也就是说BeanFactory其实是在spring boot容器创建过程中被初始化的,所以我们今天主要就是研究容器创建过程,也就是createApplicationContext()方法:

关于createApplicationContext这个方法,我们前面已经展示过了,它的作用就是通过反射创建容器实例:

AnnotationConfigServletWebServerApplicationContext实例化

通过跟踪代码,最终可以确认,调用的是AnnotationConfigServletWebServerApplicationContext无参构造方法:

所以下面就是对AnnotationConfigServletWebServerApplicationContext的实例化,由于容器这块继承关系比较复杂,所以实例化顺序也比较复杂。

容器实例化

虽然各位小伙伴可能很清楚java对象实例化过程,但是我觉得还是有必要再补充说明下。在有继承关系的java对象实例化过程中,如果当前类继承了父类,在实例化当前类时,先要调用父类的无参构造方法(就算不指定,也会隐式调用)。所以,在这里初始AnnotationConfigServletWebServerApplicationContext时,会先调用它的父类无参构造方法,下面是AnnotationConfigServletWebServerApplicationContext的继承关系,看起来确实很复杂:

在跟踪代码的过程中,最终我确认BeanFactory是在GenericApplicationContext的无参构造方法中完成初始化的,也就是AnnotationConfigServletWebServerApplicationContext父类的父类的父类:

所以初始化的过程就是,AnnotationConfigServletWebServerApplicationContext的无参构造方法中先调用ServletWebServerApplicationContext的无参构造方法,ServletWebServerApplicationContext的无参构造方法中先调用GenericWebApplicationContext的无参构造方法,GenericWebApplicationContext的无参构造方法先调用GenericApplicationContext的无参构造方法(无限套娃)……

知识扩展

后续的调用这里就直接省略了,因为他们和BeanFactory没有关系,而且因为继承关系过于复杂,所以这里我们要尽可能简单。在这里所有的初始化操作中,调用父类构造方法始终是首先被执行的,也必须首先被执行(首先调用父类的无参构造方法),这也就是为什么我们在写类的有参构造方法的时候,如果父类没有无参构造方法时,必须显式调用父类有参构造方法,且必须放在第一行的原因:

总结

截止到今天,我们已经梳理清楚beanFactory的两块内容,一个是beanDefinitionNamesbeanDefinitionMap,他们都是beanFactory的核心属性,另一块就是我们今天的BeanFactory的初始化,下一步应该还是会进一步深挖beanFactory的相关知识点,因为从一开始我的想法就是要找到spring boot包扫描和实例化bean的相关逻辑,但到目前为止还没有理清楚这一块的逻辑和流程,不过我相信很快我们就能完成这个目标了,因为我们的每一步都在更靠近目标……

posted @ 2021-09-06 08:34  云中志  阅读(82)  评论(0编辑  收藏  举报