このウィキペディアの記事によると、依存関係逆転原則の実装は、次の 2 つの方法で実行できます。
- 高レベル コンポーネントと低レベル コンポーネントの両方が依存する別のパッケージに、低レベル コンポーネントを抽象化すること。
- 低レベル コンポーネントの抽象化を高レベル コンポーネントの同じパッケージに配置します。
次の図は、2 つのアプローチを使用した DIP 前後の依存関係を示しています。
DIP
の前: リポジトリは別の Maven モジュールに存在し、インターフェイスを持たず、サービスはリポジトリの実装に直接依存します。
アプローチ 1:リポジトリのインターフェース (抽象化) を導入します。そのインターフェースの実装は別のモジュールであり、サービスとリポジトリの実装の両方がインターフェースに直接依存しています。
アプローチ 2:このアプローチでは、インターフェイスはサービスの同じパッケージに存在します。Fowler がSeparated Interfaceパターンを説明するために使用した図も、このアプローチの例のようです。
私はApproach1に従ってきました。Spring の JavaConfig を使用したため、サービス モジュールにはインフラストラクチャ インターフェイスと実装モジュールの両方への maven 依存関係が必要でした。私のファイルを除けば、@Configuration
インフラストラクチャの具体的な実装への参照はまったくありません。
私は現在Approach2 への切り替えを検討していますが、コード内でインターフェイス実装モジュールへの直接参照が発生し、循環依存関係が発生するため、明らかに JavaConfig では機能しません。maven などのビルドツールでは処理できません。 .
問題は、Spring と Maven を構成してApproach2を実現する方法です。Maven 依存関係として追加されていないコンポーネントをスキャンするように春に依頼する方法はありますか? Maven の使用方法を変更する必要がありますか?