• spring容器如何解决依赖循环


    1.什么是依赖循环(你中有我,我中有你):当我创建A对象时,发现需要用到B对象;然后我去创建B对象,发现需要用到A对象,但此时A对象还木有创建完成,那么问题来了,到底是先创建A对象还是B对象?(ps:回忆下对象的创建过程:https://www.cnblogs.com/LearnSB/p/13191418.html)

    2.springIOC容器工厂是如何解决依赖循环的:我们可能遇到过以下的场景,在不知不觉间就使用了依赖循环;

    @Service

    public ServiceA{

      @Autowired

      private ServiceB b;

    }

    @Service

    public ServiceB{

      @Autowired

      private ServiceA a;

    }

    上面的代码其实就存在依赖循环,只不过由spring容器在创建bean的过程中就解决掉了;那么springIoc是如何解决的?

    其实任何事物都有先后顺序,springIoc的‘提前曝光原则’(名字我瞎起的哈)恰好解决了这种看似无解的问题;

    ps:回忆朴实无华创建对象三部曲:https://www.cnblogs.com/LearnSB/p/13191418.html

    springIoc容器工厂创建对象利用了三个map,对应了常说的三级cache,如下:

    1)singletonObjects

    2)singletonFactories

    3)earlySingletonObjects

    ’提前曝光原则‘就是:A先去创建对象,创建到第二步骤发现需要用到B对象,A首当其冲先将自己暴露(设置是否可以访问的标志位allowEarlyReference ),然后再去获取B,B在第一步骤就发现需要用到A...由于之前A对象已经暴露,虽然还不完整,但是已经可以访问了(earlySingletonObjects),所以此时B对象率先完成创建;随之A对象也可完成创建;

    总结一下:谁先有需求,谁就先暴露自己,但是后完成;(ps:有点像LIFO原则)

    参考文档:https://blog.csdn.net/csdnlijingran/article/details/86617958

    https://blog.csdn.net/fedorafrog/article/details/104550165/

    我家后院有两颗树,一颗是枣树,另一颗是枣树。
  • 相关阅读:
    07.消除过期对象的引用
    1.1进程和多线程概述
    1.2什么是操作系统
    06.避免创建不必要的对象
    05.依赖注入优先于硬连接资源
    04.使用私有构造器执行非实例化
    03.使用私有构造方法或枚类实现 Singleton 属性
    02.当构造参数过多时使用builder模式
    01.考虑使用静态工厂方法替代构造方法
    iiS申请地址
  • 原文地址:https://www.cnblogs.com/LearnSB/p/14311936.html
Copyright © 2020-2023  润新知