Was ist der Unterschied zwischen den Anmerkungen @Component, @Repository und @Service im Frühjahr?

2103

Can @Component, @Repositoryund @ServiceAnmerkungen 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 @Servicein ändere @Component, verhält sie sich dann immer noch genauso?

Oder beeinflusst die Annotation auch das Verhalten und die Funktionalität der Klasse?

Colin McCree
quelle
8
Als Entwickler mit Microsoft-Hintergrund erinnere ich mich an die semantische Definition von Diensten im alten MS SmartClientSoftwareFactory-Framework (jetzt ein längst veraltetes komplexes Framework für verteilte Desktop-Apps). Diese Definition ( von Rich Newman gut dokumentiert ) definierte die Dienste als zustandslose wiederverwendbare Objekte, vorzugsweise mit Singleton-Bereich, die zum Ausführen von Geschäftslogikoperationen für andere als Argumente übergebene Objekte verwendet werden. Ich neige dazu, Frühlingsdienste auf die gleiche Weise zu sehen
Ivaylo Slavov
3
Macht nichts !! Was auch immer für Sie funktioniert :) Ich habe es immer gehasst, dass Spring immer "Regeln" für Sie definiert, die Ihrer Anwendung nur einen trivialen Wert verleihen. Ganz zu schweigen vom Frühling, der mit einem riesigen eigenen Stapel geliefert wird.
TriCore
30
@TriCore Sprting ist ein Framework, definieren "Regeln" für Sie ist seine Aufgabe :)
Walfrat

Antworten:

1501

Aus der Frühlingsdokumentation :

Die @RepositoryAnnotation ist eine Markierung für jede Klasse, die die Rolle oder das Stereotyp eines Repositorys (auch als Data Access Object oder DAO bezeichnet) erfüllt. Zu den Verwendungen dieses Marker ist die automatische Übersetzung von Ausnahmen, wie sie in die Ausnahme Übersetzung .

Frühling bietet weitere Klischee Anmerkungen: @Component, @Service, und @Controller. @Componentist ein generisches Stereotyp für jede von Spring verwaltete Komponente. @Repository,, @Serviceund @Controllersind Spezialisierungen @Componentfür spezifischere Anwendungsfälle (in den Ebenen Persistenz, Service und Präsentation). Daher können Sie Ihre Komponentenklassen mit Anmerkungen versehen. Wenn Sie @Componentsie jedoch mit oder stattdessen mit Anmerkungen versehen @Repository, eignen sich Ihre Klassen besser für die Verarbeitung durch Tools oder die Zuordnung zu Aspekten.@Service@Controller

Diese stereotypen Anmerkungen sind beispielsweise ideale Ziele für Punktschnitte. @Repository,, @Serviceund @Controllerkann auch in zukünftigen Versionen des Spring Frameworks zusätzliche Semantik enthalten. Wenn Sie sich also für die Verwendung @Componentoder @Servicefür Ihre Serviceschicht entscheiden, @Serviceist dies eindeutig die bessere Wahl. In ähnlicher Weise wird, wie bereits erwähnt, @Repositorybereits als Marker für die automatische Ausnahmeübersetzung in Ihrer Persistenzschicht unterstützt.

┌──────────────┬─────────────────────────────────────────────────────┐
 Annotation    Meaning                                             
├──────────────┼─────────────────────────────────────────────────────┤
  @Component   generic stereotype for any Spring-managed component 
  @Repository  stereotype for persistence layer                    
  @Service     stereotype for service layer                        
  @Controller  stereotype for presentation layer (spring-mvc)      
