gpt4 book ai didi

Java循环引用

转载 作者:行者123 更新时间:2023-12-01 11:52:06 24 4
gpt4 key购买 nike

在我正在进行的项目中,人们编写了服务类来访问 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com