根据这篇维基百科文章:实现依赖倒置原则可以通过两种方式完成:
- 在单独的包中对低级组件进行抽象,高级和低级组件都依赖于该包。
- 使低级组件的抽象驻留在高级组件的同一个包中。
下图描述了使用两种方法进行 DIP 之前和之后的依赖关系:
DIP 之前: repository 驻留在单独的 maven 模块中,没有接口,服务直接依赖 Repository 实现。
方法一:引入存储库的接口(抽象)。该接口的实现是另一个模块,服务和存储库实现都直接依赖于该接口。
方法 2:在这种方法中,接口驻留在服务的同一个包中。Fowler 用来描述分离接口模式的图表似乎也是这种方法的一个例子。
我一直在关注Approach1,因为我使用了 spring 的 JavaConfig,所以服务模块必须对基础设施接口和实现模块都有 maven 依赖。除了我的@Configuration
文件,绝对没有提到任何基础设施的具体实现。
我目前正在考虑切换到Approach2,但显然它不适用于 JavaConfig,因为我最终会在代码中直接引用接口实现模块,从而导致循环依赖,这是 maven 等构建工具无法处理的.
问题是如何配置spring和maven来实现Approach2?有没有办法让 spring扫描未添加为 maven 依赖项的组件?这需要改变我使用 Maven 的方式吗?