maven 多模块拆分导致循环依赖问题

2022-07-12 08:58:19 +08:00
 ChenGangS

新人第一次提问,感谢各位大佬

是我的一个练手项目,目前使用了 springBoot ,我拆分了一个系统模块,OA 模块
系统模块包含了基本的后台管理和用户授权那块,同时还包含了 springboot 的启动类
OA 模块包含了 OA 的审批功能等等。

现在遇到的问题:

系统模块中有一个用户服务,我在 OA 模块里需要用到它, 我就需要在 OA 模块中引入系统模块才能使用到这个服务
而系统模块中必须引入 OA 模块以便被 spring 扫描,那么问题就来了,就发生了 A 需要 B ,B 需要 A 的循环依赖问题。

我想到的解决方案:

改造系统模块,拆分成多个 module ,分别单独暴露出 service 和 mapper 等类,让 OA 单独引用这个暴露的 service 模块而不需要引用整个系统模块

1.我想知道这样做是否可行,会有其他坑嘛
2.是否为主流的解决方案
3.我想知道还有其他解决方案嘛

谢谢啦!

2703 次点击
所在节点    Java
13 条回复
windyboy
2022-07-12 09:10:20 +08:00
关键字 exclude
ChenGangS
2022-07-12 09:17:23 +08:00
@windyboy 排除不了的,因为系统模块必须引入 OA 模块才能加入到容器, 而 OA 模块又需要系统模块的一些服务, 这就导致两个模块互相需要
windyboy
2022-07-12 09:37:14 +08:00
@ChenGangS 毛病在于你自己锁自己
可以使用不依赖同一个版本,保持 API 的情况下,以来一个低版本可以绕过
但问题还是来源于自身
jamel
2022-07-12 09:45:38 +08:00
把公用的提取出来,可以叫 api 、common 啥的。尽量少依赖于框架,尽量使用 spi 机制
VeryZero
2022-07-12 09:46:04 +08:00
感觉就不应该把 OA 和系统服务拆成多个 module 。如果 service 都要单独一个 module ,我个人感觉失去了多模块的意义。最终还是耦合在一起。

获取把启动类单独拆成一个 module ,这样可以让启动类依赖 OA 和系统服务,但是 OA 和系统服务不互相依赖。
jamel
2022-07-12 09:46:42 +08:00
如果是 spring 的话可以使用 spring.factories
carrie96
2022-07-12 10:17:43 +08:00
要不拆分成不同的服务?
ChenGangS
2022-07-12 10:33:53 +08:00
@VeryZero 感谢,我按照你的方法把启动类拆成了单独的 module ,确实把启动类放在系统模块不太妥,因为我是参考开源项目 eladmin 的拆法,但我发现这个拆法后期新增模块都必须依赖这个系统模块,导致出现奇奇怪怪的问题。
alvinbone88
2022-07-12 10:43:11 +08:00
要拆的话应该把各种 api 拆出来作为各模块的依赖,api 的实现则由单独的模块提供
nothingistrue
2022-07-12 10:54:57 +08:00
简单得很(不简单),把 OA 依赖得用户授权也拆成独立模块。拆分从来都是业务拆分,不是物理位置拆分。你这个系统(含用户)、OA 的拆分导致业务双向依赖,是很不好的拆分。业务依赖方向应该是:应用程序,OA ,系统底层。其中只有应用程序是可启动的,后面的都是不可启动的库。
hhjswf
2022-07-12 11:11:18 +08:00
系统模块是基础模块,不应该去依赖上级模块呀
ChenGangS
2022-07-12 11:31:41 +08:00
@hhjswf 是的,我一开始就是按照开源项目那样去拆,发现根本走不通,后面我按照楼上大佬的方式拆,可以了
ChenGangS
2022-07-12 11:32:25 +08:00
@alvinbone88 感谢,这个方式也不错,后期改造成微服务会更加简单,get !

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865566

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX