Java循环引用 [英] Java circular references

查看:168
本文介绍了Java循环引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In the project im working on, people wrote services class to access DAO. Almost every business object has it's own service which use it's own DAO. On some services, we are using references to other services. At the moment, people are instantiating needed services inside the constructor.

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

But now, I have trouble because service A needs service B and service B needs service A so a call to either constructor results in stack overflow ...

示例(伪代码):

//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 Framework通过使用依赖注射。总之,它做的是实例化所有的DAO,然后在实例化之后,但在主业务逻辑之前设置dao依赖。

The Spring Framework solves this problem by using dependency injection. In short, what it does is to instantiate all the DAOs, and then set the dao-dependencies after instantiation, but before main business logic.

如果你必须这样做手动,这里有一个例子:

If you have to do this manually, here's an example:

/*
  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循环引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