Spring MVC, Aufruf von einem anderen controller aus einem controller
Arbeite ich an einer bestehenden code, der mit einem controller zum aufrufen einer Methode auf dem 2. controller. Es gibt 2 Implementierungen die ich bisher gesehen habe.
1. Umsetzung
return new Controller().method(request, response);
2. Umsetzung
@Autowired
private Controller controller.
return this.controller.method(request, response);
Welche ist die richtige Umsetzung, was sind die Probleme, wenn jeder mit einer von Ihnen.
- Was ist der Vorteil von dieser? Dabei bricht eine Menge von übereinkommen, und Sie sollten erwägen, überarbeitung, d.h. das Aufbrechen der controller-code und vielleicht bewegt einige von der Logik in die business-Schicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die bloße Tatsache, dass Sie eine Methode aufrufen müssen, von einem anderen controller zeigt einen wahrscheinlichen Konstruktionsfehler.
Mit option 1, Sie verlieren alles, was der Spring DI container, die Sie gebracht: nämlich, dass andere controller kann instanziiert werden, indem Frühjahr mit einigen anderen Abhängigkeiten über es. Wenn Sie instanziieren, selbst wenn es funktioniert, in diesem moment, da Sie wahrscheinlich kein @Autowired /@Value Abhängigkeiten, es wird brechen, sobald Sie ' ll fügen Sie Abhängigkeiten zu anderen Ressourcen(s). Außer, Sie haben bereits eine Instanz der container für Sie gebaut, warum schaffen andere ?
Wenn Sie einen Anruf zwischen Controllern entweder es ist ein Fehler, oder will man einen Nachsendeauftrag stellen, das ist völlig gültig.
Wenn die Umlenkung ist der Fall nur return in einer controller-Methode wie folgt:
Klingt wie Sie benötigen, um die Umgestaltung des Codes. Extrahieren, was gemeinsam zwischen den beiden Steuerungen in einer separaten Klasse, dann rufen Sie das entweder mit controller.
Du tust, völlig falsch. Sehen
Costi Ciudatu's
Antwort für das, was falsch ist.Lösung: ich Ratschläge, die Sie haben
service layer and dao layer classes
im Zusammenhang mit Ihrercontrollers
.Angenommen, Sie haben
AccountController
haben SieAccountService
Klasse(interface + Implementierung) undAccountDao
(interface + Implementierung).Nun, wenn Benutzer sich anmeldet (
LoginController
) und Sie benötigen Konto, so dass Sie autowireAccountService
imLoginController
erhalten Sie Benutzer-account details ausAccountService
Methoden.Die ersten Bedürfnisse mehr Arbeit, Erstens tun Sie wirklich wollen, erstellen Sie eine neue Instanz der Controller-Klasse everytime?
Die zweite verwendet ein Muster, bekannt als dependency injection oder inversion of control, die ist schöner. Lassen Sie den Frühling verwalten Geltungsbereich die Bohne für Sie, normalerweise wird nur 1 Instanz der Controller-Klasse allerdings, wenn irgendwann (aus irgendeinem Grund) Sie nicht möchten, dass dieses Verhalten seine einfach zu viele Instanzen...
Das zweite ist richtig, weil Sie nicht machen eine Instanz zu jeder Zeit. Die @Autowired-annotation injiziert das Objekt in Ihrem code, wenn nötig.
Überprüfen Sie diese
http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html
Aber es ist eine @Controller-annotation und verwendet werden sollten, die für die Datenverarbeitung Verantwortlichen und @ - Service für Bohnen, die Sie wollen, um autowire.