Frühjahr @Repository-best practices
Kontext: Web-Anwendung
Habe ich nicht verwendet, Frühling bevor, aber nach dem Frühjahr docs, alle Bohnen sind singleton
, es sei denn, wir erklären Ihnen wie prototype
.
- Ohne mit Feder:
Normalerweise instanziieren ich neue DAO, wenn es ist ein Aufruf an die business - /service-Ebene.
Wenn es einen Erholsamen service, instanziiere ich fast alle Objekte, die verlassen sich auf den Anruf.
- Mit Feder:
Kann ich kommentieren data access Klassen mit @Repository
und auch ich verwenden kann @Service
für service-layer-Klassen.
Also meine Klassen mit oben genannten Anmerkungen sind singleton
standardmäßig.
Es ist ein @Scope
Anmerkung, dass wir erklären können, Sie als Prototyp zu aber niemand scheint dies zu tun.
- Ohne Feder :
new Object();
jedes mal - Mit Feder:
singleton
Meine Fragen sind,
- Die Art, wie ich verwendet, bevor (neue Instanz erstellen jedes mal) ist falsch ?
- Wenn
@Repository
istsingleton
- wie geht es behandeln thread-Sicherheit, wenn es gibt keine solche Sache angesprochen? (Angenommen, dies geschieht durch eine Feder proxies) - Was ist die beste Praxis,
@Repository
genug ist, oder das hinzufügen@Scope('prototype')
besser wäre ? - Ich sehe nicht ein, jemanden
@Scope('prototype')
mit@Repository
(nach den tutorials, blogs, etc). Ist es ein bekannter Grund? - Was ist, wenn meine DAO-Klasse für den Zugriff durch mehrere große Anzahl der threads, die mit sehr hoher Frequenz? (Das ist die, die ich betreffen die meisten)
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig - in Frühjahr Welt die meisten der Bohnen sind singletons.
Es ist nicht falsch da es funktioniert. Das problem ist, dass Sie instanziiert eine neue Instanz von DAO auf jede Anforderung - in einigen Fällen kann es teuer sein, und trotzdem macht es keinen Sinn - warum würden Sie brauchen eine Reihe von DAO-Instanzen?
Die Feder auf der anderen Seite schafft nicht nur eine singleton-aber auch injiziert DAO Dienste oder andere DAO e.t.c. also nicht viel Arbeit für Sie
Beim schreiben eines @Repository-bean, die Sie normalerweise injizieren es eine DataSource oder eine EntityManager. DataSource.getConnection () - Methode sollte thread-sicher. Mit Bezug auf EntityManager, Frühjahr wird Spritzen ein proxy, welcher sich anders Verhalten, für andere threads, z.B. in anderen threads nicht teilen die gleichen JPA-Sitzung.
Die besten Praxis (oder eher die meisten weit verbreiteten Ansatz) ist nur die Verwendung von @ - Repository
Der Grund ist, dass es keinen profit erstellen mehrerer Instanzen von @Repository-Bohnen
Wieder hier singleton ist besser als ein neues Objekt erstellen für jede Anforderung. Nur vermeiden Sie überflüssige Synchronisierung, so dass Sie Ihre threads nicht sperren auf einige monitor
Nein, aber es ist viel schwieriger, unit-Tests, die ist, was dependency injection ist. Durch die Injektion eines DAO-in-service können Sie einfach unit-testen Sie den service durch die Injektion eines mock-DAO während der Prüfung. Das ist nicht möglich, wenn der Dienst erstellt seine eigene DAO.
Repository ist in der Regel vollständig zustandslos, außer für eine thread-sichere entity-manager, session-factory oder JDBC-template initialisiert beim Start, so genannt zu werden, gleichzeitig ist kein problem: es ist thread-safe.
Gibt es keinen Grund für ein repository zu werden, ein Prototyp. Die Injektion eines Prototyps DAO in ein singleton-service wird noch dazu führen, dass jede Prototyps werden gleichzeitig aufgerufen sowieso.
Gibt es keinen Grund, es zu tun.
Kein problem: es sollte thread-sicher, wenn richtig codiert.
Komponenten annotiert mit @Repository werden sollte, singleton, weil es nie mehrere/verschiedene Mitgliedstaaten während der gesamten Lebensdauer. Ja, der einzige Zustand, den es halten kann, ist das connection-Objekt , die nur einmal während der Erstellung des Objekts. Und Er enthält die Logik/Methode(N) zu sprechen, um die Daten zu speichern und jede Methode nehmen/Rückgabe der Daten-Objekte benötigt. So ist es nicht erforderlich, um mehrere Instanzen der repository.
Frühjahr nicht handhaben concurrency-Probleme für Sie. Es nicht gemeint. Alle es tut, ist, dass Sie die Kontrolle der Anzahl der erstellen von Instanzen, so könnte Ihre Anwendung Arbeit propertly.
Singleton-scope (so offensichtlich) wird nur eine Instanz des gegebenen bean und übergeben es an allen abhängigen Objekten.
Prototyp-Umfang für jedes abhängige Objekt seine eigene Instanz, nicht zwischen anderen Gegenständen.
Für die DAO-Objekte ist es sehr unwahrscheinlich, dass Sie mehrere Instanzen für die Kommunikation mit der Datenbank. So singleton verwendet wird, meist immer.