Java循环引用

标签 java constructor stack-overflow circular-reference

在我正在进行的项目中,人们编写了服务类来访问 DAO。 几乎每个业务对象都有自己的服务,这些服务使用自己的 DAO。 在某些服务上,我们正在使用对其他服务的引用。 目前,人们正在构造函数中实例化所需的服务。

但是现在,我遇到了麻烦,因为服务 A 需要服务 B 而服务 B 需要服务 A,因此对任一构造函数的调用都会导致堆栈溢出 ...

示例(伪代码):

//Constructor of OrderService
public OrderService() {
     orderDAO = DAOFactory.getDAOFactory().getOrderDAO();
     itemService = new ItemService();
}

//Constructor of ItemService
public ItemService() {
     itemDAO = DAOFactory.getDAOFactory().getItemDAO();
     orderService = new OrderService();
}

你会如何解决这个问题?使用单例模式?

谢谢

最佳答案

Spring 框架通过使用依赖注入(inject)解决了这个问题。简而言之,它所做的就是实例化所有的DAO,然后在实例化之后,但在主要业务逻辑之前设置dao依赖。

如果您必须手动执行此操作,下面是一个示例:

/*
  OrderService
 */
public OrderService ()
{
     orderDAO = DAOFactory.getDAOFactory().getOrderDAO();
}

public setItemService (ItemService service)
{
     itemService = service;
}

/*
  ItemService
 */
public ItemService ()
{
     itemDAO = DAOFactory.getDAOFactory().getItemDAO();
}

public setOrderService (OrderService service)
{
     orderService = service;
}

/*
   Bring it together in some other class
 */
...
// instantiate singletons
orderService = new OrderService ();
itemService = new ItemService ();

// inject dependencies
orderService.setItemService (itemService);
itemService.setOrderService (orderService);

关于Java循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10580568/

相关文章:

java - 未实现的接口(interface)有什么用?

java - 寻找跨平台移动应用程序与微 Controller 通信的选项

java - Scala 构造函数混淆 - 请澄清

由于递归导致的 java.lang.StackOverflowError

java - 堆栈溢出错误

javascript - 使用 setTimeout 会阻止堆栈增长吗?

java - Swing:JComboBox 中所选项目旁边的 float 面板

java - file.mkdirs() 创建新目录但无法读取

java - 拆分文件中的信息并读取它们

javascript - 拦截 Javascript 中的构造函数调用