Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Maven和Spring实现依赖倒置原理_Spring_Maven_Dependency Injection_Solid Principles_Dependency Inversion - Fatal编程技术网

用Maven和Spring实现依赖倒置原理

用Maven和Spring实现依赖倒置原理,spring,maven,dependency-injection,solid-principles,dependency-inversion,Spring,Maven,Dependency Injection,Solid Principles,Dependency Inversion,根据这篇维基百科文章:可以通过两种方式完成: 在一个单独的包中抽象出一个低级组件,高级和低级组件都依赖于这个包 让底层组件的抽象驻留在高层组件的同一个包中 下图使用两种方法描述了DIP前后的相关性: 浸水前: 存储库驻留在单独的maven模块中,没有接口,服务直接依赖于存储库实现。 方法1:引入了存储库的接口(抽象)。该接口的实现是另一个模块,服务和存储库实现都直接依赖于该接口。 方法2:在这种方法中,接口驻留在服务的同一个包中。Fowler用来描述模式的方法似乎也是这种方法的一个例子。

根据这篇维基百科文章:可以通过两种方式完成:

  • 在一个单独的包中抽象出一个低级组件,高级和低级组件都依赖于这个包
  • 让底层组件的抽象驻留在高层组件的同一个包中
下图使用两种方法描述了DIP前后的相关性:

浸水前: 存储库驻留在单独的maven模块中,没有接口,服务直接依赖于存储库实现。

方法1:引入了存储库的接口(抽象)。该接口的实现是另一个模块,服务和存储库实现都直接依赖于该接口。

方法2:在这种方法中,接口驻留在服务的同一个包中。Fowler用来描述模式的方法似乎也是这种方法的一个例子。

我一直在遵循方法1,因为我使用了spring的JavaConfig,所以服务模块必须对基础架构接口和实现模块都具有maven依赖性。除了我的
@Configuration
文件之外,绝对没有提到任何基础设施的具体实现

我目前正在考虑切换到方法2,但显然它不适用于JavaConfig,因为我最终会在代码中直接引用接口实现模块,从而导致循环依赖,这是maven等构建工具无法处理的


问题是如何配置spring和maven以实现方法2?有没有办法让spring扫描未作为maven依赖项添加的组件?这需要改变我使用maven的方式吗?

它不会与JavaConfig一起工作,因为我最终会在代码中直接引用接口实现模块,从而产生循环依赖关系:仅当JavaConfig位于“服务”模块中时,该模块应该包含服务和存储库接口。但是为什么它会在那里,而不是在包含具体实现类的模块中,或者在依赖于这两者的外部模块中?@JBNizet JavaConfig还会在哪里?即使我将其移动到“Infrastructure Impl”模块,我也需要在我的服务模块中导入该配置,这将导致相同的循环依赖关系;它使用SPI发现。我不明白为什么您需要在服务模块中“导入配置”。它不应该只包含服务和存储库接口吗?这应该完全独立于Spring。@JBNizet我在JavaConfig中引用实现的原因是,尽管如我前面所述,我在代码中的任何地方都没有使用基础结构实现,Spring在运行单元测试时也没有注入它们(而是注入双倍),但是,我希望我的集成服务器使用基础架构实现运行这些测试。有意义吗?它不会与JavaConfig一起工作,因为我最终会在代码中直接引用接口实现模块,从而导致循环依赖关系:仅当JavaConfig位于“服务”模块中时,该模块应该包含服务和存储库接口。但是为什么它会在那里,而不是在包含具体实现类的模块中,或者在依赖于这两者的外部模块中?@JBNizet JavaConfig还会在哪里?即使我将其移动到“Infrastructure Impl”模块,我也需要在我的服务模块中导入该配置,这将导致相同的循环依赖关系;它使用SPI发现。我不明白为什么您需要在服务模块中“导入配置”。它不应该只包含服务和存储库接口吗?这应该完全独立于Spring。@JBNizet我在JavaConfig中引用实现的原因是,尽管如我前面所述,我在代码中的任何地方都没有使用基础结构实现,Spring在运行单元测试时也没有注入它们(而是注入双倍),但是,我希望我的集成服务器使用基础架构实现运行这些测试。有道理吗?