首页 > 其他分享 >Spring-循环依赖

Spring-循环依赖

时间:2024-09-07 17:21:10浏览次数:9  
标签:ClassRoom classRoom 依赖 Spring Bean 循环 Student public 注入

预备知识

循环依赖开关(方法) - AbstractAutowireCapableBeanFactory#setAllowCircularReferences

  • 单例工程(属性) - DefaultSingletonBeanRegistry#singletonFactories
  • 获取早期未处理Bean (方法) - AbstractAutowireCapableBeanFactory#getEarlyBeanReference
  • 早期未处理Bean (属性) - DefaultSingletonBeanRegistry#earlySingletonObjects

循环依赖处理流程

案例代码:

@Component
public class ClassRoom {
    @Autowired
    private Collection<Student> students;

    public Collection<Student> getStudents() {
        return students;
    }

    public void setStudents(Collection<Student> students) {
        this.students = students;
    }
}
@Component
public class Student {
    @Autowired
    private ClassRoom classRoom;

    public ClassRoom getClassRoom() {
        return classRoom;
    }

    public void setClassRoom(ClassRoom classRoom) {
        this.classRoom = classRoom;
    }
}

这个例子ClassRoom里面注入了Student,Student里面又注入了ClassRoom。

首先要确保我们的循环依赖是单例的,然后再初始化单例Bean的时候会调用doGetBean方法,然后进入AbstractBeanFactory#doGetBean方法:
在这里插入图片描述
在getSington方法里面beforeSingletonCreation,有这样一个方法,这个方法会将当前正在创建的单例Bean放到singletonsCurrentlyInCreation中:
在这里插入图片描述
接着会调用我们拉姆达表达式穿进来的工厂createBean获取Bean,会判断是不是正在创建的Bean
在这里插入图片描述
如果是的话(前面在beforeSingletonCreation将当前创建的Bean放到了singletonsCurrentlyInCreation所以这里肯定是),会调用addSingletonFactory,会传进去一个拉姆达表达式:
在这里插入图片描述
这个时候singletonFactories就会存贮,并且earlySingletonObjects如果存在会移除这个Bean,同时将这个Bean放到已注册中:
在这里插入图片描述
接着就是这个Bean的populateBean逻辑,对依赖进行注入会处理依赖doResolveDependency:
在这里插入图片描述
由于我们注入Students是一个集合,所以会走multipleBeans这个处理:
在这里插入图片描述
这个时候又去getBean了,这个和我们上面ClassRoom走的是一样的流程,这个时候已经有两个了:
在这里插入图片描述
在Student注入的时候发现注入的字段又需要ClassRoom,于是又会去resolveDependency:
在这里插入图片描述
这个时候earlySingletonObjects里面没有,所以拿到了我们上面的singletonFactories中的singleFactory了,在拿到Bean以后就将singletonFactories中的移除了,同时将它放到earlySingletonObjects:
在这里插入图片描述
然后将这个ClassRoom的Bean注入到Student中:
在这里插入图片描述
我们可以看到这个时候ClassRoom里面是没有注入Students的:
在这里插入图片描述
接下来就是调用了addSington,里面如果判断是新创建的Sington做了这样几件事情:1)移除将当前Bean放到singtonObjects中 2)将singtonFactories中的singleFactory移除
在这里插入图片描述
然后回到了ClassRoom,这个时候Student的Bean已经进行了创建,进行注入即可。同时将这个Bean从创建中进行移除。
在这里插入图片描述
这就解决了循环依赖,我的理解是通过Map存储早期的Bean,然后注入的也是早期的Bean,等到它依赖的Bean完成注入的时候,注入的早期的Bean的引用也会发生变化,类似于一个延迟加载。

标签:ClassRoom,classRoom,依赖,Spring,Bean,循环,Student,public,注入
From: https://blog.csdn.net/qq_43259860/article/details/141992987

相关文章

  • SpringBoot集成WebSocket实现后端向前端推送数据
    SpringBoot集成WebSocket实现后端向前端推送数据这里最好了解一定websocket参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications在此之前可以了解一下【轮询(Polling)、长轮询(LongPolling)、服务器发送事件(Server......
  • 用RNN(循环神经网络)预测股票价格
    RNN(循环神经网络)是一种特殊类型的神经网络,它能够处理序列数据,并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系。RNN的基本结构RNN由多个重复的单元组成,每个单元......
  • springboot返回结果包装统一返回格式
     统一返回结果拦截处理类importcom.itcoder.test.utils.JsonUtils;importcom.sun.istack.internal.NotNull;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.core.MethodParameter;importor......
  • Spring 注解 @Resource 和 @Autowired 区别对比
    原文:Spring注解@Resource和@Autowired区别对比@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。共同点两者都可以写在字段和setter方法上。两者如果......
  • SpringCloud:Consul
    1.简介为什么引入微服务所在的IP地址和端口号硬编码到订单微服务中,会存在非常多的问题 (1)如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地址和端口号。 (2)如果系统中提供了多个订单微服......
  • springboot流浪天使乐园管理系统
    基于springboot+vue实现的流浪天使乐园管理系统(源码+L文+ppt)4-039第4章系统设计   4.1总体功能设计一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统,使用者登录时会在后台判断使用的权限类型,包括一般使用者和管理者,一般使用者只能对流浪动物提供查阅......
  • springboot小儿推拿培训系统
     基于springboot+vue实现的小儿推拿培训系统 (源码+L文+ppt)4-50                             3系统设计    3.1系统功能结构系统结构图可以把杂乱无章的模块按照设计者的思维方式进行调整排序,可以让设计者在之后的......
  • springboot流浪天使乐园管理系统
    基于springboot+vue实现的流浪天使乐园管理系统(源码+L文+ppt)4-039第4章系统设计   4.1总体功能设计一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统,使用者登录时会在后台判断使用的权限类型,包括一般使用者和管理者,一般使用者只能对流浪动物提供查阅......
  • springboot流浪天使乐园管理系统
    基于springboot+vue实现的流浪天使乐园管理系统(源码+L文+ppt)4-039第4章系统设计   4.1总体功能设计一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统,使用者登录时会在后台判断使用的权限类型,包括一般使用者和管理者,一般使用者只能对流浪动物提供查阅......
  • springboot流浪天使乐园管理系统
    基于springboot+vue实现的流浪天使乐园管理系统(源码+L文+ppt)4-039第4章系统设计   4.1总体功能设计一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统,使用者登录时会在后台判断使用的权限类型,包括一般使用者和管理者,一般使用者只能对流浪动物提供查阅......