文档章节

关于循环依赖

_江左梅郎_
 _江左梅郎_
发布于 2015/11/24 17:27
字数 951
阅读 42
收藏 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的情况呢  这个是一个环状

这个情况怎么解决呢? 有没有办法?

其实,没错,还是可以用上述方法实现 


© 著作权归作者所有

_江左梅郎_
粉丝 0
博文 6
码字总数 5420
作品 0
深圳
私信 提问
Spring读书笔记——bean创建(上)

通过《Spring读书笔记——bean加载》和《Spring读书笔记——bean解析》,我们明白了两件事。 Spring如何加载消化一个xml配置文件 Spring如何将xml文件的各种标签转换为BeanDefinition并注册到...

Jackie_Zheng
2017/10/22
0
0
Spring 循环引用 ——理解singleton与prototype初始化的区别

所谓的循环引用,就是A依赖B,B又依赖A,A与B两个对象相互持有。像下面这种情况: class A{B b;public A(B b) {this.b=b;}} class B{A a;public B(A a ){this.a=a;} }我们知道spring在获取对...

非沧海一粟不随波逐流
2016/12/19
85
0
深入浅出 - vue变化侦测原理

其实在一年前我已经写过一篇关于 vue响应式原理的文章,但是最近我翻开看看发现讲的内容和我现在心里想的有些不太一样,所以我打算重新写一篇更通俗易懂的文章。 我的目标是能让读者读完我写...

a独家记忆
2018/06/23
0
0
基于RequireJS和JQuery的模块化编程——常见问题解析

由于js的代码逻辑越来越重,一个js文件可能会有上千行,十分不利于开发与维护。最近正在把逻辑很重的js拆分成模块,在一顿纠结是使用requirejs还是seajs的时候,最终还是偏向于requirejs。毕...

青夜之衫
2017/12/04
0
0
commonjs 与 esm 的区别

js 社区存在多种模块化规范,其中最常使用到的是 node 本身实现的 commonjs 和 es6 标准的 esm。 commonjs 和 esm 存在多种根本上的区别,详细的比较在阮一峰的《es6标准入门》已经写得很详细...

keller35
06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新建时隐藏按钮,显示明细时显示

在InitControl()中 if (saTableKeys != null) { rpgDesign.Visible = true; rpgPrint.Visible = true; }......

_Somuns
32分钟前
5
0
【实战演练,拒绝996】-SpringBoot2.x自定义Spring boot Starter

欢迎关注 提升能力,涨薪可待 面试知识,工作可待 实战演练,拒绝996 如果此文对你有帮助、喜欢的话,那就点个赞呗! 前言 是不是感觉在工作上难于晋升了呢? 是不是感觉找工作面试是那么难呢...

ccww_
34分钟前
8
0
SpringBoot从入门到放弃,原理篇-自动配置原理

SpringBoot从入门到放弃,原理篇-自动配置原理 springboot自动配置原理 配置文件能配置的属性参照 自动配置原理 1、springboot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfig...

有一个小阿飞
今天
11
0
php变量和数据类型

php中的变量 PHP中的变量声明 PHP中的变量的使用 PHP中的数据类型之整型 PHP数据类型之浮点类型和布尔类型 PHP数据类型之字符串类型 PHP数据类型之heredoc和nowdoc的使用 PHP数据类型之复合类...

达达前端小酒馆
今天
7
0
OSChina 周日乱弹 —— 沙发忽然就爆炸了,吓死我了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】@这次装个文艺青年吧:#今日歌曲推荐# 分享Vicetone/Youngblood Hawke的单曲《Landslide》: 《Landslide》- Vicetone/Youngblood Hawke 手机党...

小小编辑
今天
253
9

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部