前提纪要
- 公司目前是gradle多模块开发 没有用到传统互联网公司的分布式 springCloud、dubbo等
- 差不多是20个jar包 一个底座war 依赖所有jar包
- 有公共模块framework、core等
问题出现
- 前面说过是多模块开发 其中有两个模块比较特殊
- 一个是 定时调度暂且称为T、一个是数据抽取Etl 暂且称为E
- 目前的业务要求是T需要调用E中的运行方法、E需要获取T中的定时运行状态以及记录
- 按照分布式的解决方法很简单就利用Rpc相互调用方法就行了 也不存在直接依赖关系
如图
解决思路
- 在gradle中 依赖关系是配置在 build.gradle 中的 如果相互依赖 在打包过程中会报错 也就是所谓的循环依赖
- 查询了很多方案 大部分人的解决方法是将冲突的业务拆出来单独依赖 但是并不能解决复杂的问题
- 所以我们取巧一下
首先解决编译问题
对于Java以及Spring而言 编译只要有类型即可 不需要有具体对象 也就是多态中常说的编译看左边 运行看右边
所以 我们新起一个公共模块common 里面定义类型 (Interface) 这时候就解决了编译的问题 所有需要调用其他模块的
方法都写在这里 这样就不会有循环依赖下面解决运行问题
光有类型是不够的 还需要有具体业务逻辑 以及运行的方法体 所以我们在各自模块 创建实现类impl 这样打包之后
所有的 class 都在底座war中 Spring可以为我们找到 并没有依赖关系的实现类并自动注入
如图
这样即使以后再出现依赖冲突 也不用再次拆包 只需要写在common中就可以啦