spring bean的实例化和初始化顺序问题?

比较肤浅理解spring不是完全实例化所有bean再进行属性注入,而是实例化一个bean然后再注入其属性?

例如A依赖B,那么spring启动的时候就会实例化A,发现A需要B,那么B就会实例化B,突然发现B依赖C,那么再创建C。

我的问题是,为什么不直接实例化A,B,C这个三个bean,然后放在一个 map中, 之后在下一个步骤依次反射获取A,B,C各自的属性,然后进行注入?

因为我看到了市面上很多手写自己的spring,都是先实例化所有bean,再走一个for loop,初始化他们。

但看了部分介绍spring的生命周期,看似并不会这样。先知道官方spring这样做的好处是什么?


回答:

为什么不直接实例化A,B,C这个三个bean,然后放在一个 map中, 之后在下一个步骤依次反射获取A,B,C各自的属性,然后进行注入?

实际上这个问题有一点不太合适,一定程度上,spring 是这样做的,即使一个 bean 不被任何 bean 依赖,它也会被创建,当 spring 发现 A 需要 B 时,如果 B 已经被实例化了,那么就直接取过来,如果没有那就实例化 B。

spring 真正核心的一部分地方在于,它控制了生成 bean 的顺序,让你的 bean 能够通过顺序来保证一些流程化业务或者需求的正确性。

例如用了一些 AutoConfigureAfterAutoConfigureBeforeConditionalOnClassConditionalOnBean,等来控制 bean 的顺序,但是不一定要注入。

因为我看到了市面上很多手写自己的spring,都是先实例化所有bean,再走一个for loop,初始化他们。

至于为什么一些人不做,我认为应该是一方面由于 spring 这方面实现的太好了,另外一方面想要实现灵活的控制 bean 顺序需要更多繁琐的工作量,作者自己的需求不需要顺序控制,只想要一个精简的 bean 管理工具而已。

以上是基于自己的理解做的解答。


回答:

最直观的体现,直接实例化bean无法实现懒加载,第二,如果存在复杂的代理链的时候,是不是会有问题,这不清楚,毕竟我们用和人家写框架,它的测试范围可是比我们要广的

以上是 spring bean的实例化和初始化顺序问题? 的全部内容, 来源链接: utcz.com/p/944691.html

回到顶部