码迷,mamicode.com
首页 > 其他好文 > 详细

循环依赖问题

时间:2016-04-20 11:34:14      阅读:645      评论:0      收藏:0      [点我收藏+]

标签:

1:不要出现相互依赖  或者循环依赖, 最好是单向依赖   (之前pb出现循环依赖)
 
 
2:api之间不相互依赖, 只是实现之间相互依赖api,这样就不会出现循环依赖了
 
 
比如  现在的需求是  查询达人需要查询达人的行程,   查询达人的行程,也需要查询行程属于哪个达人    这个看起来似乎是
class User{
private Journey journey;
}
 
 
class Journey{
private User user;
}
 
达人模块依赖于行程模块     行程模块也依赖达人模块   如果按照之前的设计一定是这样的
 
 
技术分享
 
 
 
 
 
也就是 user-api 里面有个方法  需要根据userId来获取行程对象Journey   而Journey对象在journey-api里面   所以 user-api  依赖了 journey-api
 同理, 需要根据journeyId 来获取User对象 那么 journey-api依赖了user-api.  那么问题来了,maven打包 很可能就会因为两者相互依赖编译通不过
 
 
 
 
 
如果改进一下呢?是这样的
 
技术分享
 
 
那么现在,实现只依赖api,api之间不依赖 , 然后通过dubbo的暴露服务的方式,自动去查找对应的实现 
 事实上,设计也是合理的, 细想一下, user-api为什么要依赖行程 journey-api 呢
 要依赖也是具体的实现的时候  才会获取到行程 
 
那么,问题又来了,我需要获取达人和他的行程 怎么办, 也就是最上面的User对象带journey
 
别急,如果是这样的需求,那么这样的一个接口,  不应该是user-api 单独提供,也不应该是 journey-api单独提供.
那么,怎么返回呢.答案应该是这样的,这一个controller里面调用2次
1: 获取User对象  User user=userService.getById(userId);
 
2:获取Journey对象   Journey journey=journerService.getByUserId(userId);
 
class UserResp{
privatee User user;
private Journey journey;
}
 
UserResp resp =new UserResp ();
resp .serUser(user);
resp .setJourney(journey);
 
这样是不是解决了呢 ,如果为了减少远程调用,那么是不是可用使用一个base-api  依赖 user-api 和 journey-api  一次返回 
 
那么对于最开始提到的pb循环依赖也是一样,2个对象相互依赖,那么怎么解决呢,那就是加一个对象,就像UserResp 把2个对象组合到一起 
 
所以解决这种循环依赖的本质,还是抽象一个第三方模块, 来分别依赖User和Journey。而不是两者互相嵌套,相互依赖
 
 
写到这里,你是不是觉得,这个循环依赖,像是死锁,两个人都需要对方的锁,但是都不给,导致都拿不到,然后互相等待。
 
这就跟2个小朋友都喜欢对方的玩具一样,都想交换来玩,但是谁都不想先给对方,怕对方不给自己,当然小孩子的心理是这样的。 
 
那么这样依赖怎么促成这个交易呢, 这就需要一个中间人了,比如爸爸妈妈说:你们先把玩具都给我,我不会要你们的玩具吧,这样说孩子肯定相信爸爸妈妈
于是,当爸爸妈妈都拿到玩具之后,再分别给2个小朋友,这样是不是就顺利完成了?
 
那么在这里爸爸妈妈充当了一个什么角色呢?没错,就是中间人。就是上面的第三方模块。就是上面的UserResp的
 
 
上面的情况是A---B  而且B---A的情况
 
那么 A---B   B---C  C---A的情况呢  这个是一个环状
这个情况怎么解决呢? 有没有办法?
其实,没错,还是可以用上述方法实现 
 
 
 
 
 
 
 
 
 
 

循环依赖问题

标签:

原文地址:http://www.cnblogs.com/Kaer/p/5411668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!