java - 具有范围 PROTOTYPE 的 Spring 循环依赖
问题描述
我创建了下面的场景来了解 Spring 循环依赖。
当范围是单例时它是干净的。但是当 S COPE 是 PROTOTYPE 时就会发生冲突。
所以我想知道 Spring 是否支持避免以下情况,或者我们应该改变设计。如果是这样,请提出一些设计。
考虑下面的例子。
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanB {
private BeanA beanA;
@Autowired
public void setBeanA(BeanA beanA) {
this.beanA = beanA;
}
public void printBeanB() {
System.out.println(getBeanName());
}
public void printBeanBBeanA() {
System.out.println(getBeanName() + " - " + beanA.getBeanName());
}
public String getBeanName() {
return "Bean B";
}
}
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanA {
private BeanB beanB;
@Autowired
public void setBeanB(BeanB beanB) {
this.beanB = beanB;
}
public void printBeanA() {
System.out.println(getBeanName());
}
public void printBeanABeanB() {
System.out.println(getBeanName() + " - " + beanB.getBeanName());
}
public String getBeanName() {
return "Bean A";
}
}
这是一个错误:
描述:
应用上下文中一些bean的依赖形成了一个循环:
demoApplication(字段私有 com.example.demo.beans.BeanA com.example.demo.DemoApplication.beanA)
那么Spring支持是避免这种情况还是我们应该改变设计。如果是这样,请提出一些设计。
解决方案
我可以通过使用@Lazy 注释来解决这个问题,如下所示。
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanA {
@Autowired
@Lazy
private BeanB beanB;
public void printBeanA() {
System.out.println(getBeanName());
}
public void printBeanABeanB() {
System.out.println(getBeanName() + " - " + beanB.getBeanName());
}
public String getBeanName() {
return "Bean A";
}
}
@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BeanB {
@Autowired
@Lazy
private BeanA beanA;
public void setBeanA(BeanA beanA) {
this.beanA = beanA;
}
public void printBeanB() {
System.out.println(getBeanName());
}
public void printBeanBBeanA() {
System.out.println(getBeanName() + " - " + beanA.getBeanName());
}
public String getBeanName() {
return "Bean B";
}
}
推荐阅读
- oracle - Oracle 的 ucp.jar 应该驻留在 Tomcat 的 lib 还是应用程序的 war 中?缺少 ResultSetMetaData。使用 Oracle 实现 Tomcat 应用程序的干净重新部署?
- mysql - 搜索不带首字母mysql
- android - 无需登录即可创建帐户
- javascript - 如何使用 jquery 创建交互式甜甜圈图
- docker - 如何通过 gradle 从 dockerhub marklogic 图像创建 marklogic 最基本的 3 节点集群
- android - WakeLock 打不开屏幕
- flutter - Flutter:感觉我的 Navigator 堆栈是空的,虽然如果我使用 Navigator.pop 效果很好,如果我使用 Navigator.popUntil 会出现黑屏?
- winforms - 限制 NumericUpDown 控件中的位数
- php - 通过 PHP 连接到 Websocket - 服务器不接受升级连接
- excel - Excel VBA - 如果从列表中不匹配,则删除行