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启动过程实例化补充——@Bean

前言

上一次我们在分析spring boot启动过程实例化方式的时候,关于工厂方法没有做过多说明,一方面是我确实当时不太清楚,另一方面在spring boot的启动流程中,我们并没有找到相关代码,所以最后就一笔带过了。

由于最近这两天把spring boot之前提出的示例demo已经分享完了,最近也正苦于没有学习目标,因此呢,今天我们就来详细看下spring boot的工厂实例化方式。

我们今天不在从启动流程入手,我们换个思路,直接从@Bean注解入手,看下@Bean注解的方法到底是如何被处理的,以及它是何时被处理的。

@Bean注解

首先我搜索了全局有用到Bean.class的地方,找到以下结果:

总共找到10条记录,其中前两条和我们昨天分享的条件配置有关,主要是判断方法是否存在@Bean注解,但是这里并不进行实例化操作,所以我们这里就不深入研究了;

第三行、第四行是获取所有包含@Bean注解的方法的元数据,但是由于这个类是和异常报告相关的(NoSuchBeanDefinitionFailureAnalyzer,从名字可以看出来是个失败分析器,找不到bean的定义信息时触发),所以我们也不做过多说明。不过从调用的方法名来看,这个方法的作用是获取所有的beanMethod

第五行是判断某个方法是否包含@Bean注解:

第六行是获取注解的属性,并从属性中拿到name属性,这个属性最后会变成我们的beanName

第七行是从方法的元数据中获取@Bean注解的属性信息,然后将这些属性信息赋值给bean的定义信息。这个方法很长,信息量也很多,不仅包括了工厂方法的设置,还包括autowireinitMethoddestroyMethod等信息的配置。

然后沿着这个方法我最后进入了refresh方法中,也就是说其实在refresh方法中会调用我们上面这个方法,下面是它的调用流程:

看着这个方法,看着有点眼熟,但是感觉我上次好像没有讲到,然后我又回去翻了下上次源码分享的内容,最终确认这块的内容当时确实没有讲到,当时并没有将这么细。

总体来说,这块的核心代码就是处理bean的定义信息,处理完成后,通过@Bean注解配置的bean的定义信息就会被注册到容器中,然后会在后期实例化的时候,调用bean的工厂方法进行实例化,这种方式就是我们当时没有展开讲的工厂实例方式,这种方式在spring boot中也是广泛存在的,当然关于这一点我也是今天才知道的。

测试

下面我们通过一个@Bean配置实例来看下。首先是我们通过@Bean注解配置的一个过滤器:

然后在一个偶然情况下,我找到了通过工厂方法实例化的方式(我到现在都不知道当时咋发现的,这就是机缘吧),这正是这一发现,我们才有今天的内容,总之就是很偶然。

这是位于SimpleInstantiationStrategy的一个实例化方法,从名字可以看出来,这个类是一种实例化策略,方法的作用就是根据工厂方法实例化对象,从debug截图可以看出来,这里的factoryMethod就是我们加了@Bean注解的方法名,beanName默认就是我们的方法名:

关于这个方法的调用流程,我们后面有机会再讲,今天确实有点太晚了,我们目前只需要搞清楚工厂方法的基本实例化方式就可以了。

总结

今天我们主要围绕着@Bean注解,分析了工厂方法实例化bean的方式和基本流程。

从内容上来讲,其核心就是BeanFactory相关的bean定义信息的设置和赋值,然后就是工厂实例化方式的演示。由于时间的问题,还有一些内容没有分析到,但是目前的内容已经可以让我们比较全面地看到@Bean注解的实例化方式,虽然有一定成都额运气成分,不过这也算是意外的收获吧。

好了,今天的内容就先到这里吧,各位小伙伴,晚安吧!

posted @ 2021-09-24 13:10  云中志  阅读(220)  评论(0编辑  收藏  举报