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 能够通过顺序来保证一些流程化业务或者需求的正确性。
例如用了一些 AutoConfigureAfter
、AutoConfigureBefore
、ConditionalOnClass
、ConditionalOnBean
,等来控制 bean 的顺序,但是不一定要注入。
因为我看到了市面上很多手写自己的spring,都是先实例化所有bean,再走一个for loop,初始化他们。
至于为什么一些人不做,我认为应该是一方面由于 spring 这方面实现的太好了,另外一方面想要实现灵活的控制 bean 顺序需要更多繁琐的工作量,作者自己的需求不需要顺序控制,只想要一个精简的 bean 管理工具而已。
以上是基于自己的理解做的解答。
回答:
最直观的体现,直接实例化bean无法实现懒加载,第二,如果存在复杂的代理链的时候,是不是会有问题,这不清楚,毕竟我们用和人家写框架,它的测试范围可是比我们要广的
以上是 spring bean的实例化和初始化顺序问题? 的全部内容, 来源链接: utcz.com/p/944691.html