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