spring-bean对象创建销毁顺序&depend-on 干预

无依赖bean创建和销毁顺序

  • bean对象的创建顺序和bean xml中定义的顺序一致
  • bean销毁的顺序和bean xml中定义的顺序相反

通过构造器强依赖bean创建和销毁顺序

  • 这里的例子是 bean3->bean2->bean1, 而xml中bean的声明顺序为bean3 bean2 bean1
  • 因为是构造器中强依赖, 所以是在实例化的时候必须就要满足依赖, 否则不能实例化. 所以推测这里的真实实例化的顺序为bean1 bean2 bean3 (果然是这样, 不过如果是set弱依赖就不一样了, 先实例化, 再进行注入)
  • 对于销毁, 也是销毁最外面的, 先销毁bean3, 再逐步到里面, 也就是依赖别人的先销毁, 比如这里bean3 依赖bean2, 如果你先销毁bean3, bean2 就崩了, 所以肯定不能这样
  • 所以这里的创建销毁, 都是根据依赖链来决定正向或者反向的

通过set方法弱依赖bean创建和销毁顺序

  • 关于setter: 根据我对bean对象生命周期以及源码的了解, 先实例化, 再population, 所以这里得看定义的顺序, 如果是文章中的3 2 1的话, 依赖链也是一样的话, 那就是3 2 1创建. 先实例化3, 然后population, 然后实例化2, 然后population, 再实例化1
  • 总之, 是按照依赖链的正向顺序来创建

depend-on干预 bean创建和销毁顺序

  • 通过定义的顺序, 以及强依赖都可以干预bean的创建顺序
  • spring中可以通过depend-on来解决这些问题,在不调整bean的定义顺序和强加依赖的情况下,可以通过depend-on属性来设置当前bean的依赖于哪些bean,那么可以保证depend-on指定的bean在当前bean之前先创建好,销毁的时候在当前bean之后进行销毁
  • 意思是指定一个创建 销毁的顺序, 但并不是通过修改定义顺序和强依赖来实现
  • 不管bean2,bean2,bean4在任何地方定义,都可以确保在bean1创建之前,会先将bean2,bean3,bean4创建好,表示bean1依赖于这3个bean,可能bean1需要用到bean2、bean3、bean4中生成的一些资源或者其他的功能等,但是又没有强制去在bean1类中通过属性定义强依赖的方式去依赖于bean2、bean3、bean4;当然销毁的时候也会先销毁当前bean,再去销毁被依赖的bean,即先销毁bean1,再去销毁depend-on指定的bean。

这里基本上可以这样总结, 销毁的顺序和创建的顺序相反

参考资料

https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933982&idx=1&sn=69a2906f5db1953030ff40225b3ac788&chksm=88621e60bf159776093398f89652fecc99fb78ddf6f7434afbe65f8511d3e41c65d729303507&cur_album_id=1318969124223238148&scene=189#rd

猜你喜欢

转载自blog.csdn.net/qq_34687559/article/details/117068167