Spring 通过构造方法注入导致的循环依赖问题_循环依赖:构造方法注入容易引发循环依赖的问题-程序员宅基地

技术标签: spring  开发中遇到的问题  java  

如果你主要使用构造函数注入,则可以创建无法解析的循环依赖关系场景。

例如:类A通过构造函数注入需要类B的实例,而类B通过构造函数注入需要类A的实例。如果将A类和B类的bean配置为相互注入,则Spring IoC容器会在运行时检测此循环引用,并抛出a BeanCurrentlyInCreationException

一种可能的解决方案是编辑由setter而不是构造函数配置的某些类的源代码。或者,避免构造函数注入并仅使用setter注入。换句话说,尽管不推荐使用,但您可以使用setter注入配置循环依赖关系。

与典型情况(没有循环依赖)不同,bean A和bean B之间的循环依赖强制其中一个bean在完全初始化之前被注入另一个bean(经典的鸡与鸡蛋场景)。

    <bean id="person" class="pojo.Person">
        <constructor-arg index="0" value="小明"/>
        <constructor-arg index="1" value="12"/>
        <constructor-arg index="2" value="student"/>
    </bean>

    <bean id="student" class="pojo.Student">
        <constructor-arg index="0" value="小王"/>
        <constructor-arg index="1" value="13"/>
        <constructor-arg index="2" value="person"/>
    </bean>

十一月 08, 2018 11:15:52 下午 org.springframework.context.support.GenericApplicationContext refresh
警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'person' defined in class path resource [applicationContext.xml]: Unsatisfied dependency expressed through constructor parameter 2: Could not convert argument value of type [java.lang.String] to required type [pojo.Student]: Failed to convert value of type 'java.lang.String' to required type 'pojo.Student'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'pojo.Student': no matching editors or conversion strategy found
十一月 08, 2018 11:15:52 下午 org.springframework.test.context.TestContextManager prepareTestInstance
严重: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@6fb554cc] to prepare test instance [demo.Demo1@55ca8de8]
java.lang.IllegalStateException: Failed to load ApplicationContext

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40695597/article/details/83870289

智能推荐

最近真机上的Plist 搞的我头大总是无法写入,这下终于行了_stringbyappendingformat 添加不进去-程序员宅基地

文章浏览阅读9.5k次,点赞5次,收藏7次。转载请注明本文章来自 x1135768777其实写入不到真机里面主要是你写入时,当前那文件夹里你要写入的plist根本不存在所以你怎么写都写不进去,所以你必须先创建你要写入的plist;你用这样初始化程序就能自己创建: NSMutableArray *dictplist = [[NSMutableArray alloc] init];_stringbyappendingformat 添加不进去

python编程—输入月份判断季节_python,请输入月份,判断这个月是哪个季节 3,4,5月----春季 6,7,8月----夏季 -程序员宅基地

文章浏览阅读1.6w次,点赞6次,收藏28次。使用列表代码如下:month = int(input('month:'))season = [[12,1,2],[3,4,5],[6,7,8],[9,10,11]]if month in season[0][0:3]: print('winter')elif month in season[1][0:3]: print('spring')elif month in se..._python,请输入月份,判断这个月是哪个季节 3,4,5月----春季 6,7,8月----夏季 9,10,

OpenMP在Windows下用VS使用_openmp vs-程序员宅基地

文章浏览阅读2.6k次。简述直接新建一个项目来使用就好了。在项目中需要把C++\语言中把对openMP的支持选择是。否则程序只会调用一个线程。代码#include &lt;iostream&gt;#include &lt;omp.h&gt;using namespace std;#pragma warning(disable : 4996)void Hello();int main(int arg..._openmp vs

ATECC508A芯片开发笔记(四):自定义配置508功能,规划DataZone数据存储_ecc508 寄存器-程序员宅基地

文章浏览阅读2.5w次,点赞2次,收藏7次。ATECC508A芯片开发笔记(四):自定义配置508功能,规划DataZone数据存储508A内部存储区介绍Data ZoneConfig Zone508A Config Zone配置(自定义) - ATECC508A芯片在使用之前,需要自定义配置ConfigZone与DataZone,并同Lock命令将两个区域锁住,否则无法正常使用功能。而一旦锁上就是永久性的,配置区不能够进行解锁_ecc508 寄存器

