博客
关于我
怎么进阶学好Java 如何用Spring解决循环依赖
阅读量:196 次
发布时间:2019-02-28

本文共 1116 字,大约阅读时间需要 3 分钟。

如何用Spring解决循环依赖?

循环依赖,即循环引用,是两个或多个Bean相互之间的持有对方,最终反映为一个环。虽然循环依赖在某种程度上不可避免,但过多的依赖会增加系统的复杂性。Spring作为一个轻量级的控制反转(IoC)框架,提供了解决循环依赖的几种方法。

Spring循环依赖的三种情况

在Spring中,循环依赖主要有以下三种形式:

  • 构造器循环依赖
  • 构造器循环依赖无法在Spring中解决。Spring容器会在创建Bean的过程中将正在创建的Bean标识符放在一个当前创建Bean的池中。只要在创建过程中发现已经存在这个池中的Bean,就会抛出异常,提示循环依赖。

    1. setter循环依赖
    2. setter循环依赖是通过Spring容器提前暴露刚完成构造器注入但尚未完成其他步骤(如setter注入)的Bean来实现的。这种方法只能解决单例作用域的Bean循环依赖。通过在单例缓存中暴露一个工厂方法,使得其他Bean能够引用到该Bean。Spring会在实例化Bean后,将未设置属性的Bean对象放到一个Map中,并提供获取该未设置属性的Bean引用的方法。为何不直接暴露Bean而是暴露工厂方法?这是因为有些Bean需要被代理。

      1. prototype范围的依赖
      2. 对于“prototype”(原型)作用域的Bean,Spring容器无法完成依赖注入。因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露正在创建的Bean。


        Spring如何解决循环依赖?

        假设我们有一个循环依赖的场景:A→B→A

        以下是解决这种循环依赖的具体方法:

      3. 实例化A,并将未注入属性的A暴露给容器
      4. 在注入属性之前,首先需要实例化A,并将未注入属性的A暴露给容器。这样,当后续需要A时,可以从单例缓存或暴露的Map中获取。

        1. 开始为A注入属性,发现需要B
        2. 当尝试为A注入属性时,发现需要B,于是调用getBean(B)。

          1. 实例化B,并完成属性注入
          2. 在获取B的过程中,Spring会实例化B,并开始为B注入属性。假设B也需要注入A,这时就会发现需要A。

            1. 从单例缓存或暴露的Map中查找A
            2. 由于A已经被实例化并暴露,Spring会首先从单例缓存中查找A。如果没有找到,Spring会从暴露的Map中查找,完成A的注入。

              1. 递归完成后,返回到A的实例化过程
              2. 一旦B的属性注入完成,递归将返回到A的实例化过程中,完成A的所有属性注入,包括与B的循环依赖。

                通过以上步骤,Spring成功解决了循环依赖。


                如果你想深入了解Spring框架的更多知识点,或者希望快速进入Java行业,实现快速就业并追求高薪,可以考虑系统学习相关技术。

    转载地址:http://xpws.baihongyu.com/

    你可能感兴趣的文章
    Queue
    查看>>
    PL/SQL Developer中文版下载以及使用图解(绿色版)
    查看>>
    pl/sql developer乱码,日期格式等问题解决
    查看>>
    PL/SQL 中的if elsif 练习
    查看>>
    PL/SQL 存储函数和过程
    查看>>
    query简单入门到精通细节 - (六)Jquery效果之“淡入与淡出”
    查看>>
    PL/SQL提示“ORA-01722:无效数字,将无效数字查找出来
    查看>>
    PL/sql语法单元
    查看>>
    PL/SQL连接远程服务器数据库,出现ORA-12154: TNS: 无法解析指定的连接标识符。
    查看>>
    pl/sql锁
    查看>>
    PL2303 Windows 10 驱动项目常见问题解决方案
    查看>>
    QueryPerformanceCounter与QueryPerformanceFrequency
    查看>>
    Plaid.com的监控系统如何实现与9600多家金融机构的集成
    查看>>
    Plain Stock Prediction:基于RNN的股票价格预测工具
    查看>>
    platform_driver与file_operations两种方法开发led驱动
    查看>>
    PlatON共识方案详解:应用CBFT共识协议,提高共识效率
    查看>>
    QueryDict和模型表知识补充
    查看>>
    Querybase 使用与安装教程
    查看>>
    Playwright与Selenium的对比:谁是更适合你的自动化测试工具?
    查看>>
    quarz设置定时器任务的有效时间段_定时器?你知道有几种实现方式吗?
    查看>>