└──────────────┴─────────────────────────────────────────────────────┘
stivlo
quelle
6
Wäre es sinnvoll, einem @WewServlet @Controller (oder @Component) hinzuzufügen? Es ist kein Spring MVC-Controller, aber das ist die konzeptionell engste Übereinstimmung. Was ist mit Servlet-Filtern?
Rick
1
Was bedeutet "@Repository wird bereits als Marker für die automatische Ausnahmeübersetzung in Ihrer Persistenzschicht unterstützt." bedeuten?
Jack
9
Es bezieht sich auf die Tatsache, dass diese Annotationen gute Ziele für AOP sind, und während die anderen Annotationen noch keinen Pointcut definieren, könnten sie dies in Zukunft tun. Andererseits ist @Repository derzeit bereits ein Ziel für einen Pointcut. Dieser Pointcut wird für Ausnahmeübersetzungen verwendet, dh für die Übersetzung von technologie-spezifischen Ausnahmen in allgemeinere Spring-basierte, um eine enge Kopplung zu vermeiden.
Stivlo
3
@stivlo: Ich habe wirklich versucht, den Begriff "Stereotyp" zu verstehen, immer noch nicht zu verstehen. Könnten Sie mir bitte helfen, diese Terminologie zu verstehen? Es hilft sehr und vielen Dank
Premraj
2
@ Xenoterracide Es gibt praktisch keinen großen Unterschied. Etwas, mit dem annotiert @Service ist, ist auch a @Component(weil die @ServiceAnnotation 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.
Jesper
801

Da in vielen Antworten bereits angegeben ist, wofür diese Anmerkungen verwendet werden, konzentrieren wir uns hier auf einige geringfügige Unterschiede zwischen ihnen.

Zuerst die Ähnlichkeit

Der erste Punkt, der noch einmal hervorgehoben werden sollte, ist, dass in Bezug auf die automatische Erkennung von Scans und die Abhängigkeitsinjektion für BeanDefinition alle diese Anmerkungen (d. H. @Component, @Service, @Repository, @Controller) gleich sind. Wir können eins anstelle des anderen verwenden und uns trotzdem zurechtfinden.


Unterschiede zwischen @Component, @Repository, @Controller und @Service

@Komponente

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 ,@Serviceund@Repositoryim Allgemeinen. Sie werden gescannt, weil sie selbst mit Anmerkungen versehen sind@Component.

Werfen Sie einen Blick auf @Controller, @Serviceund @RepositoryAnnotation Definitionen:

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Repository {
    ….
}

 

@Component
public @interface Controller {
    
}

Daher ist es nicht falsch, das zu sagen @Controller, @Serviceund @Repositoryes handelt sich um spezielle Arten von @ComponentAnmerkungen. <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 @ComponentAnmerkungen versehen sind, was bedeutet, dass sie auch @Components sind. Wenn wir unsere eigene benutzerdefinierte Anmerkung definieren und sie mit Anmerkungen versehen @Component, wird sie auch mit gescannt<context:component-scan>


@Repository

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 @Repositorydie Aufgabe darin, plattformspezifische Ausnahmen abzufangen und sie als eine der einheitlichen, nicht aktivierten Ausnahmen von Spring erneut auszulösen. Dafür erhalten wir Folgendes PersistenceExceptionTranslationPostProcessor, das wir im Anwendungskontext unseres Spring wie folgt hinzufügen müssen:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Dieser Bean-Postprozessor fügt jedem Bean, mit dem Anmerkungen versehen sind, einen Advisor hinzu, @Repositorysodass plattformspezifische Ausnahmen abgefangen und dann als eine der ungeprüften Datenzugriffsausnahmen von Spring erneut ausgelöst werden.


@Regler

Die @ControllerAnmerkung gibt an, dass eine bestimmte Klasse die Rolle eines Controllers übernimmt. Die @ControllerAnnotation 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 @Serviceoder @Repositoryersetzen, obwohl sie gleich aussieht. Der Dispatcher durchsucht die @Controllermit @RequestMappingAnmerkungen versehenen Klassen und erkennt Methoden, die mit Anmerkungen versehen sind. Wir können verwenden @RequestMappingnur auf / in jenen Methoden , deren Klassen mit annotiert , @Controllerund es wird nicht funktionieren mit @Component, @Service, @Repositoryetc ...

Hinweis: Wenn eine Klasse bereits als Bohne durch jede andere Methode registriert ist, wie durch @Beanoder durch @Component, @Serviceusw ... Anmerkungen, dann @RequestMappingkönnen ausgewählt werden , wenn die Klasse auch mit Anmerkungen versehen ist @RequestMappingAnmerkung. Aber das ist ein anderes Szenario.


@Bedienung

@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.


Was sonst?

Ähnlich wie oben, in der Zukunft hinzufügen Frühling können spezielle Funktionalitäten für @Service, @Controllerund @Repositoryauf der Grundlage ihrer Schichtung Konventionen. Daher ist es immer eine gute Idee, die Konvention zu respektieren und sie in Übereinstimmung mit Ebenen zu verwenden.

Raman Sahasi
quelle
'PersistenceExceptionTranslationPostProcessor' wird automatisch registriert, wenn JPA erkannt wird.
Olga
21
Fantastische Erklärung. Sie haben viele meiner Missverständnisse ausgeräumt. Als ich von einer Universität kam, an der wir alle unsere Projekte von Grund auf aufgebaut haben, hatte ich Schwierigkeiten zu verstehen, warum Spring Applications gerade funktioniert hat, obwohl Sie das Programm nicht explizit selbst miteinander verknüpfen. Die Anmerkungen machen jetzt sehr viel Sinn, danke!
NodziGames
Was bedeutet dann die @ Service-Annotation für den Ruhezustand (Persistenzschicht), neben der DI-Funktion, was ist mit dem Persistenzschicht-Proxy zum Abrufen und Zuordnen einer Art von Entität zu dem jeweiligen DTO? Diese Ebene ist sehr wichtig für die Dynamik in der Persistenzschicht. Wenn jemand genau weiß, wie es sich auf JPA auswirkt, wäre es sehr, sehr hilfreich)))
Musa
1
Es gibt einige kleine Fehlinformationen über @ControllerAnmerkungen. Es ist nicht erforderlich, wenn die Klasse mit Anmerkungen versehen ist @RequestMappingund die Bean dieser Klasse in irgendeiner Weise erstellt wurde. Jede mit @Controller OR kommentierte Bean @RequestMappingnimmt an den Anforderungszuordnungen von Spring MVC teil. Dies kann beispielsweise nützlich sein, um Controller programmgesteuert zu erstellen (z. B. mithilfe von @BeanMethoden) und gleichzeitig zu verhindern, dass Spring versucht, sie durch Paketscan zu erstellen (wenn das Paket nicht vom Scannen ausgeschlossen werden kann).
Ruslan Stelmachenko
1
Dies sollte die beste Antwort sein - beantwortet alle Fragen und geht ziemlich tief. @stivlo hat nicht viel über die erste OP-Frage erklärt - technische Unterschiede.
Kiedysktos
430

