So binden Sie eine bean-Eigenschaft an ein anderes und das beobachten von änderungen in das Spring-Framework
Ich wundere mich, dass wenn es einen Weg gibt, der für die Bindung eine spring bean-Eigenschaft auf eine andere bean-Eigenschaft so, wenn jede änderung an der gebundenen Eigenschaft tritt in der Laufzeit, was ich erwarte, ist referenzierenden bean-Eigenschaft ändert sich auch. Ich werde erklären, mehr mit einem kleinen code-snippet.
<bean id="johnHome" class="Beispiel.Kontakt"> <property name="Telefon" value="5551333" /> </Bohne> <bean id="johnWork" class="Beispiel.Kontakt"> <property name="Telefon"> <util:property-Pfad Pfad="johnHome.Telefon" /> </property> </Bohne>
OK. Dies funktioniert bei der ersten bean-Verkabelung, aber was ich genau will, ist eine Eigenschaft binden, damit, wenn die Eigenschaft zur Laufzeit ändert der referenzierenden bean ändert sich auch. Wenn ich möchte, um zu zeigen, mit einer Metapher, wird es scheinen, wie diese.
<bean id="johnHome" class="Beispiel.Kontakt"> <property name="Telefon" value="5551333" /> </Bohne> <bean id="johnWork" class="Beispiel.Kontakt"> <property name="Telefon"> <util:bind path="johnHome.Telefon" /> </property> </Bohne>
Bin ich eine überlastung der Feder das Konzept zu viel oder ist dies möglich, ohne eine Menge tricks?
Dank..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfachste Art und Weise zu machen, dass die Eigenschaft einer bean, auf den verwiesen wird, die von den beiden anderen Bohnen, z.B. für einen String-Wert ein StringHolder Klasse:
Die ganze Idee hinter der Feder ist (war?) halten Sie ein sauberes Objekt-orientiertes design, bestehend aus plain old java objects und verwenden Sie das spring-framework zu handhaben, die mühsam Objekt erstellen. Für AOP, sollte dies nur mit cross-cutting-concerns. Ich bin überhaupt nicht davon überzeugt, dass dies ist einer der Fälle, wo der AOP ist eine gute Idee. Ihre Anwendung stützt sich auf das Verhalten von diesen Telefon Nummern immer synchronisiert zu einander, es ist eine der wichtigsten Funktionalitäten. Als solche, Ihr design sollte dies widerspiegeln.
Wohl der logischste Weg, um dieses problem ist, um Telefonnummern Ihrer eigenen Klasse (was ist auch praktisch, wenn Sie jemals wollen, unterscheiden verschiedene Typen von Telefonnummern).
Wenn Sie eine Telefonnummer ein Objekt, das die Zahl als argument im Konstruktor die Zuordnung banal:
Natürlich, ob Sie würde anzeigen, wie diese in eine statische Datei, ist eine andere Sache, aber die Sache ist in dieser situation ziemlich klar, nur brauchen eine Referenz/pointer.
Ich glaube nicht, was Sie tun, ist möglich im Frühjahr 2.5. Es kann möglich sein, im Spring 3, mit den neuen expression-syntax, aber ich glaube nicht.
Selbst wenn es so wäre, wäre es verwirrend, denke ich. Besser zu halten Ihren gemeinsamen Wert in der eigenen Klasse und injizieren eine Instanz dieser Klasse in die andere die Bohnen, die Notwendigkeit, es zu teilen.
Kann ich von zwei Möglichkeiten zu denken.
Ist (es ist so eine Art hack), wenn Sie nicht haben, sehr viele Bohnen, die müssen verbunden werden, wie die in Ihrem Beispiel könnten Sie injizieren johnWork in die johnHome bean, und in johnHome.setPhone Sie aktualisieren könnte die johnWork Telefon-Eigenschaft, so etwas wie:
Oder könnten Sie Homekontakt und WorkContact beide eine Klasse erweitern, Kontakt-und tun Sie das gleiche Injektion, dass.
Wenn Sie Tonnen und Tonnen von Bohnen, müssen diese (wie wenn Ihre Anwendung tatsächlich IST der Umgang mit Kontakt-Informationen), mit AOP (Sie müssen AspectJ für das Beispiel) ich denke, Sie könnte so etwas tun (es wird ein bit-Speicher-intensiv, wenn Sie get eine Tonne von Objekten, aber Sie können sehen, wie etwas wie es funktionieren würde):
Warnung: dies ist tatsächlich erschwert wurde schnell, aber ich bin mir ziemlich sicher, dass es funktionieren würde, nachdem Sie gearbeitet haben, ein paar Knicke
Wieder, es gibt wohl 100 Möglichkeiten könnte man optimieren, da bin ich indem Sie es aus der Spitze von meinem Kopf; das ist, wenn Sie wollte diesen Weg gehen, in den ersten Platz. In der Theorie sollte es funktionieren, aber ich habe es noch nicht getestet auf alle.
Sowieso, Glücklich Sprang!