Spring不能解决的三种循环依赖问题示例及其解决方案

2023-11-18

一、Spring不能解决的三种循环依赖问题

1. 构造器注入类型循环依赖

1)代码示例

@Component
class A1 {

    private B1 b1;

    public A1(B1 b1) {
        this.b1 = b1;
    }
}

@Component
class B1 {

    private A1 a1;

    public B1(A1 a1) {
        this.a1 = a1;
    }
}

2)错误信息

在这里插入图片描述
在这里插入图片描述

2. @Async类型循环依赖

1)代码示例

@Component
class A2 {

    @Resource
    private B2 b2;

    @Async
    public void hello() {
        System.out.println("hello I'm a2! ");
    }
}

@Component
class B2 {

    @Resource
    @Lazy
    private A2 a2;

    public void hello() {
        System.out.println("hello I'm b2! ");
    }
}

2)错误信息

在这里插入图片描述

3. prototype类型循环依赖

1)代码示例

@Component
@Scope("prototype")
class A3 {
    @Resource
    private B3 b3;
}

@Component
@Scope("prototype")
class B3 {
    @Resource
    private A3 a3;
}

2)错误信息

在这里插入图片描述

二、解决方案

在需要循环注入的属性上加上@Lazy 来解决循环依赖问题

三、单元测试

package com.example.demo5;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @Author lcb
 * @Date 2023/03/14
 **/
@SpringBootTest
public class CirculateDependencyTest {

    @Resource
    private A1 a1;

    @Test
    void constructorTest() {
    }

    @Resource
    private B2 b2;

    @Test
    void asyncTest() {
    }

    @Resource
    private A3 a3;

    @Test
    void prototypeTest() {
    }
}

//1、构造器注入问题
@Component
class A1 {

    private B1 b1;

    @Lazy
    public A1(B1 b1) {
        this.b1 = b1;
    }
}

@Component
class B1 {

    private A1 a1;

    public B1(A1 a1) {
        this.a1 = a1;
    }
}

//2、@Async
@Component
class A2 {

    @Resource
    private B2 b2;

    @Async
    public void hello() {
        System.out.println("hello I'm a2! ");
    }
}

@Component
class B2 {

    @Resource
    @Lazy
    private A2 a2;

    public void hello() {
        System.out.println("hello I'm b2! ");
    }
}

//3、prototype
@Component
@Scope("prototype")
class A3 {
    @Resource
    @Lazy
    private B3 b3;
}

@Component
@Scope("prototype")
class B3 {
    @Resource
    private A3 a3;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring不能解决的三种循环依赖问题示例及其解决方案 的相关文章

随机推荐

  • 英语语法笔记——并列句(二)

    找出长难句主干的三个步骤 看标点符号 看标点符号 看逗号 判断都在前面和逗号后面的部分 看看 介词 从句和非谓语动词在前面还是后面 如果在前面主干就在后面 如果在后面 主干就在前面 介词等 主干 主干 介词等 看分号 分号前后相当于一个并列
  • k8s 裸机安装 nginx1.19 ingrass

    k8s 裸机安装 nginx1 19 ingrass deploy yaml文件如下 apiVersion v1 kind Namespace metadata name ingress nginx labels app kubernete
  • javaAPI

    第一章 集合框架 集合框架 多个接口和类 不知道存在的对象的数量或者需要更复杂的方式来存储对象时 一一对应时也可以使用 可以使用集合框架 Java集合框架提供一套性能优良 使用方便得接口和类 它们为与java util包中 a Collec
  • 英语什么叫做自控力720词

    Two common terms from the psychological literature are self regulation and self control Self regulation is your ability
  • idea导入项目,Lombok插件安装了,且配置文件中配置了,还是不能正常启动,表示找不到get、set方法

    1 保证安装了Lombok插件 2 保证maven或者gradle中添加了依赖 3 如下配置
  • E45: ‘readonly‘ option is set (add ! to override)

    vim 修改文件出现错误 E45 readonly option is set add to override 其实这是权限造成的 文件设置成了只读权 只读文件修改前需要执行sudo 但是已经修改了 如何强制保存呢 只需要保存的时候执行如下
  • 【Python】读取txt文件,获取指定行中指定位置数据

