Spring 如何解决 Bean 的循环依赖(循环引用)

news2024/11/23 21:23:44
@Component
public class A {
    
    @Autowired
    private B b;
    
}
@Component
public class B {
    
    @Autowired
    private A a;
    
}

上面的情况就是 循环依赖

Bean的创建初始化过程如下

如果不采取措施,那么循环依赖就会进入死循环

但 Spring 已经帮我们解决了大部分循环依赖问题

具体是如何解决的?

Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:

缓存名称

源码名称

作用

一级缓存

singletonObjects

单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象

二级缓存

earlySingletonObjects

缓存早期的bean对象(生命周期还没走完)

三级缓存

singletonFactories

缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的

下图是Bean的生命周期,我们依照Bean的生命周期来说明,关于Bean的生命周期可以参考我的另外一篇博客

http://t.csdn.cn/DZz5zhttp://t.csdn.cn/DZz5z

一级缓存 存放 已经全部完成的Bean,可以直接使用

二级缓存 存放 早期的bean对象,其生命周期还没走完,也就是仅通过构造函数创建出实例,但未进行依赖注入及其以下初始化步骤

三级缓存 存放 对象工厂,对象工厂用于创建对象,其具体作用下面会说明

实际上 一级 和 二级 缓存就能解决一般的 循环依赖问题

但是 如果一个对象被增强了,即 是个代理对象, 这个时候就需要一个三级缓存

 

 

但是 仍有些循环引用 Spring 解决不了,这时候需要手动解决,最典型的就是 构造方法出现了循环依赖,如下

@Component
public class A {

    // B成员变量
    private B b;

    public A(B b){
        System.out.println("A的构造方法执行了...");
        this.b = b ;
    }
}
@Component
public class B {

    // A成员变量
    private A a;

    public B(A a){
        System.out.println("B的构造方法执行了...");
        this.a = a ;
    }
}

解决办法 -- 延迟加载:

public A(@Lazy B b){
    System.out.println("A的构造方法执行了...");
    this.b = b ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ的使用详解

一、什么是MQ 1、什么是MQ MQ(message queue),本质是个队列,FIFO先入先出。只不过队列中放的是message,是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游…

EMC案例-接地环路对传导骚扰测试的影响

EMC测试案例分析——接地环路对传导骚扰测试的影响 本文主要就接地环路对传导骚扰测试的影响进行简要举例分析,为我们以后的测试方法提供参考。 Part 1 现象描述 某电子设备在进行传导骚扰测试时,在3MHz左右的频率点出现了超限的情况,其测…

ELK-日志服务【es-安装使用】

目录 【1】安装-配置elasticsearch(01、02、03相同) 端口 【2】安装-配置-启动-Kibana 【3】浏览器访问测试(10.0.0.21:5601) 【4】使用kibana创建、更新、删除es索引、文档 【5】组es集群(投票选举机制&#xf…

用户体验在APP开发中的关键性作用

在 APP开发过程中,如何设计才能让用户感到满意,是非常重要的一点, APP开发公司需要不断地学习新的 APP设计知识,因为只有这样才能设计出令人印象深刻的 APP。对于用户来说,产品的用户体验在很大程度上决定了产品的竞争…

引入头文件#include <iostream>的时候发生了什么?

<iostream> namespace std {extern istream cin;extern ostream cout;extern ostream cerr;extern ostream clog;extern wistream wcin;extern wostream wcout;extern wostream wcerr;extern wostream wclog;};cin是什么&#xff1f; cin extern istream cin; The objec…

elasticsearch集群部署搭建(一)

elasticsearch集群部署搭建&#xff08;一&#xff09; 部署信息JDK安装下载es安装包部署安装创建用户&#xff08;三台机器都执行&#xff09;解压安装包&#xff08;选择一台机器执行&#xff09;修改配置文件&#xff08;三台机器都执行&#xff09; 拷贝分发注册系统服务服…

微信小程序监听页面跳转API

// 放在app.js 里面的onshow生命周期里面wx.onAppRoute((res) > {console.log(路由跳转,res})})

基于B/S架构SaaS服务的实验室信息系统(LIS)

实验室信息系统LIS源码 实验室信息系统&#xff08;Laboratory Information System&#xff09;&#xff0c;简称LIS&#xff0c;是一个全面基于网络化应用&#xff0c;能够帮助用户按照规范内容和规范流程进行多角色、多层次检验信息及资源管理的系统。通过条码管理系统从HIS…

Java并发编程第一弹

1、线程的创建 创建线程的方式有两种&#xff0c; 第一种是通过继承 Thread 类&#xff0c;重写run 方法&#xff1b;第二种是通过实现 Runnable 接口 通过源码发现&#xff0c;创建线程只有一种方式那就是构造 Thread 类&#xff0c;而实现线程的执行单元则有两种方式&…

将node服务打包成可执行文件-PKG

背景 有时我们需要写一些node的服务或者是工具&#xff0c;但这些工具&服务可以运行的前提条件是当前环境需要安装好node&#xff0c;有时候我们把这些工具&服务发送给别人&#xff0c;在别人的电脑中未必有安装好的node版本&#xff0c;即便有也可能不是期望的指定的…

CMU 15-445 -- Join Algorithms - 09

CMU 15-445 -- Join Algorithms - 09 引言Join AlgorithmsJoin Operator OutputI/O Cost AnalysisNested Loop JoinSimple Nested Loop JoinBlock Nested Loop JoinIndex Nested Loop Join小结 Sort-Merge Join小结&#xff1a; Hash JoinBasic Hash Join AlgorithmGrace Hash …

如何获取铁粉

忽然发现我的铁粉从100变成了540&#xff0c;分享下我的经验&#xff0c;我觉得可能是我的机器人经常互动的问题&#xff0c;结合自己的看法和平台大佬的想法一些进行了梳理&#xff1a; 在当今社交媒体时代&#xff0c;吸引和保留铁粉&#xff08;忠实粉丝&#xff09;对于个…

Robocom2021 初赛

收录一下Robocom初赛的屌题&#xff0c;调了我一个多小时&#xff0c;是我菜了 题目详情 - 7-3 打怪升级 (pintia.cn) 题意&#xff1a; Code&#xff1a; #include<bits/stdc.h> using namespace std;int n, m, a, b, c, d, q, p; int f[1005][1005];const int N 2…

Vector - CANoe - 测试报告设置

file:///C:/Program%20Files/Vector%20CANoe%2015/Help01/CANoeCANalyzerHTML5/CANoeCANalyzer.htm#Topics/CANoeCANalyzer/Windows/TestConfigurations/TCConfigTC.htm 前面有过介绍&#xff0c;我们常用的测试报告还是以XML/HTML格式来生成测试报告&#xff0c;而对于XML/HTM…

【洛谷】P1342 请柬(正反建图+dijkstra)

1&#xff1a;思考&#xff1a; 从1到所用顶点简单&#xff08;单源最短路径。&#xff09;&#xff0c;重点在怎么解决所用点到1&#xff08;单终点最短路径&#xff09; 答案&#xff1a;反向建图使&#xff08;单终点最短路径→单源最短路径。&#xff09; 复杂度&#xf…

基于SpringBoot的网上订餐系统【附ppt和开题|万字文档(LW)和搭建文档】

主要功能 前台登录&#xff1a;前台登录&#xff1a; ①首页&#xff1a;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&#xff1a;菜品分类、菜品名称查询、食材查询、菜品详情、下单提交 ③个人中心&#xff1a;可以查看自己的信息、我的订单、我的地址 后台登录&#…

【杨氏矩阵】

这篇文章的对应思维导图为&#xff1a;思维导图 思维导图对应代码&#xff1a; //杨氏矩阵 #include<stdio.h>//void ysjz1(int a[3][3],int k) { // int x 0; // int y 2; // while (x < 2 && y > 0) { // if (a[x][y] > k) { // y--; // } // …

算法训练营第三十六天||● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 解法1&#xff1a; 本题其实和452.用最少数量的箭引爆气球 (opens new window)非常像&#xff0c;弓箭的数量就相当于是非交叉区间的数量&#xff0c;只要把弓箭那道题目代码里射爆气球的判断条件加个等号&#xff08;认为[0&#xff0c;1][1&#xff0c;…

【嵌入式Qt开发入门】Qt如何网络编程——获取本机的网络信息

Qt 网络模块为我们提供了编写TCP/IP客户端和服务器的类。它提供了较低级别的类&#xff0c;例如代表低级网络概念的 QTcpSocket&#xff0c;QTcpServer 和 QUdpSocket&#xff0c;以及诸如 QNetworkRequest&#xff0c; QNetworkReply 和 QNetworkAccessManager 之类的高级类来…

2023世界人工智能大会,和鲸科技入选中国信通院《2023大模型和AIGC产业图谱》

近日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代 AIGC 新浪潮”论坛上&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;正式发布《2023 大模型和AIGC产业图谱》&#xff08;以下称“图谱”&#xff09;。和…