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 · 肆

前言

昨天我们又分析了容器的创建过程,从容器的创建过程中,我们找到了beanFactory实例化后最基本的初始化——注册需要忽略的接口(ignoreDependencyInterface)、注册配置处理器(registerAnnotationConfigProcessors),beanFactory剩余的初始化操作都在后面的方法中,今天我们先来看prepareContext,虽然在prepareContext前面还有一个getSpringFactoriesInstances方法,但是这个方法并没有和beanFactory进行交互,所以就直接跳过了。

prepareContext

关于这个方法,我们前面已经分析过了,但基本上都是一带而过,所以今天我们就沿着beanFactory的初始化过程再来看下这个核心方法:

我们先来梳理下这个方法的执行流程:

  • 设置容器环境(context.setEnvironment),这一步操作基本与beanFacotry没有关系,有的也是一些取值操作,并没有往beanFactory中注册数据:

  • 容器后置处理(postProcessApplicationContext),这个方法内部主要有三步操作。第一步是往beanFactory中注册beanName生成器,但由于默认情况下这个配置为空,所以并未进行注册操作;第二步是设置容器的资源加载器,由于resourceLoader是空,所以这里也没有设置;最后一步是注册转换服务,默认情况下会为我们注册136个转换器,这些转换器的作用就是进行类型转换,如果能在实际开发中用起来,那也是美滋滋了:

    可以看到默认情况下为我们注册的转换器包括了StringDate这种常用的转换,当然我们也可以定义自己的转换器,这个我记下来,后面专门出一期demo示例。

  • 初始化操作(applyInitializers),这个方法我们昨天已经分析过了,这里就不再赘述了,后面关于ApplicationContextInitializer的初始化我也会专门做一期demo分享的。

  • 绑定容器初始化事件(contextPrepared),这个方法在容器创建并准备好之后,资源加载完成前执行,这一步和beanFactory也没有关系

  • 打印startupInfo。下面那一段代码就是打印启动日志信息, 默认情况下logStartupInfotrue,所以控制台会输出两行日志:

  • 获取beanFactorycontext.getBeanFactory()),这个是为了方便后面注册数据,因为紧接着就需要把springApplicationArgumentsspringBootBanner等注册到beanFactory中:

    最终registerSingleton方法会把他们注册到singletonObjects容器中,从名字我们就可以看出来,这是个存放单例对象的容器。

  • 设置是否允许同名覆盖(setAllowBeanDefinitionOverriding),默认情况下为trueallowBeanDefinitionOverriding属性默认值)。如果为true,后面的BeanDefinition数据会将前面的覆盖掉。但是默认启动时,spring boot会将它该为false

  • 添加beanFactory懒加载后置处理器(addBeanFactoryPostProcessor),由于默认情况下并未启动懒加载,所以默认情况下懒加载后置处理器也不会被添加

  • 获取所有资源(getAllSources),默认情况下只包括当前spring boot项目的主类,同时关联了包括classLoaderpackages等数据

  • 将资源加载到容器中(load,官方文档给的解释是bean)。这个方虽然看起来其貌不扬,但是内部操作还是蛮多的。本来内容已经写出来了,但是介于篇幅我决定把剩余内容放到明天分享,当然也是因为load方法确实也比较重要,其内部不仅包括了scanner的初始化,而且包括了filter的相关内容,这些都算是spring boot的核心内容,所以还是要尽可能详细些。

总结

原本是打算把prepareContext的内容一次性分享完的,但是实际分享的时候,发现内容还是蛮多的,特别是load方法,一个看起来小小的方法,没想到它的内部初始化操作还挺复杂的。不过,经过今天的梳理之后,我感觉对prepareContext认识要比之前清晰多了,而且在分析的过程中,还发现了两个需要demo实践的内容,相关内容的flag已经立起来了,后面就该填坑了,这也算是意外的收获吧。

好了,今天就先到这里吧!

posted @ 2021-09-07 22:25  云中志  阅读(62)  评论(0编辑  收藏  举报