    问题描述 需求 读取大约有200多行的txt文件 获取17 216行中每行中指定位置中的数值 实现 coding utf 8 Date 2020 5 21 21 53 Author Pangpd FileName read log py I
  • pytorch: tensor类型的构建与相互转换

    Summary 主要包括以下三种途径 使用独立的函数 使用torch type 函数 使用type as tesnor 将张量转换为给定类型的张量 使用独立函数 import torch tensor torch randn 3 5 pri
  • mpvue中配置vuex并持久化到本地Storage

    demo代码 github com jianjian we 配置vuex和在vue中相同 只是mpvue有一个坑 就是不能直接在new Vue的时候传入store 步骤 1 在src目录下新建一个store目录 结构如下 官方推荐 vuex
  • 微信公众号网页开发jweixin.js的使用

    首先申请测试账号 获取以下信息 使用你的appId和appsecret获取token https api weixin qq com cgi bin token grant type client credential appid wxa4
  • ESP32-cam 初体验 从esp32-cam的购买到局域网监控的实现

    ESP32 cam小项目 helloworld项目 前言 手头有一块esp32 cam闲置很久了 因为比赛和找工作的事情导致许欸小延期了很久 还是因为懒 最近从小仓库把板子捞出来了 上手玩一玩 本次学习参考了B站up 小铭同学 的教程 教程
  • 力扣 2697. 字典序最小回文串

    题目来源 https leetcode cn problems lexicographically smallest palindrome C 题解 从两端往中间判断 不同时则用字典序小的替换字典序大的 class Solution pub
  • mysql存储引擎

    目录 一 存储引擎概念 二 MyISAM特点介绍 三 MyISAM适用的生产场景举例 四 InnoDB特点介绍 五 InnoDB适用生产场景分析 六 企业选择存储引擎的依据 1 需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景 2 支
  • 机器学习算法:特征工程-特征提取

    学习目标 了解什么是特征提取 知道字典特征提取操作流程 知道文本特征提取操作流程 知道tfidf的实现思想 什么是特征提取呢 1 特征提取 1 1 定义 将任意数据 如文本或图像 转换为可用于机器学习的数字特征 注 特征值化是为了计算机更好
  • xdg-open 未找到命令

    安装 apt get install xdg utils root kylinos xdg open bash xdg open 未找到命令 root kylinos apt get install xdg utils 正在读取软件包列表
  • EC-IDE v0.4.1发布

    主要改动包括 在IDE中使用新版的文本编辑器 除去非标准的caller属性 修改 init 的参数 增加类成员浏览功 可至以下地址下载 http www supertree org home user fwg ec ide gb ec id
  • 2021-1-7-一文掌握git/github使用,内容详细,适合新手入门~

    文章目录 前言 一 git是什么 二 github 1 了解github 2 注册github账户 三 git安装 1 windows安装git 2 linux安装git 四 git github使用 1 git工作流简介 2 git基本命
  • jenkins自动部署分布式项目(一)——linux安装Jenkins(war包方式安装)

    1 将jenkins war 上传到服务器 我这里传带了 opt目录下 2 进入文件所在目录 cd opt 3 在文件目录新建一个日志文件 vim nohup out wq 4 执行命令安装并启动Jenkins nohup java jar
  • Coverity 代码静态安全扫描工具 : 认识Coverity

    摘要 Coverity是一款快速 准确且高度可扩展的静态分析 SAST 解决方案 可帮助开发和安全团队在软件开发生命周期 SDLC 的早期解决安全和质量缺陷 跟踪和管理整个应用组合的风险 并确保符合安全和编码标准 1 概述 Coverity
  • Spring不能解决的三种循环依赖问题示例及其解决方案

    文章目录 一 Spring不能解决的三种循环依赖问题 1 构造器注入类型循环依赖 1 代码示例 2 错误信息 2 Async类型循环依赖 1 代码示例 2 错误信息 3 prototype类型循环依赖 1 代码示例 2 错误信息 二 解决方