Ich mache eine Bewerbung, in die ich Wicket + Spring integrieren möchte. Anwendung ist ein Lebensmittelgeschäft, auf dem Benutzer kommt und etwas kauft. Ich weiß, dass es zwei Möglichkeiten gibt, dies zu tun.
Verwenden des Annotation Aprarach. Wicket-Spring-Integration zeigt verschiedene Möglichkeiten, Spring Beans in Wicket-Seiten zu injizieren.
%Vor%Die @SpringBean ist natürlich gültig und wird von vielen als Best Practice angesehen. Aber es gibt auch einen anderen Ansatz, bei dem Ihre Wicket-Anwendung die Dienste hat, die Sie benötigen.
%Vor%Rufen Sie jetzt in Ihrer Komponente
aufYourWicketApp.get (). getServiceA ();
Ich möchte wissen, was der beste Weg ist, um Feder mit Wicket zu integrieren und was die Nachteile in jedem Fall sind.
Soweit ich mich erinnere, werden Wicket-Seiten und -Komponenten nicht vom Spring-Container verwaltet, sodass Sie keine @Transactional-Annotation verwenden können (was ohnehin eine schlechte Idee ist - Transaktionen gehören zu tieferen Ebenen). Ist diese Aussage gültig?
Es gibt bestimmte Vor- und Nachteile für die verschiedenen Optionen. Die verschiedenen Optionen sind hier erklärt. Persönlich bevorzuge ich den Annotations-basierten Ansatz, da er das korrekte Trennen der annotierten Felder garantiert und die Abhängigkeit der Komponenten vom Anwendungsobjekt verringert.
@SpringBean
Die @SpringBean
Annotation ist nett. Es ist gewährleistet, dass die damit gekennzeichneten Felder nicht mit den Komponenten serialisiert werden. Das heißt, das Wicket-Framework "verwaltet" die Beans, indem es die Felder in jedem Abtrennzyklus annulliert, so dass Sie sich nicht darum kümmern müssen.
Die mit @SpringBean
markierten Felder sind leicht testbar, da Sie sie immer durch Mocks ersetzen können. Wicket hat sogar eine Klasse ApplicationContextMock
, aus der die Bohnen injiziert werden, wenn sie WicketTester verwenden:
MyComponent.java
%Vor%In MyComponentTest.java
%Vor%YourWicketApp.get().getServiceA()
Dies ist ein ziemlich leichter Ansatz, da Sie Spring nicht an Ihre Webanwendung binden müssen. Wenn Sie keine groß angelegte Anwendung erstellen, könnte dies eine praktikable Alternative sein.
Der Hauptnachteil dieses Ansatzes ist die schlechte Testbarkeit. Da Sie statisch auf die Anwendung zugreifen, können Sie die Anwendung in Tests nicht einfach ersetzen. Natürlich können Sie eine Anwendung YourWicketAppForTests
schreiben, die YourWicketApp
erweitert, aber Sie sind immer auf diese Anwendung beschränkt. Dadurch erstellen Sie eine Abhängigkeit von jeder Ihrer dienstabhängigen Komponenten für die Anwendungsklasse. Außerdem würden Sie für jede Ihrer Serviceklassen eine Methode benötigen, die zu dem Durcheinander Ihrer Anwendungsklasse beitragen würde (die in der Regel nicht zu kurz ist).
Die Transaktionen gehören definitiv nicht zu den Wicket-Seiten und sollten in der Service-Schicht behandelt werden. Da Wicket und nicht Spring die Injektion von Beans und die Instanziierung von Komponenten verarbeiten, funktionieren die @Transactional
Annotationen sowieso nicht, wenn ich richtig liege.