2016-05-18 15 views
0

Ich habe ein Spring-Projekt, das ~ 50 Komponenten enthält. Leider verursachte eine der Klassen ein Problem der zyklischen Abhängigkeit in Maven. Hier ist die Geschichte:Maven zyklische Abhängigkeitsproblem für Spring-Projekt

Ich habe eine neue Komponente zu meinem Spring-Projekt hinzugefügt. Nennen wir es Apple für jetzt. Es hat eine @Bean namens AppleWatch. Einer der Implementierungen war, dass Apple lebte (abhing) auf eine andere Komponente: Foxconn, so dass AppleWatch ein Verfahren in einem Bean CheapLabor genannt nennen könnte.

Bei der Zwischenzeit CheapLabor auf einer anderen Komponente abhängig: Corning. Es brauchte GorillaGlass um Überstunden leisten zu können.

Dinge waren ziemlich gut bis zu dem Moment Corning erkennt, dass es, indem die ähnliche Menge an Gläsern nach dem Apples Markt Notwendigkeit, Geld sparen will. So versucht es, eine Methode getCurrentMarketOrders() in AppleWatch aufzurufen. Um dies zu tun, habe ich die Bohne AppleWatch in die Klasse GorillaGlass.java autowired. Dann ...

Boom! Zyklischer Abhängigkeitsfehler!

Also, jeder Vorschlag auf, was soll ich tun, für Apple und/oder Corning?

+0

Der übliche Rat wäre, sich auf Schnittstellen anstatt auf Implementierungen zu verlassen - ich vermute, das würde hier helfen. Denken Sie auch über die Richtung Ihrer Abhängigkeiten nach ... zum Beispiel kann ich eine Uhr sehen, die von einem Glaskristall abhängt, aber nicht umgekehrt. Es hört sich an, als ob deine GorillaGlass-Klasse irgendwie von AppleWatch abhängig ist - macht mich am Kopf kratzen, aber vielleicht verstehe ich das Problem einfach falsch. – unigeek

+0

Ist das ein Build-Time-Fehler oder ein Laufzeitfehler (einschließlich Komponententests)? –

+0

@unigeek Ich stimme zu. Die Struktur des Projekts entsprechend neu zu gestalten, löst das Problem sicher.Aber es stellte sich heraus, dass ich die Struktur nicht ändern konnte, ohne meinen Chef/meine Kollegen verrückt zu machen. Es gibt viele Ansätze, um zyklische Abhängigkeitsprobleme zu lösen. Ich habe es mir doch ausgedacht: Die Logik von "Corning" zu ändern, hängt davon ab, dass "Apple" Teil von "Apple" ist: Statt benötigte Informationen von "Apple" zu bekommen, bekommt "Coring" nun diese Informationen von "Foxconn" , die die Methode von 'Apple' aufruft. Es bricht den Kreis zu 'Apple' ->' Foxconn' -> 'Corning'. Nicht der beste Zug, aber es hat funktioniert. –

Antwort

0

Wie von @unigeek erwähnt, sind Schnittstellen in diesem Fall Ihre Freunde. Und im Kontext der Strukturierung Ihres Maven-Projekts bedeutet dies die Trennung von Schnittstellen in separate API-Maven-Module.

Bald Corning wird realisiert es liefert auch GorrilaGlass zu Samsung, nicht nur Apple. So jetzt muss es getCurrentMarketOrders() nicht nur auf AppleWatch, sondern auch Gear2 anrufen. Die Lösung wird an dieser Stelle klarer: Einführung eines API-Moduls mit der Schnittstelle Marketable, das sowohl Apple als auch Samsung betrifft, so dass sowohl AppleWatch als auch Gear2 implementiert werden können Marketable. Dann hängt Corning einfach von diesem neuen API-Modul ab, ohne direkte Abhängigkeiten entweder von Apple oder Samsung zu haben, während die letzteren beide ihre eigenen Implementierungen für diese Schnittstelle bereitstellen.