Sie sind fast gleich - alle bedeuten, dass die Klasse eine Frühlingsbohne ist. @Service, @RepositoryUnd @Controllersind spezialisiert @Components. 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 werden

Eine andere Sache ist, dass Sie die Komponenten semantisch verschiedenen Ebenen zuordnen.

Eine Sache, die @Componentbietet, 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:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Alle mit Anmerkungen versehenen Klassen @ScheduledJobsind also Frühlingsbohnen und werden zusätzlich als Quarzjobs registriert. Sie müssen nur Code bereitstellen, der die spezifische Anmerkung verarbeitet.

Bozho
quelle
1
@Component bedeutet nur eine Frühlingsbohne. Gibt es einen anderen Zweck dafür?
Kapil das
21
@Component Beans sind vom Federbehälter automatisch erkennbar. Sie müssen Bean nicht in der Konfigurationsdatei definieren, es wird zur Laufzeit von Spring automatisch erkannt.
Akash5288
1
Ich mag die generische @Component sehr gern ... besonders in Kombination mit @Scope (proxyMode = ScopedProxyMode.//MODE)
Eddie B
365

@Component entspricht

<bean>

@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.

  • Controller erledigen nur Dinge wie Versenden, Weiterleiten, Aufrufen von Servicemethoden usw.
  • Service Hold Geschäftslogik, Berechnungen usw.
  • Repository sind die DAOs (Data Access Objects), sie greifen direkt auf die Datenbank zu.

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.

Oliver
quelle
6
Ich habe eine grundlegende Frage: Werden Anmerkungen vom Federmechanismus verwendet oder sind sie nur für den Programmierer gedacht, um sich daran zu erinnern, was diese Codeteile tun?
user107986
25
@ user107986 Sie dienen hauptsächlich dazu, dass sich der Programmierer Ebenen in der Anwendung merkt. Hat aber @Respositoryauch automatische Ausnahmeübersetzungsfunktion. Wie wenn eine Ausnahme in a auftritt, @Repositorygibt 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 PersistenceExceptionTranslationPostProcessor
Oliver
Können Sie bitte einen Beispielcode schreiben, wie Sie gemeinsame Punkte für die gesamte Klasse "@Repository" schreiben? Entweder verwenden wir Ausdrücke oder verwenden den Bean-Namen, aber wie wir sagen können, gilt dieser Rat für alle "@Repository" -Klassen. Ich habe versucht, das Beispiel dafür zu erhalten, konnte es aber nicht finden. Ihre Hilfe wird sehr geschätzt.
Moni
Auch wenn die Anmerkungen derzeit alle funktional gleich funktionieren, ist es möglich, dass in Zukunft bestimmte Funktionen für ein bestimmtes Attribut hinzugefügt werden.
Cod3Citrus
224

Im Frühjahr @Component, @Service, @Controller, und @RepositoryStereotypie 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 @ControllerKlasse und sucht in der @RequestMappingAnnotation 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.

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.

Andere Annotationen auf Klassenebene können ebenfalls als eine Komponente identifizierend angesehen werden, typischerweise eine spezielle Art von Komponente: z. B. die Annotation @Repository oder die Annotation @Aspect von AspectJ.

Geben Sie hier die Bildbeschreibung ein

Harshal Patil
quelle
24
Diese Antworten sind alle nett und alle, aber ich bin mir ziemlich sicher, dass die meisten von uns einige Codebeispiele für die Funktionen wünschen, die Komponenten wie Serviceangebote, die wir konkreter in unseren Kopf setzen können, anstatt nur eine allgemeine Beschreibung wie "Geschäftslogik" zu verwenden dieses Objekt. Ansonsten gehen wir immer noch davon aus, "oh, das ist großartig und alles, aber ich kann immer noch den gleichen Code auf die Komponente anwenden"
dtc
2
Nicht jede Geschäftslogik sollte in Dienstleistungen fließen! Dienste in Bezug auf DDD sollten nur Domänenlogik enthalten, die mehr als eine Entität betrifft. Siehe Antwort stackoverflow.com/a/41358034/238134
Deamon
@ Deamon Ja, aber es hängt vom Ansatz der Entwickler ab
Harshal Patil
4
@HarshalPatil Sie könnten natürlich eine Anwendung mit der gesamten Geschäftslogik in Diensten schreiben, aber dies würde zu einem anämischen Domänenmodell führen und es unnötig schwierig machen, Einschränkungen und Konsistenz für die Entitäten durchzusetzen.
Deamon
1
Natürlich hängt es vom Ansatz des Entwicklers ab. Alles macht. Wenn Sie sich dem Problem falsch nähern, dh schreiben Sie, was Sie wollen, ohne Struktur und sagen Sie, es sei "Ihr Ansatz" - es macht es jedoch nicht richtig. "Richtig" und "Falsch" werden natürlich als Begriffe verwendet, um gute Softwareentwicklungspraktiken wie SOLID und andere Prinzipien zu beschreiben, im Gegensatz zu schlechten Softwarepraktiken wie "Ich möchte es erst einmal so" und ähnlichem.
Milosmns
71

In Spring 2.5 werden weitere stereotype Annotationen eingeführt: @Component, @Service und @Controller. @Component dient als generisches Stereotyp für jede von Spring verwaltete Komponente. @Repository, @Service und @Controller dienen als Spezialisierungen von @Component für spezifischere Anwendungsfälle (z. B. in den Ebenen Persistenz, Service und Präsentation). Dies bedeutet, dass Sie Ihre Komponentenklassen mit @Component kommentieren können. Wenn Sie sie jedoch stattdessen mit @Repository, @Service oder @Controller kommentieren, eignen sich Ihre Klassen besser für die Verarbeitung durch Tools oder die Zuordnung zu Aspekten. Diese stereotypen Anmerkungen sind beispielsweise ideale Ziele für Punktschnitte. Natürlich ist es auch möglich, dass @Repository, @Service und @Controller in zukünftigen Versionen des Spring Frameworks zusätzliche Semantik enthalten. Somit, Wenn Sie sich für die Verwendung von @Component oder @Service für Ihre Serviceschicht entscheiden, ist @Service eindeutig die bessere Wahl. In ähnlicher Weise wird @Repository, wie oben angegeben, bereits als Marker für die automatische Ausnahmeübersetzung in Ihrer Persistenzschicht unterstützt.

@Component  Indicates a auto scan component.
@Repository  Indicates DAO component in the persistence layer.
@Service  Indicates a Service component in the business layer.
@Controller  Indicates a controller component in the presentation layer.

Referenz: - Spring Documentation - Scannen von Klassenpfaden, verwaltete Komponenten und Schreiben von Konfigurationen mit Java

Ajit Singh
quelle
48

Technisch gesehen @Controller, @Service, @Repositorysind 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 @Componentfü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:

  1. @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 @RequestMappingAnnotationswerts an den jeweiligen Controller weiterleitet.
  2. @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.
  3. @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 ( @Repositoryanstelle von verwenden @Controller), funktioniert unsere Anwendung einwandfrei.

Der Hauptzweck der Verwendung von drei verschiedenen Funktionen @annotationsbesteht darin, der Enterprise-Anwendung eine bessere Modularität zu bieten.

YogendraR
quelle
2
Was meinst du mit dem Ersetzen von Austauschplätzen? controller and repository
Ashish Kamble
46

Die Verwendung von @Serviceund @RepositoryAnmerkungen sind aus Sicht der Datenbankverbindung wichtig.

  1. Verwenden @ServiceSie diese Option für alle DB-Verbindungen Ihres Webdiensttyps
  2. Verwenden Sie @Repositoryfür alle Ihre gespeicherten Proc-DB-Verbindungen

Wenn 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.

Das
quelle
Kann @Repository für RestAPI-Aufrufe anstelle von DB-Vorgängen verwendet werden?
Nayeem
@Nayeem technisch können Sie Dienste als Controller und Repositorys als Dienste mit Anmerkungen versehen. Die Abhängigkeitsinjektion würde genauso funktionieren. Aber warum würdest du das jemals tun? Wenn es nicht mit Datenbankentitäten funktioniert, @Repositoryist 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.
Ben
28

@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.

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.
atish shimpi
quelle
27

Alle diese Anmerkungen sind Stereotypen, der Unterschied zwischen diesen drei Anmerkungen besteht

  • Wenn wir die @ -Komponente hinzufügen, wird angegeben, dass die Rolle der Klasse eine Komponentenklasse ist. Dies bedeutet, dass es sich um eine Klasse handelt, die aus einer Logik besteht. Es wird jedoch nicht angegeben, ob eine Klasse eine bestimmte Geschäfts- oder Persistenz- oder Controller-Logik enthält, sodass wir sie nicht verwenden direkt diese @ Komponenten-Annotation
  • Wenn wir eine @ Service-Annotation hinzufügen, wird eine Rolle der Klasse angegeben, die aus Geschäftslogik besteht
  • Wenn wir @Repository über der Klasse hinzufügen, wird eine Klasse angezeigt, die aus Persistenzlogik besteht
  • Hier ist @Component eine Basisanmerkung für @ Service-, @ Repository- und @ Controller-Anmerkungen

zum Beispiel

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • Immer wenn wir die Annotation @Serviceoder @Repositroyoder hinzufügen, wird die @ControllerAnnotation standardmäßig @Componentüber der Klasse angezeigt
Anil Amane
quelle
23

Frühling bietet vier verschiedene Arten von Auto - Komponenten - Scan - Annotationen, sie sind @Component, @Service, @Repositoryund @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 @Componentbeim Kommentieren der Klasse eine speziellere Form wählen, da diese Annotation in Zukunft ein bestimmtes Verhalten enthalten kann.

hardeep thakur
quelle
20

Wir können dies nach Java-Standard beantworten

In Bezug auf JSR-330, die jetzt von Spring unterstützt wird, können Sie nur @Namedeine 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:

  1. Helfen Sie Entwicklern, eine bessere Kategorie für die Kompetenten zu definieren. Diese Kategorisierung kann in einigen Fällen hilfreich sein. (Wenn Sie zum Beispiel verwenden aspect-oriented, können diese ein guter Kandidat für sein pointcuts)
  2. @Repository Durch Annotation werden Ihrer Bean einige Funktionen hinzugefügt (einige automatische Ausnahmeübersetzungen in Ihre Bean-Persistenzschicht).
  3. Wenn Sie Spring MVC verwenden, @RequestMappingkann das nur zu Klassen hinzugefügt werden, die mit Anmerkungen versehen sind @Controller.
Alireza Fattahi
quelle
In Bezug auf Ihren 3. Punkt. Das ist nicht wahr. Ich kann die Annotation @RequestMapping auch zu Methoden unter der Serviceklasse hinzufügen (ich meine mit @Service annotierte Klassen).
Rahul Gupta
19

Kommentieren Sie andere Komponenten mit @Component, z. B. REST-Ressourcenklassen.

@Component
public class AdressComp{
    .......
    ...//some code here    
}

@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

"Komponentenspezialisierung"

Anil Nivargi
quelle
18

Es gibt keinen Unterschied zwischen @Component, @Service, @Controller, @Repository. @Componentist 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.

  • So stellen Sie Komponenten der Persistenzschicht dar: @Repository
  • So stellen Sie Service-Layer-Komponenten dar: @Service
  • So stellen Sie Komponenten der Präsentationsschicht dar: @Controller
  • oder Sie können @Componentfür alle von ihnen verwenden.
tech.yenduri
quelle
17

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

Manjush
quelle
15

Im Frühjahr 4, neueste Version:

Die Annotation @Repository ist eine Markierung für jede Klasse, die die Rolle oder das Stereotyp eines Repositorys erfüllt (auch als Data Access Object oder DAO bezeichnet). Zu den Verwendungszwecken dieses Markers gehört die automatische Übersetzung von Ausnahmen, wie in Abschnitt 20.2.2, „Ausnahmeübersetzung“ beschrieben.

Spring bietet weitere stereotype Anmerkungen: @Component, @Service und @Controller. @Component ist ein generisches Stereotyp für jede von Spring verwaltete Komponente. @Repository, @Service und @Controller sind Spezialisierungen von @Component für spezifischere Anwendungsfälle, z. B. in den Ebenen Persistenz, Service und Präsentation. Daher können Sie Ihre Komponentenklassen mit @Component kommentieren. Wenn Sie sie jedoch stattdessen mit @Repository, @Service oder @Controller kommentieren, eignen sich Ihre Klassen besser für die Verarbeitung durch Tools oder die Zuordnung zu Aspekten. Diese stereotypen Anmerkungen sind beispielsweise ideale Ziele für Punktschnitte. Es ist auch möglich, dass @Repository, @Service und @Controller in zukünftigen Versionen des Spring Frameworks zusätzliche Semantik enthalten. Somit, Wenn Sie zwischen der Verwendung von @Component oder @Service für Ihre Serviceschicht wählen, ist @Service eindeutig die bessere Wahl. In ähnlicher Weise wird @Repository, wie oben angegeben, bereits als Marker für die automatische Ausnahmeübersetzung in Ihrer Persistenzschicht unterstützt.

Quan Nguyen
quelle
15

@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 kommen DataAccessException.

@Service : Dies teilt dem Ruhezustand mit, dass es sich um eine Service-Klasse handelt, in der Sie @TransactionalAnmerkungen zur Service-Schicht usw. haben. Der Ruhezustand behandelt sie daher als Service-Komponente.

Plus @Serviceist voraus von @Component. Angenommen, der Name der Bean-Klasse lautet CustomerService, 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-Objekts CustomerService 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 @ServiceAnnotation für die Bean-Klasse verwenden, können Sie einen bestimmten Bean-Namen von angeben

@Service("AAA")
public class CustomerService{

und Sie können das Bean-Objekt von erhalten

CustomerService cust = (CustomerService)context.getBean("AAA");
Arun Raaj
quelle
13

@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

@Serviceist 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 @RequestMappingund all dieser ermöglicht

Hier finden Sie weitere Details

Amol Dixit
quelle
11

A @Serviceum Frühlingsdokumentation zu zitieren,

Gibt an, dass eine mit Anmerkungen versehene Klasse ein "Service" ist, der ursprünglich von Domain-Driven Design (Evans, 2003) als "eine Operation definiert wurde, die als eigenständige Schnittstelle im Modell ohne gekapselten Status angeboten wird". Kann auch darauf hinweisen, dass eine Klasse eine "Business Service Facade" (im Sinne von Core J2EE Patterns) oder ähnliches ist. Diese Anmerkung ist ein allgemeines Stereotyp, und einzelne Teams können ihre Semantik einschränken und gegebenenfalls verwenden.

Wenn Sie sich das domänengetriebene Design von Eric Evans ansehen,

Ein SERVICE ist eine Operation, die als Schnittstelle angeboten wird, die im Modell allein steht, ohne den Zustand zu kapseln, wie dies bei ENTITIES und VALUE OBJECTS der Fall ist. DIENSTLEISTUNGEN sind in technischen Frameworks ein gängiges Muster, können jedoch auch in der Domänenschicht angewendet werden. Der Namensdienst betont die Beziehung zu anderen Objekten. Im Gegensatz zu ENTITIES und VALUE OBJECTS wird es nur in Bezug darauf definiert, was es für einen Kunden tun kann. Ein SERVICE wird eher nach einer Aktivität als nach einer Entität benannt - eher nach einem Verb als nach einem Substantiv. Ein SERVICE kann immer noch eine abstrakte, absichtliche Definition haben. Es hat nur einen anderen Geschmack als die Definition eines Objekts. Ein SERVICE sollte weiterhin eine definierte Verantwortung haben, und diese Verantwortung und die Schnittstelle, die sie erfüllt, sollten als Teil des Domänenmodells definiert werden. Operationsnamen sollten aus der UBIQUITOUS LANGUAGE stammen oder in diese eingeführt werden. Parameter und Ergebnisse sollten Domänenobjekte sein. DIENSTLEISTUNGEN sollten mit Bedacht eingesetzt werden und dürfen die ENTITIES und VALUE OBJECTS nicht ihres gesamten Verhaltens berauben. Wenn eine Operation tatsächlich ein wichtiges Domänenkonzept ist, ist ein SERVICE ein natürlicher Bestandteil eines MODELLGESTÜTZTEN DESIGN. Im Modell als SERVICE deklariert und nicht als falsches Objekt, das eigentlich nichts darstellt, wird die eigenständige Operation niemanden irreführen. Ein SERVICE ist ein natürlicher Bestandteil eines MODELLGESTÜTZTEN DESIGN. Im Modell als SERVICE deklariert und nicht als falsches Objekt, das eigentlich nichts darstellt, wird die eigenständige Operation niemanden irreführen. Ein SERVICE ist ein natürlicher Bestandteil eines MODELLGESTÜTZTEN DESIGN. Im Modell als SERVICE deklariert und nicht als falsches Objekt, das eigentlich nichts darstellt, wird die eigenständige Operation niemanden irreführen.

und ein Repositorynach Eric Evans,

Ein REPOSITORY repräsentiert alle Objekte eines bestimmten Typs als konzeptionelle Menge (normalerweise emuliert). Es verhält sich wie eine Sammlung, außer mit einer detaillierteren Abfragefunktion. Objekte des entsprechenden Typs werden hinzugefügt und entfernt, und die Maschinerie hinter dem REPOSITORY fügt sie ein oder löscht sie aus der Datenbank. Diese Definition enthält eine Reihe zusammenhängender Verantwortlichkeiten für den Zugang zu den Wurzeln von AGGREGATES vom frühen Lebenszyklus bis zum Ende.

Bharath
quelle
11

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::

Geben Sie hier die Bildbeschreibung ein

  • Diese Anmerkung ist eine spezielle Version, @Controllerdie automatisch hinzugefügt @Controllerund @ResponseBodykommentiert wird. Daher müssen wir @ResponseBodyunsere Mapping-Methoden nicht ergänzen . Das heißt, @ResponseBodyist standardmäßig aktiv.
  • Wenn Sie verwenden @RestController, können Sie keine Ansicht zurückgeben (mithilfe von Viewresolverin Spring / Spring-Boot).
  • @RestControllerkonvertiert auch die Antwort in JSON/XML automaticallyas @ResponseBodymacht die zurückgegebenen Objekte zu etwas, das sich im Körper befinden könnte,e.g. JSON or XML

@Controller

Geben Sie hier die Bildbeschreibung ein

  • @Controllerwird verwendet, um Klassen als Spring MVC Controller zu markieren. Diese Anmerkung ist nur eine spezielle Version von @Componentund 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

Patel Romil
quelle
9

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.

Maria Pomazkina-Karpikova
quelle
6

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.

@Componentist ein generisches Stereotyp für jede von Spring verwaltete Komponente. @Repository,, @Serviceund @Controllersind Spezialisierungen @Componentfür spezifischere Anwendungsfälle, z. B. in den Ebenen Persistenz, Service und Präsentation.

Ursprünglich hier beantwortet .

Jeevan Patil
quelle
5

Unterschied zwischen den Anmerkungen @Component, @Repository, @Controller und @Service

@Component - generisch und kann anwendungsübergreifend verwendet werden.
@Service - Kommentieren Sie Klassen auf Service-Layer-Ebene.
@Controller - Kommentieren Sie Klassen auf der Ebene der Präsentationsebenen, die hauptsächlich in Spring MVC verwendet werden.
@Repository - Kommentieren Sie Klassen auf der Persistenzschicht, die als Datenbank-Repository fungieren.

@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)

Lova Chittumuri
quelle
3

Im Frühjahr bietet Framework einige spezielle Arten von Anmerkungen, die als stereotype Anmerkungen bezeichnet werden. Diese sind folgende: -

@RestController- Declare at controller level.
@Controller  Declare at controller level.
@Component  Declare at Bean/entity level.
@Repository  Declare at DAO level.
@Service  Declare at BO level.

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.

Brajesh
quelle
2

@Component, @ Repository, @ Service, @Controller:

@Componentist ein generisches Klischee für die von Spring - verwalteten Komponenten @Repository, @Serviceund @Controllersind @ComponentSpezialisierungen für spezifischere Anwendungen:

  • @Repository für die Ausdauer
  • @Service für Dienstleistungen und Transaktionen
  • @Controller für MVC-Controller

Warum 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 @Repositoryverfü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 @Controllerspielt in einer Spring Web MVC-Anwendung eine Controller-Rolle

Eine mit Anmerkungen versehene Klasse mit @Servicespielt eine Rolle in Geschäftslogikdiensten, z. B. Fassadenmuster für DAO Manager (Fassade) und Transaktionsbehandlung

UHDante
quelle
2

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 @Repositorywird, 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 @Repositorywir klar und spezifisch in unserer Sprache. Wir stellen klar, dass dies ein Repository ist. Mit@ComponentWir ü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. @Repositoryist für Speicher-Repositorys und keine andere Anmerkung ist korrekt. @Serviceist für Dienste und keine andere Anmerkung ist korrekt. @Componentist 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 @Controllerbeim Schreiben einer REST-API nicht verwenden , da diese @RestControllerverfügbar ist. Sie dürfen nicht verwenden, @RequestMappingwenn dies @GetMappingeine 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.

Softwareentwickler
quelle
gut gesagt und guter Punkt!
Andy
1

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

@Service
public class Doer {
   // Your logic 
}

// To use it in another class, suppose in Controller 
@Controller
public class XController {
 // You have to inject it like this 
 @Autowired 
 private Doer doer;
}

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.

// For example
public interface DoerRepository implements JpaRepository<Long, XEntity> {}

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.

Mohamed Sweelam
quelle
0

@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.

Mykhailo Moskura
quelle
-13
@Component
@Controller
@Repository
@Service
@RestController

Dies sind alles StereoType-Anmerkungen. Diese sind nützlich, um unsere Klassen als Spring Beans in IOC-Containern zu erstellen.

Siddartha Kamble
quelle