2016-05-18 18 views
0

私は約50のコンポーネントを含むSpringプロジェクトを持っています。残念ながら、クラスの1つがMavenで循環依存性の問題を引き起こしました。その話があります:SpringプロジェクトのMaven循環依存関係の問題

私は新しいコンポーネントをSpringプロジェクトに追加しました。今のところAppleとしましょう。それはAppleWatchと呼ばれる@Beanを持っています。実装の1つは、Appleが別のコンポーネントに(依存元)に住んでいたということであった:AppleWatchはビーンのメソッドを呼び出すことができるように、FoxconnCheapLaborと呼ばれます。 Corning:その間で

は、CheapLaborは別のコンポーネントに依存していました。残業をするにはGorillaGlassが必要でした。瞬間Corningが、それはAppleの市場ニーズに応じてガラスの同様の量を作ることによってお金を節約したいことを実現するまで

物事はかなり良好でした。したがって、メソッドを呼び出すことを試みますgetCurrentMarketOrders()AppleWatchそうするために、私はクラスGorillaGlass.javaに豆AppleWatchをautowiredしました。次に...

ブーム!循環依存性エラー!

だから、私はAppleおよび/またはCorningのために何をすべきか上の任意の提案?

+0

通常のアドバイスは、実装ではなくインターフェイスに依存することです - 私はそれがここで助けになると思います。また、あなたの依存関係の方向性について考えてみてください。例えば、私はガラスの結晶に応じて時計を見ることができますが、それ以外の方法はありません。あなたのGorillaGlassクラスはAppleWatchに依存しているように思えます。私は頭を悩ませますが、おそらく私はこの問題を誤解しています。 – unigeek

+0

これはビルド時間エラーかランタイム(ユニットテストを含む)エラーですか? –

+0

@unigeek私は同意します。プロジェクトの構造を再設計することは、問題を解決します。しかし、私の上司/同僚を夢中にさせることなく構造を変えることができなかったことが判明しました。サイクリック依存関係の問題を解決するには、多くのアプローチがあります。 「コーニング」が「アップル」に依存しているという論理を「アップル」に移す代わりに、「アップル」から必要な情報を入手するのではなく、「コリング」が「フォックスコン」の情報を取得するようになったこれはAppleのメソッドを呼び出します。サークルを「Apple」 - >「Foxconn-> Corning」に分割する。最高の動きではなく、機能しました。 –

答えて

0

@unigeekに記載されているように、この場合、インターフェイスはあなたの友人です。そして、あなたのmavenプロジェクトを構築するというコンテキストでは、インターフェースを別々のAPI mavenモジュールに分けることを意味します。

まもなくAppleだけでなく、GorrilaGlass~Samsungを提供することもわかります。だからgetCurrentMarketOrders()AppleWatchだけでなく、Gear2に電話する必要があります。この解決策は、MarketableインターフェイスのAPIモジュールを導入することで、AppleSamsungの両方が使用され、AppleWatchGear2の両方がMarketableを実装できるようになります。 Corningは、この新しいAPIモジュールに依存し、AppleまたはSamsungのいずれかに直接依存することなく、後者はどちらもこのインターフェイスに独自の実装を提供します。

関連する問題