循环依赖问题

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的情况呢  这个是一个环状

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

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

时间: 2024-10-12 09:24:56

循环依赖问题的相关文章

小小见解之python循环依赖

a.py from b import b print '---------this is module a.py----------' def a(): print "hello, a" b() a() b.py print '----------this is module b.py----------' def b(): print "hello, b" def c(): print "hello, c" c() from a import

Spring之循环依赖

转:http://my.oschina.net/tryUcatchUfinallyU/blog/287936 概述 如何检测循环依赖 循环依赖如何解决 Spring如何解决循环依赖 主要的几个缓存 主要步骤 Spring不能完全解决的循环依赖问题 面对Spring不能完全解决的现状,我们该如何处理 概述 入职的时候学习spring研究过循环依赖,现在再回顾下,发现啥都忘记了,还是得总结下来,故总结该文. 本文主要解决如下问题: 1.何为循环依赖 2.如何检测循环依赖 3.循环依赖可以如何解决 4

剑指架构师系列-Struts2构造函数的循环依赖注入

Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } public class BloodImpl implements IBlood{ private IPeople people; @Inject public BloodImpl(@Inject IPeople people) { System.out.println("Blood 构造函数被调用.&q

JAVA循环依赖

最近看到一个问题:如果有两个类A和B,A类中有一个B的对象b,B类中有一个A的对象a,那么如何解决这两个类的相互依赖关系呢? 示例代码1 public class Test{ public static void main(String[] args) { B testb = new B(); } } class A{ public B b; public A (){ b = new B(); } public void printB(){ System.out.println("Ab"

Spring源代码解析 ---- 循环依赖

一.循环引用: 1. 定义: 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比方CircularityA引用CircularityB,CircularityB引用CircularityC,CircularityC引用CircularityA.形成一个环状引用关系. 2. 代码演示样例: CircularityA public class CircularityA { private CircularityB circularityB; public CircularityA()

在.NET Core中遭遇循环依赖问题"A circular dependency was detected"

今天在将一个项目迁移至ASP.NET Core的过程中遭遇一个循环依赖问题,错误信息如下: A circular dependency was detected for the service of type 'CNBlogs.Application.Interfaces.ITagService' 一开始以为是项目之间的引用关系引起的,在project.json中找来找去,一无所获. 后来从构造函数下手,才发现问题所在. 实现ITagService的类TagService的构造函数是这么定义的:

Spring的循环依赖问题

spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类: 在Spring中将循环依赖的处理分成了3种情况: 构造器循环依赖 setter循环依赖 prototype范围的依赖处理 构造器循环依赖 通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖. 如在创建TestA类时,构造器需要TestB类,那将去创建TestB,在创建TestB

spring学习——Ioc基础四(Di之循环依赖)

一. 什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环.此处不是循环调用,循环调用是方法之间的环调用.如图3-5所示: 图3-5 循环引用 循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误. Spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循

如何避免类之间的循环依赖

最近在看<Java应用架构设计 模块化模式与OSGi>,深有感触,在此做些总结.(电子版可以在Java1234.com上下载到) 在使用Java开发中,各种依赖不可避免.比如类之间的继承,jar包之间的相互依赖.依赖在某种程度上不可避免,但是过多的依赖势必会增加系统的复杂性,使代码难以阅读,从而成为团队开发的阻碍.循环依赖尤其糟糕. 循环依赖存在与多种实体之间,尤其是类.包.模块之间.当两个类相互引用时,就会出现循环依赖.下面摘抄书中的一个例子. 如图1.1所示,有Customer和Bill两

My.Ioc 代码示例——避免循环依赖

本文的目的在于通过一些示例,向用户说明 My.Ioc 支持哪些类型的依赖关系.也就是说,如何设计对象不会导致循环依赖. 在 Ioc 世界中,循环依赖是一个顽敌.这不仅因为它会导致 Ioc 容器抛出异常,而且还因为它是不可预知的,尽管通过仔细的配置是可以尽量避免这个问题的. 当用户在 Ioc 容器中注册对象时,他们事先并不知道该对象与其他对象之间的依赖关系,因为依赖关系是由 Ioc 容器管理的.这种依赖关系要等到用户首次调用 container.Resolve(contractType) 时才能确