剑指Offer--044-扑克牌顺子_让用户输入1-13之间的数6个判断是连对还是顺子还是其他! js-程序员宅基地

文章浏览阅读2k次。链接 牛客OJ:扑克牌顺子 九度OJ:http://ac.jobdu.com/problem.php?pid=1355 GitHub代码: 044扑克牌顺子 CSDN题解:剑指Offer–044扑克牌顺子 牛客OJ 九度OJ CSDN题解 GitHub代码 044扑克牌顺子 1355-扑克牌顺子 剑指Offer–044扑克牌顺子 044扑_让用户输入1-13之间的数6个判断是连对还是顺子还是其他! js

向Hive导入TPC-H测试数据集-程序员宅基地

文章浏览阅读1.1k次。在数据库和大数据领域,TPC提供的基准测试数据集是做Benchmark的事实标准。常用且主要的TPC数据集有如下几种:TPC-C:模拟一个库存-订单系统以及其上的多用户并发事务;TPC-DI:模拟多种类型的大数据源的ETL过程;TPC-DS:模拟大型零售业务的系统,该系统主要用于BI和决策支持,数据量和OLAP查询复杂度都很高,是TPC数据集中最大的;TPC-E:模拟证券..._hive tpc-h

随便推点

单片机到底是不是嵌入式?-程序员宅基地

文章浏览阅读1.2k次。01 问题很多同学一直在纠结:我是学单片机呢还是学嵌入式呢?还有人说单片机也是嵌入式,到底对不对?嵌入式是不是就是linux?今天咱们说说这个问题。0..._单片机算不算嵌入式

关于 rank() 、dense_rank() 、row_number() over的理解-程序员宅基地

文章浏览阅读209次。关于 rank() 、dense_rank() 、row_number() over的理解Score 表数据如下:1、rank() over>> 排名相同的两名是并列,但是占两个名次 如:1 1 3 4 4 6select a.scores, (rank() over (order by scores desc)) AS "rank" from Score a[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTXrGz6k-1650857168

Blender2.8基础(一)快捷键与基础操作_blender样条怎么加点-程序员宅基地

文章浏览阅读4k次,点赞3次,收藏11次。声明:此为转载文章,原文链接原文 基础设置 返回次数设置 中文设置 单位设置:1、Blender默认单位是M米,初始创建的Box的边长是2米;2、显示单位:需要在编辑模式下,并选..._blender样条怎么加点

getopts 可选参数_getopts获得选项参数-程序员宅基地

文章浏览阅读209次。在写sh脚本的时候,常常需要运行时输入一些数据。之前已经知道用基本的$*,执行的情况,大概就是$0 $1 $2$3……那么,那些系统命令里的参数又是怎么做出来的呢?我们自己的脚本如何搞出来$0-$1的效果呢?这就是getopts的作用了。举例如下:#!/bin/bashecho"OPTIND starts at $OPTIND"while getopts ":pq:" optnamedocase ..._getopts 一个参数

参数方程中参数的意义: 参数方程定义: 什么是参数方程: 参数方程与普通方程的公式_参数方程与普通方程的互化-程序员宅基地

文章浏览阅读4.4w次,点赞8次,收藏30次。参数方程中参数的意义:参数方程中t的几何意义要看具体的曲线方程了,一般都是长度,角度等几何量,也有一些是不容易找到对应的几何量的。参数方程定义:一般的,在平面直角坐标系中,如果曲线上任意一点的坐标x,y都是某个变数t的函数{x=f(t),y=g(t)并且对于t的每一个允许值,由上述方程组所确定的点M(x,y)都在这条曲线上,那么上述方程则为这条曲线的参数方程,联系x,y的变数t叫..._参数方程与普通方程的互化

人工智能(AI)-程序员宅基地

文章浏览阅读7.6k次。人工智能(AI) 一、人工智能的核心——机器学习人工智能是一个很大的圈子,但人工智能的基础是机器学习。机器学习是什么?其实就是人告诉机器想做什么事情,并且给它一堆数据让它模仿着去做。机器学习需要什么?算法、数据、程序、评估、应用。机器学习能做什么?  机器学习在数据挖掘、图像识别、语音和自然语言处理中有着广泛应用。  机..._人工智能ai让女神们下海

推荐文章

热门文章

相关标签