Can @Component
, @Repository
und @Service
Anmerkungen austauschbar im Frühjahr verwendet werden oder bieten sie eine bestimmte Funktionalität neben als Notation Gerät handeln?
Mit anderen Worten, wenn ich eine Service-Klasse habe und die Anmerkung von @Service
in ändere @Component
, verhält sie sich dann immer noch genauso?
Oder beeinflusst die Annotation auch das Verhalten und die Funktionalität der Klasse?
java
spring
spring-mvc
annotations
Colin McCree
quelle
quelle
Antworten:
Aus der Frühlingsdokumentation :
quelle
@Service
ist, ist auch a@Component
(weil die@Service
Annotation selbst mit annotiert ist@Component
). Soweit ich weiß, nutzt nichts im Spring-Framework explizit die Tatsache, dass etwas ein ist@Service
, so dass der Unterschied wirklich nur konzeptionell ist.Da in vielen Antworten bereits angegeben ist, wofür diese Anmerkungen verwendet werden, konzentrieren wir uns hier auf einige geringfügige Unterschiede zwischen ihnen.
Unterschiede zwischen @Component, @Repository, @Controller und @Service
Dies ist eine allgemeine Stereotypanmerkung, die angibt, dass die Klasse eine Federkomponente ist.
Das Besondere an @Component ist, dass
<context:component-scan>
nur gescannt@Component
und nicht gesucht wird@Controller
,@Service
und@Repository
im Allgemeinen. Sie werden gescannt, weil sie selbst mit Anmerkungen versehen sind@Component
.Werfen Sie einen Blick auf
@Controller
,@Service
und@Repository
Annotation Definitionen:Daher ist es nicht falsch, das zu sagen
@Controller
,@Service
und@Repository
es handelt sich um spezielle Arten von@Component
Anmerkungen.<context:component-scan>
nimmt sie auf und registriert ihre folgenden Klassen als Bohnen, als ob sie mit Anmerkungen versehen wären@Component
.Spezielle Typanmerkungen werden ebenfalls gescannt, da sie selbst mit
@Component
Anmerkungen versehen sind, was bedeutet, dass sie auch@Component
s sind. Wenn wir unsere eigene benutzerdefinierte Anmerkung definieren und sie mit Anmerkungen versehen@Component
, wird sie auch mit gescannt<context:component-scan>
Dies soll anzeigen, dass die Klasse ein Datenrepository definiert.
Was ist das Besondere an @Repository?
Neben dem Hinweis, dass es sich um eine auf Anmerkungen basierende Konfiguration handelt , besteht
@Repository
die Aufgabe darin, plattformspezifische Ausnahmen abzufangen und sie als eine der einheitlichen, nicht aktivierten Ausnahmen von Spring erneut auszulösen. Dafür erhalten wir FolgendesPersistenceExceptionTranslationPostProcessor
, das wir im Anwendungskontext unseres Spring wie folgt hinzufügen müssen:Dieser Bean-Postprozessor fügt jedem Bean, mit dem Anmerkungen versehen sind, einen Advisor hinzu,
@Repository
sodass plattformspezifische Ausnahmen abgefangen und dann als eine der ungeprüften Datenzugriffsausnahmen von Spring erneut ausgelöst werden.Die
@Controller
Anmerkung gibt an, dass eine bestimmte Klasse die Rolle eines Controllers übernimmt. Die@Controller
Annotation fungiert als Stereotyp für die annotierte Klasse und gibt ihre Rolle an.Was ist das Besondere an @Controller?
Wir können diese Anmerkung nicht durch eine andere wie
@Service
oder@Repository
ersetzen, obwohl sie gleich aussieht. Der Dispatcher durchsucht die@Controller
mit@RequestMapping
Anmerkungen versehenen Klassen und erkennt Methoden, die mit Anmerkungen versehen sind. Wir können verwenden@RequestMapping
nur auf / in jenen Methoden , deren Klassen mit annotiert ,@Controller
und es wird nicht funktionieren mit@Component
,@Service
,@Repository
etc ...Hinweis: Wenn eine Klasse bereits als Bohne durch jede andere Methode registriert ist, wie durch
@Bean
oder durch@Component
,@Service
usw ... Anmerkungen, dann@RequestMapping
können ausgewählt werden , wenn die Klasse auch mit Anmerkungen versehen ist@RequestMapping
Anmerkung. Aber das ist ein anderes Szenario.@Service
Beans enthalten die Geschäftslogik und die Aufrufmethoden in der Repository-Schicht.Was ist das Besondere an @Service?
Abgesehen von der Tatsache, dass es verwendet wird, um anzuzeigen, dass es die Geschäftslogik enthält, ist in dieser Anmerkung nichts anderes erkennbar. Aber wer weiß, der Frühling könnte in Zukunft einige zusätzliche Ausnahmen hinzufügen.
Ähnlich wie oben, in der Zukunft hinzufügen Frühling können spezielle Funktionalitäten für
@Service
,@Controller
und@Repository
auf der Grundlage ihrer Schichtung Konventionen. Daher ist es immer eine gute Idee, die Konvention zu respektieren und sie in Übereinstimmung mit Ebenen zu verwenden.quelle
@Controller
Anmerkungen. Es ist nicht erforderlich, wenn die Klasse mit Anmerkungen versehen ist@RequestMapping
und die Bean dieser Klasse in irgendeiner Weise erstellt wurde. Jede mit@Controller
OR kommentierte Bean@RequestMapping
nimmt an den Anforderungszuordnungen von Spring MVC teil. Dies kann beispielsweise nützlich sein, um Controller programmgesteuert zu erstellen (z. B. mithilfe von@Bean
Methoden) und gleichzeitig zu verhindern, dass Spring versucht, sie durch Paketscan zu erstellen (wenn das Paket nicht vom Scannen ausgeschlossen werden kann).Sie sind fast gleich - alle bedeuten, dass die Klasse eine Frühlingsbohne ist.
@Service
,@Repository
Und@Controller
sind spezialisiert@Component
s. Sie können bestimmte Aktionen mit ihnen ausführen. Zum Beispiel:@Controller
Bohnen werden von spring-mvc verwendet@Repository
Beans können für die Übersetzung von Persistenzausnahmen verwendet werdenEine andere Sache ist, dass Sie die Komponenten semantisch verschiedenen Ebenen zuordnen.
Eine Sache, die
@Component
bietet, ist, dass Sie andere Anmerkungen damit kommentieren und sie dann auf die gleiche Weise wie verwenden können@Service
.Zum Beispiel habe ich kürzlich gemacht:
Alle mit Anmerkungen versehenen Klassen
@ScheduledJob
sind also Frühlingsbohnen und werden zusätzlich als Quarzjobs registriert. Sie müssen nur Code bereitstellen, der die spezifische Anmerkung verarbeitet.quelle
@Component entspricht
@Service, @Controller, @Repository = {@Component + einige weitere spezielle Funktionen}
Das bedeutet, dass Service, Controller und Repository funktional identisch sind.
Die drei Anmerkungen werden verwendet, um "Ebenen" in Ihrer Anwendung zu trennen.
Nun fragen Sie sich vielleicht, warum Sie sie trennen sollten: (Ich nehme an, Sie kennen die AOP-aspektorientierte Programmierung.)
Angenommen, Sie möchten nur die Aktivität der DAO-Ebene überwachen. Sie schreiben eine Aspect-Klasse (A-Klasse), die vor und nach dem Aufrufen jeder Methode Ihres DAO eine Protokollierung durchführt. Sie können dies mit AOP tun, da Sie drei verschiedene Ebenen haben und nicht gemischt sind.
Sie können also DAO "um", "vor" oder "nach" den DAO-Methoden protokollieren. Sie könnten das tun, weil Sie überhaupt einen DAO hatten. Was Sie gerade erreicht haben, ist die Trennung von Anliegen oder Aufgaben.
Stellen Sie sich vor, wenn es nur eine Annotation @Controller gäbe, dann hätte diese Komponente gemischten Versand, Geschäftslogik und Zugriff auf die Datenbank, also schmutzigen Code!
Oben erwähnt ist ein sehr häufiges Szenario. Es gibt viel mehr Anwendungsfälle, warum drei Anmerkungen verwendet werden.
quelle
@Respository
auch automatische Ausnahmeübersetzungsfunktion. Wie wenn eine Ausnahme in a auftritt,@Repository
gibt es normalerweise einen Handler für diese Ausnahme, und es ist nicht erforderlich, try catch-Blöcke in der DAO-Klasse hinzuzufügen. Es wird zusammen mit PersistenceExceptionTranslationPostProcessorIm Frühjahr
@Component
,@Service
,@Controller
, und@Repository
Stereotypie Annotationen werden , die verwendet werden für:@Controller:
Wenn Ihre Anforderungszuordnung von der Präsentationsseite aus erfolgt, dh die Präsentationsschicht nicht zu einer anderen Datei wechselt, geht sie direkt zur@Controller
Klasse und sucht in der@RequestMapping
Annotation nach dem angeforderten Pfad, der bei Bedarf vor Methodenaufrufen geschrieben wurde.@Service
: Die gesamte Geschäftslogik ist hier, dh datenbezogene Berechnungen und alle. Diese Annotation der Business-Schicht, in der unser Benutzer die Persistenzmethode nicht direkt aufruft, ruft diese Methode mit dieser Annotation auf. Es wird @Repository gemäß Benutzeranforderung anfordern@Repository
: Dies ist die Persistenzschicht (Datenzugriffsschicht) der Anwendung, mit der Daten aus der Datenbank abgerufen wurden. Das heißt, alle datenbankbezogenen Vorgänge werden vom Repository ausgeführt.@Component
- Kommentieren Sie Ihre anderen Komponenten (z. B. REST-Ressourcenklassen) mit einem Komponentenstereotyp.quelle
Referenz: - Spring Documentation - Scannen von Klassenpfaden, verwaltete Komponenten und Schreiben von Konfigurationen mit Java
quelle
Technisch gesehen
@Controller
,@Service
,@Repository
sind alle gleich. Alle von ihnen erstreckt sich@Component
.Aus dem Spring-Quellcode:
Gibt an, dass eine mit Anmerkungen versehene Klasse eine "Komponente" ist. Solche Klassen gelten als Kandidaten für die automatische Erkennung, wenn annotationsbasierte Konfiguration und Klassenpfad-Scan verwendet werden.
Wir können direkt verwendet werden
@Component
für jede einzelne Bohne, aber für ein besseres Verständnis und die Wartbarkeit einer großen Anwendung, verwenden wir@Controller
,@Service
,@Repository
.Zweck jeder Anmerkung:
@Controller
-> Mit Anmerkungen versehene Klassen sollen eine Anfrage von der Client-Seite erhalten. Die erste Anforderung kommt an das Dispatcher-Servlet, von wo aus sie die Anforderung unter Verwendung des@RequestMapping
Annotationswerts an den jeweiligen Controller weiterleitet.@Service
-> Mit Anmerkungen versehene Klassen sollen Daten manipulieren, die wir vom Client erhalten oder aus der Datenbank abrufen. Alle Manipulationen mit Daten sollten in dieser Ebene erfolgen.@Repository
-> Mit Anmerkungen versehene Klassen sollen eine Verbindung zur Datenbank herstellen. Es kann auch als DAO-Schicht (Data Access Object) betrachtet werden. Diese Ebene sollte nur auf CRUD-Operationen (Erstellen, Abrufen, Aktualisieren, Löschen) beschränkt sein. Wenn eine Manipulation erforderlich ist, sollten Daten gesendet und an die @ Service-Schicht zurückgesendet werden.Wenn wir ihren Platz austauschen (
@Repository
anstelle von verwenden@Controller
), funktioniert unsere Anwendung einwandfrei.Der Hauptzweck der Verwendung von drei verschiedenen Funktionen
@annotations
besteht darin, der Enterprise-Anwendung eine bessere Modularität zu bieten.quelle
controller and repository
Die Verwendung von
@Service
und@Repository
Anmerkungen sind aus Sicht der Datenbankverbindung wichtig.@Service
Sie diese Option für alle DB-Verbindungen Ihres Webdiensttyps@Repository
für alle Ihre gespeicherten Proc-DB-VerbindungenWenn Sie nicht die richtigen Anmerkungen verwenden, können Commit-Ausnahmen auftreten, die durch Rollback-Transaktionen überschrieben werden. Während des Stresstests werden Ausnahmen angezeigt, die sich auf das Zurücksetzen von JDBC-Transaktionen beziehen.
quelle
@Repository
ist es kein Repository und wurde speziell für die Arbeit mit der Persistenzschicht entwickelt. Wenn Sie mit Rest-API arbeiten, arbeiten Sie mit DTOs, nicht mit DAOs.@Repository @Service und @Controller dienen als Spezialisierung von @Component für eine spezifischere Verwendung. Auf dieser Basis können Sie @Service durch @Component ersetzen. In diesem Fall verlieren Sie jedoch die Spezialisierung.
quelle
Alle diese Anmerkungen sind Stereotypen, der Unterschied zwischen diesen drei Anmerkungen besteht
zum Beispiel
@Service
oder@Repositroy
oder hinzufügen, wird die@Controller
Annotation standardmäßig@Component
über der Klasse angezeigtquelle
Frühling bietet vier verschiedene Arten von Auto - Komponenten - Scan - Annotationen, sie sind
@Component
,@Service
,@Repository
und@Controller
. Technisch gibt es keinen Unterschied zwischen ihnen, aber jede Annotation zum automatischen Scannen von Komponenten sollte für einen bestimmten Zweck und innerhalb der definierten Ebene verwendet werden.@Component
: Es handelt sich um eine grundlegende Annotation zum automatischen Scannen von Komponenten. Sie gibt an, dass die mit Anmerkungen versehene Klasse eine automatische Scan-Komponente ist.@Controller
: Die mit Anmerkungen versehene Klasse gibt an, dass es sich um eine Controller-Komponente handelt, die hauptsächlich auf der Präsentationsebene verwendet wird.@Service
: Zeigt an, dass die mit Anmerkungen versehene Klasse eine Servicekomponente in der Geschäftsschicht ist.@Repository
: Sie müssen diese Annotation innerhalb der Persistenzschicht verwenden. Dies verhält sich wie ein Datenbank-Repository.Man sollte
@Component
beim Kommentieren der Klasse eine speziellere Form wählen, da diese Annotation in Zukunft ein bestimmtes Verhalten enthalten kann.quelle
Wir können dies nach Java-Standard beantworten
In Bezug auf
JSR-330
, die jetzt von Spring unterstützt wird, können Sie nur@Named
eine Bean definieren (irgendwie@Named=@Component
). So nach dieser Norm, so scheint es , dass es keinen Gebrauch von Stereotypen (wie zu definieren@Repository
,@Service
,@Controller
) zu den Kategorien Bohnen.Aber Spring User diese verschiedenen Anmerkungen in verschiedenen für die spezifische Verwendung, zum Beispiel:
aspect-oriented
, können diese ein guter Kandidat für seinpointcuts
)@Repository
Durch Annotation werden Ihrer Bean einige Funktionen hinzugefügt (einige automatische Ausnahmeübersetzungen in Ihre Bean-Persistenzschicht).@RequestMapping
kann das nur zu Klassen hinzugefügt werden, die mit Anmerkungen versehen sind@Controller
.quelle
Kommentieren Sie andere Komponenten mit @Component, z. B. REST-Ressourcenklassen.
@Component ist ein generisches Stereotyp für jede von Spring verwaltete Komponente.
@Controller, @Service und @Repository sind Spezialisierungen von @Component für bestimmte Anwendungsfälle.
@ Komponente im Frühjahr
quelle
Es gibt keinen Unterschied zwischen
@Component
,@Service
,@Controller
,@Repository
.@Component
ist die generische Annotation, die die Komponente unserer MVC darstellt. Als Teil unserer MVC-Anwendung werden jedoch mehrere Komponenten vorhanden sein, z. B. Service-Layer-Komponenten, Persistenz-Layer-Komponenten und Präsentations-Layer-Komponenten. Um sie zu unterscheiden, haben die Frühlingsleute auch die anderen drei Anmerkungen gegeben.@Repository
@Service
@Controller
@Component
für alle von ihnen verwenden.quelle
Auch wenn wir @Component oder @Repository oder @service austauschen
Es wird sich genauso verhalten, aber ein Aspekt ist, dass sie keine bestimmte Ausnahme in Bezug auf DAO anstelle von Repository abfangen können, wenn wir Komponente oder @ Service verwenden
quelle
Im Frühjahr 4, neueste Version:
quelle
@Component : Wenn Sie eine Klasse mit Anmerkungen versehen
@Component
, wird dem Ruhezustand mitgeteilt , dass es sich um eine Bean handelt.@Repository : Wenn Sie eine Klasse mit Anmerkungen versehen
@Repository
, wird im Ruhezustand angegeben, dass es sich um eine DAO-Klasse handelt, und als DAO-Klasse behandelt. Dies bedeutet, dass die nicht aktivierten Ausnahmen (die von DAO-Methoden ausgelöst werden) für die Übersetzung in Spring in Frage kommenDataAccessException
.@Service : Dies teilt dem Ruhezustand mit, dass es sich um eine Service-Klasse handelt, in der Sie
@Transactional
Anmerkungen zur Service-Schicht usw. haben. Der Ruhezustand behandelt sie daher als Service-Komponente.Plus
@Service
ist voraus von@Component
. Angenommen, der Name der Bean-Klasse lautetCustomerService
, da Sie die XML-Bean-Konfigurationsmethode nicht ausgewählt haben und die Bean mit Anmerkungen versehen haben@Component
, um sie als Bean anzugeben. Beim Abrufen des Bean-ObjektsCustomerService cust = (CustomerService)context.getBean("customerService");
wird Spring standardmäßig das erste Zeichen der Komponente in Kleinbuchstaben schreiben - von 'CustomerService' bis 'customerService'. Und Sie können diese Komponente mit dem Namen 'customerService' abrufen. Wenn Sie jedoch eine@Service
Annotation für die Bean-Klasse verwenden, können Sie einen bestimmten Bean-Namen von angebenund Sie können das Bean-Objekt von erhalten
quelle
@Component
ist die generische Annotation der obersten Ebene, mit der die kommentierte Bean gescannt und im DI-Container verfügbar gemacht wird@Repository
ist eine spezielle Annotation und bietet die Möglichkeit, alle nicht aktivierten Ausnahmen aus den DAO-Klassen zu konvertieren@Service
ist eine spezielle Anmerkung. Es bringt noch keine neue Funktion, aber es verdeutlicht die Absicht der Bohne@Controller ist eine spezielle Annotation, die die Bean-MVC sensibilisiert und die Verwendung weiterer Annotationen wie
@RequestMapping
und all dieser ermöglichtHier finden Sie weitere Details
quelle
A
@Service
um Frühlingsdokumentation zu zitieren,Wenn Sie sich das domänengetriebene Design von Eric Evans ansehen,
und ein
Repository
nach Eric Evans,quelle
Hier finden Sie ausreichend gute Antworten, um den Unterschied zwischen den Komponenten-Repository-Service-Anmerkungen zu erläutern. Ich möchte den Unterschied zwischen teilen
@Controller & @RestController
@Controller
vs.RestController
@RestController
::@Controller
die automatisch hinzugefügt@Controller
und@ResponseBody
kommentiert wird. Daher müssen wir@ResponseBody
unsere Mapping-Methoden nicht ergänzen . Das heißt,@ResponseBody
ist standardmäßig aktiv.@RestController
, können Sie keine Ansicht zurückgeben (mithilfe vonViewresolver
in Spring / Spring-Boot).@RestController
konvertiert auch die Antwort inJSON/XML automatically
as@ResponseBody
macht die zurückgegebenen Objekte zu etwas, das sich im Körper befinden könnte,e.g. JSON or XML
@Controller
@Controller
wird verwendet, um Klassen als Spring MVC Controller zu markieren. Diese Anmerkung ist nur eine spezielle Version von@Component
und ermöglicht die automatische Erkennung der Controller-Klassen basierend auf dem Scannen von Klassenpfaden.@Controller
Sie können eine Ansicht in Spring Web MVC zurückgeben.Detaillierte Ansicht
quelle
Repository und Service sind untergeordnete Elemente der Komponentenanmerkung . Alle sind also Komponenten . Repository und Service erweitern es einfach. Wie genau? Service hat nur einen ideologischen Unterschied: Wir nutzen ihn für Services. Das Repository verfügt über einen bestimmten Ausnahmebehandler.
quelle
Erklärung von Stereotypen:
@Service
- Kommentieren Sie alle Ihre Serviceklassen mit @Service. Diese Schicht kennt die Arbeitseinheit. Ihre gesamte Geschäftslogik befindet sich in Serviceklassen. Im Allgemeinen werden Methoden der Serviceschicht unter Transaktion abgedeckt. Sie können mehrere DAO-Aufrufe über die Servicemethode ausführen. Wenn eine Transaktion fehlschlägt, sollten alle Transaktionen zurückgesetzt werden.@Repository
- Kommentieren Sie alle Ihre DAO-Klassen mit @Repository. Ihre gesamte Datenbankzugriffslogik sollte in DAO-Klassen vorliegen.@Component
- Kommentieren Sie Ihre anderen Komponenten (z. B. REST-Ressourcenklassen) mit dem Komponentenstereotyp.@Autowired
- Lassen Sie Spring andere Beans mithilfe der @ Autowired-Annotation automatisch in Ihre Klassen einbinden.@Component
ist ein generisches Stereotyp für jede von Spring verwaltete Komponente.@Repository
,,@Service
und@Controller
sind Spezialisierungen@Component
für spezifischere Anwendungsfälle, z. B. in den Ebenen Persistenz, Service und Präsentation.Ursprünglich hier beantwortet .
quelle
Unterschied zwischen den Anmerkungen @Component, @Repository, @Controller und @Service
@Controller
= @Component (Interne Annotation) + Features der Präsentationsschicht@Service
= @Component (Interne Annotation) + Features der Serviceschicht@Component
= Tatsächliche Komponenten (Beans)@Repository
= @Component (Interne Annotation) + Features der Datenschicht (Verwendung für die Behandlung der Domain Beans)quelle
Im Frühjahr bietet Framework einige spezielle Arten von Anmerkungen, die als stereotype Anmerkungen bezeichnet werden. Diese sind folgende: -
Die oben deklarierten Annotationen sind etwas Besonderes, da
<context:component-scan>
Spring beim Hinzufügen in die Datei xxx-servlet.xml automatisch das Objekt der Klassen erstellt, die während der Kontexterstellung / Ladephase mit den obigen Annotationen annotiert werden.quelle
@Component
,@ Repository
,@ Service
,@Controller
:@Component
ist ein generisches Klischee für die von Spring - verwalteten Komponenten@Repository
,@Service
und@Controller
sind@Component
Spezialisierungen für spezifischere Anwendungen:@Repository
für die Ausdauer@Service
für Dienstleistungen und Transaktionen@Controller
für MVC-ControllerWarum Gebrauch
@Repository
,@Service
,@Controller
über@Component
? Wir können unsere Komponentenklassen mit @Component markieren, aber stattdessen verwenden wir die Alternative, die sich an die erwartete Funktionalität anpasst. Unsere Klassen sind besser auf die jeweils erwartete Funktionalität abgestimmt.Eine mit Annotationen versehene Klasse
@Repository
verfügt über eine bessere Übersetzung und eine lesbare Fehlerbehandlung mit org.springframework.dao.DataAccessException. Ideal für die Implementierung von Komponenten, die auf Daten zugreifen (DataAccessObject oder DAO).Eine mit Anmerkungen versehene Klasse mit
@Controller
spielt in einer Spring Web MVC-Anwendung eine Controller-RolleEine mit Anmerkungen versehene Klasse mit
@Service
spielt eine Rolle in Geschäftslogikdiensten, z. B. Fassadenmuster für DAO Manager (Fassade) und Transaktionsbehandlungquelle
Die hier präsentierten Antworten sind weitgehend technisch korrekt, aber obwohl die Antwortliste lang ist und dies ganz unten sein wird, dachte ich, dass es sich lohnt, auch hier eine tatsächlich korrekte Antwort einzutragen, nur für den Fall, dass jemand darauf stößt und etwas Wertvolles daraus lernt es. Es ist nicht so, dass der Rest der Antworten falsch ist, es ist nur so, dass sie nicht richtig sind. Und um die Horden von Trollen aufzuhalten, ja, ich weiß, dass diese Anmerkungen technisch gesehen bis zum 5. Frühling praktisch dasselbe und am austauschbarsten sind. Nun zur richtigen Antwort:
Diese drei Anmerkungen sind völlig verschiedene Dinge und nicht austauschbar. Sie können das sagen, weil es drei von ihnen gibt und nicht nur einen. Sie sollen nicht austauschbar sein, sondern nur aus Eleganz und Bequemlichkeit auf diese Weise implementiert werden.
Moderne Programmierung ist Erfindung, Kunst, Technik und Kommunikation in unterschiedlichen Anteilen. Das Kommunikationsbit ist normalerweise sehr wichtig, da Code normalerweise viel häufiger gelesen als geschrieben wird. Als Programmierer versuchen Sie nicht nur, das technische Problem zu lösen, sondern Ihre Absicht auch zukünftigen Programmierern mitzuteilen, die Ihren Code lesen. Diese Programmierer teilen möglicherweise weder Ihre Muttersprache noch Ihr soziales Umfeld, und es ist möglich, dass sie Ihren Code in 50 Jahren lesen (dies ist nicht so unwahrscheinlich, wie Sie vielleicht denken). Es ist schwierig, so weit in die Zukunft effektiv zu kommunizieren. Daher ist es wichtig, dass wir die klarste, effizienteste, korrekteste und kommunikativste Sprache verwenden, die uns zur Verfügung steht.
Zum Beispiel ist es wichtig, dass verwendet
@Repository
wird, wenn wir ein Repository schreiben, anstatt@Component
. Letzteres ist eine sehr schlechte Wahl für Anmerkungen für ein Repository, da dies nicht darauf hinweist, dass es sich um ein Repository handelt. Wir können davon ausgehen, dass ein Repository auch eine Spring-Bean ist, aber nicht, dass eine Komponente ein Repository ist. Mit sind@Repository
wir klar und spezifisch in unserer Sprache. Wir stellen klar, dass dies ein Repository ist. Mit@Component
Wir überlassen es dem Leser, zu entscheiden, welche Art von Komponente sie lesen, und sie müssen die gesamte Klasse (und möglicherweise einen Baum von Unterklassen und Schnittstellen) lesen, um auf die Bedeutung schließen zu können. Die Klasse könnte dann möglicherweise von einem Leser in ferner Zukunft als kein Repository interpretiert werden, und wir wären teilweise für diesen Fehler verantwortlich gewesen, weil wir, die genau wussten, dass dies ein Repository ist, in unserer Sprache nicht spezifisch waren und effektiv unsere Absicht kommunizieren.Ich werde nicht auf die anderen Beispiele eingehen, sondern so klar wie möglich sagen: Diese Anmerkungen sind völlig verschiedene Dinge und sollten entsprechend ihrer Absicht angemessen verwendet werden.
@Repository
ist für Speicher-Repositorys und keine andere Anmerkung ist korrekt.@Service
ist für Dienste und keine andere Anmerkung ist korrekt.@Component
ist für Komponenten, die weder Repostories noch Services sind, und es wäre auch falsch, eine dieser Komponenten an ihrer Stelle zu verwenden. Es könnte kompiliert werden, es könnte sogar Ihre Tests ausführen und bestehen, aber es wäre falsch und ich würde weniger von Ihnen (beruflich) denken, wenn Sie dies tun würden.Es gibt Beispiele dafür während des gesamten Frühlings (und der Programmierung im Allgemeinen). Sie dürfen
@Controller
beim Schreiben einer REST-API nicht verwenden , da diese@RestController
verfügbar ist. Sie dürfen nicht verwenden,@RequestMapping
wenn dies@GetMapping
eine gültige Alternative ist. Usw. usw. Sie müssen die genaueste und korrekteste Sprache auswählen, die Sie können, um Ihren Lesern Ihre Absicht mitzuteilen. Andernfalls führen Sie Risiken in Ihr System ein und das Risiko ist mit Kosten verbunden.quelle
Um diese Darstellung zu vereinfachen, betrachten wir die Technik anhand des Anwendungsfalls. Diese Anmerkungen werden zum Injizieren verwendet und, wie ich wörtlich sagte, "Früher injiziert ", dh wenn Sie wissen, wie die Abhängigkeitsinjektion "DI" und Sie verwendet werden Sollte dies der Fall sein, werden Sie immer nach diesen Anmerkungen suchen. Wenn Sie die Klassen mit diesen Stereotypen versehen , informieren Sie den DI- Container, sie zu scannen, damit sie an anderen Stellen für die Injektion bereit sind. Dies ist das praktische Ziel.
Gehen wir nun zu jedem über. first @Service , Wenn Sie eine Logik für einen bestimmten Geschäftsfall erstellen , müssen Sie diese an einer Stelle trennen, die Ihre Geschäftslogik enthält. Dieser Dienst ist eine normale Klasse, oder Sie können ihn als Schnittstelle verwenden, wenn Sie möchten, und er ist wie folgt geschrieben diese
Alle sind gleich, wenn Sie sie injizieren. @Repository ist eine Schnittstelle, die die Implementierung für das Repository-Muster anwendet. Das Repository-Entwurfsmuster wird im Allgemeinen verwendet, wenn Sie mit einem Datenspeicher oder einer Datenbank arbeiten, und Sie werden feststellen, dass es mehrere enthält fertige Implementierung für Datenbankoperationen; es kann CrudRepository , JpaRepository usw. sein.
Schließlich die @Component , dies ist die generische Form für registrierte Beans im Frühjahr. Das heißt, der Frühling sucht immer nach Beans, die mit @Component markiert sind, um registriert zu werden. Dann sind sowohl @Service als auch @Repository Sonderfälle von @Component, jedoch der übliche Anwendungsfall Denn Komponente ist, wenn Sie etwas rein Technisches machen, das nicht für den direkten Geschäftsfall geeignet ist! wie das Formatieren von Daten oder das Übergeben eines speziellen Anforderungsserialisierungsmechanismus und so weiter.
quelle
@Component fungiert als @ Bean-Annotation in der Konfigurationsklasse, Register Bean im Spring-Kontext. Es ist auch übergeordnet für die Annotation @Service, @Repository und @Controller.
@Service , erweitert die Annotation @Component und weist nur Namensunterschiede auf.
@Repository - erweitert die Annotation @Component und übersetzt alle Datenbankausnahmen in DataAccessException .
@Regler - fungiert als Controller im MVC-Muster. Der Dispatcher durchsucht solche mit Anmerkungen versehenen Klassen nach zugeordneten Methoden und erkennt @ RequestMapping-Anmerkungen.
quelle
Dies sind alles StereoType-Anmerkungen. Diese sind nützlich, um unsere Klassen als Spring Beans in IOC-Containern zu erstellen.
quelle