1 什么是循环依赖
A类通过构造函数注入需要B类的实例,而B类通过构造函数注入需要A类的实例。如果您将A类和B类的bean配置为相互注入,则Spring IoC容器会在运行时检测到此循环引用,并抛出 BeanCurrentlyInCreationException。Bean A和Bean B之间的循环依赖关系迫使其中一个Bean在完全完全初始化之前被注入另一个Bean
2 举个例子
建立一个类Bean1
package com.example.demo.single;
import org.springframework.stereotype.Component;
@Component
public class Bean1 {
private Bean2 bean2;
public Bean1(Bean2 bean2){
this.bean2 = bean2;
}
}
建立一个类Bean2
package com.example.demo.single;
import org.springframework.stereotype.Component;
@Component
public class Bean2 {
private Bean1 bean1;
public Bean2(Bean1 bean1){
this.bean1 = bean1;
}
}
建立一个配置类Con1
package com.example.demo.single;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(“com.example.demo.single”)
public class Con1 {
}
建立测试类Test1
package com.example.demo.single;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test1 {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(Con1.class);
}
}
运行 结果如下:
3 解决方案
将构造注入改为setter注入,修改Bean2
package com.example.demo.single;
import org.springframework.stereotype.Component;
@Component
public class Bean2 {
private Bean1 bean1;
public void setBean1(Bean1 bean1){
this.bean1 = bean1;
}
public Bean2(){
}
}
重新运行: