it-swarm.com.de

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

Können die Annotationen @Component, @Repository und @Service im Frühjahr austauschbar verwendet werden, oder bieten sie eine bestimmte Funktionalität, die nicht nur als Notationsgerät fungiert?

Mit anderen Worten, wenn ich eine Service-Klasse habe und die Annotation von @Service in @Component ändere, verhält es sich trotzdem so?

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

1913
Colin McCree

Von Frühlingsdokumentation :

In Spring 2.0 und höher ist die Annotation @Repository eine Markierung für jede Klasse, die die Rolle oder das Stereotyp (auch als Data Access Object oder DAO bezeichnet) eines Repositorys erfüllt. Zu den Verwendungszwecken dieses Markers gehört die automatische Übersetzung von Ausnahmen.

Spring 2.5 führt weitere stereotype Annotationen ein: @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 mit Anmerkungen versehen. Wenn Sie sie jedoch mit @Repository, @Service oder @Controller versehen, eignen sich Ihre Klassen besser für die Verarbeitung durch Werkzeuge oder mit Aspekten assoziieren. Diese stereotypen Annotationen sind beispielsweise ideale Ziele für Punktschnitte.

Wenn Sie also zwischen der Verwendung von @Component oder @Service für Ihre Service-Schicht wählen, ist @Service eindeutig die bessere Wahl. Auf ähnliche Weise wird @Repository bereits als Markierung 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)      │
└────────────┴─────────────────────────────────────────────────────┘
1390
stivlo

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

Zuerst das Ähnlichkeit

Hervorzuheben ist noch einmal, dass in Bezug auf Scan-Auto-Detection und Dependency Injection für BeanDefinition all diese Annotationen (nämlich @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

@ Component

Dies ist eine allgemeine Stereotypanmerkung, die angibt, dass die Klasse eine Federkomponente ist.

Was ist das Besondere an @Component
<context:component-scan> scannt nur @Component und sucht im Allgemeinen nicht nach @Controller, @Service und @Repository. Sie werden gescannt, weil sie selbst mit @Component gekennzeichnet sind.

Schauen Sie sich einfach die Annotationsdefinitionen @Controller, @Service und @Repository an:

@Component
public @interface Service {
    ….
}

@Component
public @interface Repository {
    ….
}

@Component
public @interface Controller {
    …
}

Daher ist es nicht falsch zu sagen, dass @Controller, @Service und @Repository spezielle Arten von @Component -Anmerkungen sind. <context:component-scan> nimmt sie auf und registriert ihre folgenden Klassen als Beans, so als ob sie mit @Component kommentiert wären.

Spezielle Typanmerkungen werden ebenfalls gescannt, da sie selbst mit der Anmerkung @Component versehen sind, was bedeutet, dass sie auch @Components sind. Wenn wir eine eigene benutzerdefinierte Annotation definieren und diese mit @Component annotieren, wird sie auch mit <context:component-scan> gescannt.


@ Repository

Dies soll anzeigen, dass die Klasse ein Datenrepository definiert.

Was ist das Besondere an @Repository?

Neben dem Hinweis, dass es sich um eine annotationsbasierte Konfiguration handelt , besteht die Aufgabe von @Repository darin, plattformspezifische Ausnahmen zu erfassen und sie erneut als zu werfen eine von Spring 'unified ungeprüften Ausnahmen. Dafür erhalten wir 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, das mit @Repository kommentiert ist, einen Advisor hinzu, sodass alle plattformspezifischen Ausnahmen abgefangen und dann als eine der ungeprüften Spring-Ausnahmen für den Datenzugriff erneut ausgegeben werden.


@ Controller

Die Anmerkung @Controller gibt an, dass eine bestimmte Klasse die Rolle eines Controllers übernimmt. Die Annotation @Controller fungiert als Stereotyp für die annotierte Klasse und gibt deren Rolle an.

Was ist das Besondere an @Controller?

Wir können diese Annotation nicht gegen andere wie @Service oder @Repository austauschen, obwohl sie gleich aussehen. Der Dispatcher durchsucht die mit @Controller annotierten Klassen und erkennt Methoden, die mit @RequestMapping annotierten darin enthalten sind. Wir können @RequestMapping für/in nur den Methoden verwenden, deren Klassen mit @Controller kommentiert sind, und es wird NICHT mit @Component, @Service funktionieren , @Repository etc ...

Hinweis: Wenn eine Klasse bereits mit einer anderen Methode als Bean registriert wurde, z. B. mit den Annotationen @Bean oder @Component, @Service etc ... , dann kann @RequestMapping ausgewählt werden, wenn die Klasse auch mit @RequestMapping annotiert ist. Aber das ist ein anderes Szenario.


@ Service

@Service Beans enthalten die Geschäftslogik und die Aufrufmethoden in der Repository-Ebene.

Was ist das Besondere an @Service?

Abgesehen von der Tatsache, dass sie verwendet wird, um anzuzeigen, dass sie die Geschäftslogik enthält, ist in dieser Anmerkung nichts anderes auffällig. Aber wer weiß, der Frühling kann in Zukunft einige weitere außergewöhnliche hinzufügen.


Was noch?

Ähnlich wie oben könnte Spring in Zukunft spezielle Funktionen für @Service, @Controller und @Repository basierend auf ihren Überlagerungskonventionen hinzufügen. Daher ist es immer eine gute Idee, die Konvention zu respektieren und in Übereinstimmung mit Ebenen zu verwenden.

685
Raman Sahasi

Sie sind fast gleich - alle bedeuten, dass die Klasse eine Frühlingsbohne ist. @Service, @Repository und @Controller sind spezialisierte @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 @Component anbietet, ist, dass Sie andere Annotationen damit annotieren und sie dann auf dieselbe Weise wie @Service verwenden können.

Zum Beispiel habe ich kürzlich gemacht:

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

Alle mit @ScheduledJob gekennzeichneten Klassen sind also Frühlingsbohnen und werden zusätzlich als Quarzjobs registriert. Sie müssen nur Code bereitstellen, der die jeweilige Anmerkung verarbeitet.

419
Bozho

@Component entspricht

<bean>

@ Service, @Controller, @Repository = {@Component + einige weitere spezielle Funktionen}

Das heißt, Service, Controller und Repository sind funktional identisch.

Die drei Anmerkungen werden verwendet, um "Ebenen" in Ihrer Anwendung zu trennen.

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

Nun fragen Sie sich vielleicht, warum sie getrennt werden sollen:

Angenommen, Sie möchten nur die Aktivität der DAO-Ebene überwachen. Sie werden eine Aspect-Klasse (A-Klasse) schreiben, die vor und nach dem Aufrufen jeder DAO-Methode protokolliert. Sie können dies mit AOP tun, da Sie drei verschiedene Ebenen haben und nicht gemischt sind.

Sie können DAO also "um", "vor" oder "nach" den DAO-Methoden protokollieren. Sie könnten das tun, weil Sie in erster Linie einen DAO hatten. Was Sie gerade erreicht haben, ist Trennung von Anliegen oder Aufgaben.

Stellen Sie sich vor, es gäbe nur eine Annotation @Controller. Diese Komponente verfügt über gemischten, also schmutzigen Code für die Verteilung, die Geschäftslogik und den Zugriff auf die Datenbank.

Oben erwähnt ist ein sehr häufiges Szenario, es gibt viele weitere Anwendungsfälle für die Verwendung von drei Anmerkungen.

352
Oliver

Im Frühjahr sind @Component, @Service, @Controller und @Repository stereotype Annotationen, die verwendet werden für:

@Controller: wo Ihre Anfrage Zuordnung von der Präsentationsseite getan dh Die Präsentationsebene wechselt nicht in eine andere Datei, sondern direkt in die Klasse @Controller und sucht in der Annotation @RequestMapping nach dem angeforderten Pfad, der gegebenenfalls vor dem Aufruf der Methode geschrieben wurde.

@Service: Die gesamte Geschäftslogik befindet sich hier, d. H. Datenbezogene Berechnungen und alle. Diese Annotation der Geschäftsschicht, in der unser Benutzer die Persistenzmethode nicht direkt aufruft, sodass diese Methode mit dieser Annotation aufgerufen wird. Es wird @Repository gemäß Benutzeranforderung angefordert

@Repository: Dies ist die Persistenzschicht (Datenzugriffsschicht) der Anwendung, mit der Daten aus der Datenbank abgerufen wurden. d.h. alle datenbankbezogenen Operationen 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 ein " component " ist. Solche Klassen werden als Kandidaten für die automatische Erkennung betrachtet, wenn auf Anmerkungen basierende Konfigurationen und das Scannen von Klassenpfaden verwendet werden.

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

enter image description here

213
Harshal Patil

Spring 2.5 führt weitere stereotype Annotationen ein: @Component, @Service und @Controller. @Component dient als generisches Stereotyp für jede von Spring verwaltete Komponente. wohingegen @Repository, @Service und @Controller als Spezialisierungen von @Component für spezifischere Anwendungsfälle dienen (z. B. in den Ebenen Persistenz, Service bzw. Präsentation). Dies bedeutet, dass Sie Ihre Komponentenklassen mit @Component kommentieren können. Wenn Sie sie jedoch mit @Repository, @Service oder @Controller kommentieren, sind Ihre Klassen besser für die Verarbeitung durch Tools oder die Zuordnung zu Aspekten geeignet. Diese stereotypen Annotationen 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. Wenn Sie sich also zwischen der Verwendung von @Component oder @Service für Ihre Service-Schicht entscheiden, ist @Service eindeutig die bessere Wahl. In ähnlicher Weise wird @Repository, wie oben angegeben, bereits als Markierung 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 - Klassenpfad-Scannen, verwaltete Komponenten und Schreiben von Konfigurationen mit Java

69
Ajit Singh

Die Verwendung der Anmerkungen @Service und @Repository ist aus Sicht der Datenbankverbindung wichtig.

  1. Verwenden Sie @Service für alle DB-Verbindungen Ihres Webdiensttyps
  2. Verwenden Sie @Repository für alle Ihre gespeicherten proc DB-Verbindungen

Wenn Sie nicht die richtigen Anmerkungen verwenden, können Commit-Ausnahmen auftreten, die von Rollback-Transaktionen überschrieben werden. Während des Belastungstests werden Ausnahmen angezeigt, die sich auf das Zurücksetzen von JDBC-Transaktionen beziehen.

45
Das

Technisch gesehen sind @Controller, @Service, @Repository alle gleich. Alle von ihnen erweitern @Component.

Aus dem Spring-Quellcode:

Gibt an, dass eine mit Anmerkungen versehene Klasse eine "Komponente" ist. Solche Klassen werden als Kandidaten für die automatische Erkennung betrachtet, wenn auf Anmerkungen basierende Konfigurationen und das Scannen von Klassenpfaden verwendet werden.

Wir können @Component für jede einzelne Bean direkt verwenden, aber zum besseren Verständnis und zur besseren Wartung einer großen Anwendung verwenden wir @Controller, @Service, @Repository.

Zweck jeder Anmerkung:

  1. @Controller -> Klassen, die mit diesen Anmerkungen versehen sind, sollen eine Anfrage von der Client-Seite erhalten. Die erste Anforderung geht an das Dispatcher-Servlet, von wo aus sie die Anforderung mit dem Wert der Annotation @RequestMapping an den jeweiligen Controller weiterleitet.
  2. @Service -> Mit diesen Kommentaren versehene Klassen sollen Daten manipulieren, die wir vom Client erhalten oder von der Datenbank abrufen. Alle Manipulationen mit Daten sollten in dieser Ebene durchgeführt werden.
  3. @Repository -> Klassen, die mit diesen Anmerkungen versehen sind, 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 die Daten an die @Service-Ebene zurückgesendet werden.

Wenn wir ihren Platz tauschen (verwenden Sie @Repository anstelle von @Controller), funktioniert unsere Anwendung einwandfrei.

Der Hauptzweck der Verwendung von drei verschiedenen @annotations besteht darin, der Enterprise-Anwendung eine bessere Modularität zu verleihen.

32
Yogendra123

@ Repository@ Service und @ Controller dienen als Spezialisierung von @Component für eine spezifischere Verwendung. Auf dieser Basis können Sie @Service durch @Component ersetzen aber in diesem Fall verlieren Sie 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.
27
atish shimpi

alle diese Annotationen sind Stereotypen Annotationstypen, der Unterschied zwischen diesen drei Annotationen ist

  • Wenn wir @Component hinzufügen, wird die Rolle von class als Komponentenklasse angegeben. 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-, Persistenz- oder Controller-Logik enthält direkt diese @Component Annotation
  • Wenn wir @Service-Annotation hinzufügen, wird die Rolle einer Klasse angegeben, die aus Geschäftslogik besteht
  • Wenn wir @Repository über die Klasse setzen, wird eine Klasse angezeigt, die aus einer Persistenzlogik besteht
  • Hier ist @Component eine Basisanmerkung für @ Service-, @ Repository- und @Controller-Annotationen

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 @Service oder @Repositroy oder @Controller hinzufügen, wird die Annotation @Component über der Klasse erstellt
26
Anil Amane

Spring bietet vier verschiedene Typen von Auto-Component-Scan-Annotationen: @Component, @Service, @Repository und @Controller. Technisch gesehen gibt es keinen Unterschied zwischen ihnen, aber jede Annotation für den automatischen Komponentenscan sollte für einen bestimmten Zweck und innerhalb der definierten Ebene verwendet werden.

@Component: Es handelt sich um eine grundlegende Annotation für die automatische Überprüfung von Komponenten. Dies zeigt an, dass es sich bei der annotierten Klasse um eine automatische Überprüfungskomponente handelt.

@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 eine mit Anmerkungen versehene Klasse eine Servicekomponente in der Business-Schicht ist.

@Repository: Sie müssen diese Annotation in der Persistenz-Ebene verwenden, dies verhält sich wie ein Datenbank-Repository.

Man sollte eine spezialisiertere Form von @Component wählen, während man ihre Klasse mit Anmerkungen versieht, da diese Anmerkungen in Zukunft möglicherweise ein bestimmtes Verhalten enthalten.

21
hardeep thakur

Wir können dies gemäß dem Standard Java beantworten

Mit Bezug auf JSR-330, das jetzt von spring unterstützt wird, können Sie @Named nur zum Definieren einer Bean verwenden (Irgendwie @[email protected]). Nach diesem Standard scheint es also keinen Sinn zu geben, Stereotype (wie @Repository, @Service, @Controller) für Kategorien-Beans zu definieren.

Aber Frühlingsnutzer diese verschiedenen Anmerkungen in verschiedenen für die spezifische Verwendung, zum Beispiel:

  1. Helfen Sie Entwicklern, eine bessere Kategorie für die zuständigen Personen zu definieren. Diese Kategorisierung kann in einigen Fällen hilfreich sein. (Wenn Sie beispielsweise aspect-oriented verwenden, können diese ein guter Kandidat für pointcuts sein.)
  2. @Repository Annotation fügt Ihrer Bean einige Funktionen hinzu (einige automatische Exception-Übersetzungen in Ihre Bean-Persistenz-Ebene).
  3. Wenn Sie Spring MVC verwenden, kann der @RequestMapping nur zu Klassen hinzugefügt werden, die mit @Controller kommentiert sind.
20
Alireza Fattahi

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

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

@Component ist ein generisches Stereotyp für alle von Spring verwalteten Komponenten.

@Controller, @Service und @Repository sind Spezialisierungen von @Component für bestimmte Anwendungsfälle.

@Component im Frühjahr

"Component Specialization"

18
Anil Nivargi

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 Component oder @ Service verwenden

16
Manjush

Im Frühjahr 4, neueste Version:

Die @ Repository-Annotation 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 Markers gehört die automatische Übersetzung von Ausnahmen, wie in Abschnitt 20.2.2, „Übersetzung von Ausnahmen“ beschrieben.

Spring bietet weitere stereotype Annotationen: @Component, @Service und @Controller. @Component ist ein generisches Stereotyp für alle von Spring verwalteten Komponenten. @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 mit @Repository, @Service oder @Controller kommentieren, sind Ihre Klassen besser für die Verarbeitung durch Tools oder die Zuordnung zu Aspekten geeignet. Diese stereotypen Annotationen sind beispielsweise ideale Ziele für Punktschnitte. Es ist auch möglich, dass @Repository, @Service und @Controller in zukünftigen Versionen von Spring Framework zusätzliche Semantik enthalten. Wenn Sie sich also für die Verwendung von @Component oder @Service für Ihre Service-Schicht entscheiden, ist @Service eindeutig die bessere Wahl. In ähnlicher Weise wird @Repository, wie oben angegeben, bereits als Markierung für die automatische Ausnahmeübersetzung in Ihrer Persistenzschicht unterstützt.

15
Quan Nguyen

@Component ist die generische Annotation der obersten Ebene, mit der die annotierte Bean gescannt und im DI-Container verfügbar gemacht wird

@Repository ist eine spezielle Annotation, mit der alle ungeprüften Ausnahmen aus den DAO-Klassen konvertiert werden können

@Service ist eine spezialisierte Anmerkung. es bringt ab sofort keine neuen Features mehr, aber es verdeutlicht die Absicht der Bohne

@Controller ist eine spezialisierte Annotation, die die Bean MVC darauf aufmerksam macht und die Verwendung weiterer Annotationen wie @RequestMapping und dergleichen ermöglicht

Hier sind mehr Details

12
Amol Dixit

Es gibt keinen Unterschied zwischen @ Component, @ Service, @ Controller, @ Repository. @Component ist die generische Annotation, die die Komponente unserer MVC darstellt. Im Rahmen unserer MVC-Anwendung werden jedoch mehrere Komponenten wie Service-Layer-Komponenten, Persistenz-Layer-Komponenten und Präsentations-Layer-Komponenten enthalten sein. Um sie zu unterscheiden, haben die Frühlingsleute auch die anderen drei Anmerkungen gemacht.

So stellen Sie Persistenzschichtkomponenten dar: @Repository

So stellen Sie Service-Layer-Komponenten dar: @Service

So stellen Sie Komponenten der Präsentationsebene dar: @Controller

oder Sie können @Component für alle verwenden.

12
tech.yenduri

Ein @Service, um die Frühlingsdokumentation zu zitieren,

Gibt an, dass es sich bei einer mit Anmerkungen versehenen Klasse um einen "Service" handelt rsprünglich definiert von Domain-Driven Design (Evans, 2003) als "eine Operation, die als eigenständige Schnittstelle im Modell ohne gekapselten Status angeboten wird." = Kann auch anzeigen, dass eine Klasse eine "Business Service Facade" (im Sinne von Core J2EE-Mustern) oder etwas Ähnliches ist. Diese Anmerkung ist ein allgemeines Stereotyp, und einzelne Teams können ihre Semantik eingrenzen und gegebenenfalls verwenden.

Wenn Sie domänengetriebenes Design von Eric Evans betrachten,

Ein SERVICE ist eine Operation, die als eigenständige Schnittstelle im Modell angeboten wird, ohne den Status zu verkapseln, wie dies ENTITIES und VALUE OBJECTS tun. DIENSTLEISTUNGEN sind in technischen Frameworks ein weit verbreitetes 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 hier nur 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, beabsichtigte 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 sie erfüllende Schnittstelle sollten als Teil des Domänenmodells definiert werden. Operationsnamen sollten aus der UBIQUITOUS LANGUAGE stammen oder in diese eingegeben werden. Parameter und Ergebnisse sollten Domänenobjekte sein. DIENSTLEISTUNGEN sollten mit Bedacht eingesetzt werden und dürfen nicht die GESELLSCHAFTEN und WERTGEGENSTÄNDE ihres gesamten Verhaltens berauben. Aber wenn eine Operation tatsächlich ein wichtiges Domain-Konzept ist, ist ein SERVICE ein natürlicher Bestandteil eines MODEL-DRIVEN DESIGN. Im Modell als SERVICE deklariert und nicht als gefälschtes Objekt, das eigentlich nichts darstellt, führt der Standalone-Vorgang niemanden in die Irre.

und ein Repository nach Eric Evans,

Ein REPOSITORY repräsentiert alle Objekte eines bestimmten Typs als konzeptionelle Menge (normalerweise emuliert). Es verhält sich wie eine Sammlung, verfügt jedoch über umfangreichere Abfragemöglichkeiten. Objekte des entsprechenden Typs werden hinzugefügt und entfernt, und die Maschine hinter dem REPOSITORY fügt sie ein oder löscht sie aus der Datenbank. Diese Definition umfasst eine Reihe zusammenhängender Verantwortlichkeiten, um den Zugang zu den Wurzeln von AGGREGATES vom frühen Lebenszyklus bis zum Ende zu ermöglichen.

10
Bharath

@ Component: Wenn Sie eine Klasse @Component mit Anmerkungen versehen, wird der Ruhezustand als Bean bezeichnet.

@ Repository: Wenn Sie eine Klasse @Repository mit Anmerkungen versehen, wird im Ruhezustand angezeigt, dass es sich um eine DAO-Klasse handelt, und sie wird als DAO-Klasse behandelt. Bedeutet, dass die ungeprüften (von DAO-Methoden ausgelösten) Ausnahmen für die Übersetzung in Spring DataAccessException zugelassen sind.

@ Service: Dies teilt dem Ruhezustand mit, dass es sich um eine Service-Klasse handelt, in der Sie Anmerkungen zur Service-Ebene @Transactional etc haben, sodass der Ruhezustand als Service-Komponente behandelt wird.

Plus @Service ist ein Fortschritt von @Component. Angenommen, der Name der Bean-Klasse lautet CustomerService, da Sie die XML-Bean-Konfigurationsmethode nicht ausgewählt haben. Sie haben die Bean mit @Component kommentiert, um sie als Bean anzuzeigen. Beim Abrufen des Bean-Objekts CustomerService cust = (CustomerService)context.getBean("customerService"); setzt Spring standardmäßig das erste Zeichen der Komponente in Kleinbuchstaben - von "CustomerService" bis "customerService". Und Sie können diese Komponente mit dem Namen "customerService" abrufen. Wenn Sie jedoch die Annotation @Service für die Bean-Klasse verwenden, können Sie einen bestimmten Bean-Namen über angeben

@Service("AAA")
public class CustomerService{

und Sie können das Bean-Objekt von erhalten

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

Repository und Service sind Kinder von Component Annotation. Also, alle von ihnen sind Komponente. Repository und Service erweitern Sie es einfach. Wie genau? Service hat nur ideologischen Unterschied: Wir benutzen ihn für Services. Repository hat einen bestimmten Ausnahmebehandler.

9
Maria Karpikova

Erklärung von Stereotypen:

  • @Service - Kommentieren Sie alle Ihre Serviceklassen mit @Service. Diese Schicht kennt die Arbeitseinheit. Ihre gesamte Geschäftslogik wird in Serviceklassen unterteilt. Im Allgemeinen werden Methoden der Service-Schicht unter Transaktion abgedeckt. Sie können mehrere DAO-Aufrufe über die Dienstmethode ausführen. Wenn eine Transaktion fehlschlägt, sollten alle Transaktionen zurückgesetzt werden.
  • @Repository - Kommentieren Sie alle Ihre DAO-Klassen mit @Repository. Alle Ihre Datenbankzugriffslogik sollte in DAO-Klassen sein.
  • @Component - Kommentieren Sie Ihre anderen Komponenten (z. B. REST Ressourcenklassen) mit dem Komponentenstereotyp.
  • @Autowired - Lassen Sie Spring andere Beans mit @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 von @Component für spezifischere Anwendungsfälle, z. B. in den Ebenen Persistenz, Service und Präsentation.

Ursprünglich beantwortet hier .

5
Jeevan Patil

Im Frühjahr bietet Framework einige spezielle Arten von Annotationen, sogenannte Stereotyp-Annotationen. 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 spring beim Hinzufügen von <context:component-scan> zur Datei xxx-servlet.xml automatisch das Objekt der Klassen erstellt, die während der Phase der Kontexterstellung/des Ladens mit den obigen Annotationen versehen sind.

3
Brajesh

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

@Component ist ein generisches Stereotyp für die von Spring @Repository, @Service und @Controller verwalteten Komponenten. Es handelt sich um @Component-Spezialisierungen für spezifischere Verwendungen:

  • @ Repository für Persistenz
  • @Service für Services und Transaktionen
  • @Controller für MVC-Controller

Warum @Repository, @Service, @Controller anstelle von @Component verwenden? Wir können unsere Komponentenklassen mit @Component kennzeichnen, verwenden jedoch stattdessen die Alternative, die sich an die erwartete Funktionalität anpasst. Unsere Klassen passen sich besser an die jeweils erwartete Funktionalität an.

Eine mit "@Repository" kommentierte Klasse hat eine bessere Übersetzung und eine lesbare Fehlerbehandlung mit org.springframework.dao.DataAccessException. Ideal zum Implementieren von Komponenten, die auf Daten zugreifen (DataAccessObject oder DAO).

Eine mit "@Controller" versehene Klasse spielt in einer Spring Web MVC-Anwendung eine Controller-Rolle

Eine mit Anmerkungen versehene Klasse mit "@Service" spielt eine Rolle in Geschäftslogikdiensten, z. B. Facade-Muster für DAO Manager (Facade) und Transaktionsbehandlung

2
UHDante

Die Antworten sind gut genug, um den Unterschied zwischen den Annotationen der Komponenten-Repository-Services zu erklären. Ich möchte den Unterschied zwischen _@Controller & @RestController_ teilen

@Controller vs RestController

@RestController:

enter image description here

  • Diese Anmerkung ist eine spezielle Version von _@Controller_, die automatisch _@Controller_ und _@ResponseBody_ Anmerkungen hinzufügt. Daher müssen wir unseren Zuordnungsmethoden nicht _@ResponseBody_ hinzufügen. Das heißt, _@ResponseBody_ ist standardmäßig aktiviert.
  • Wenn Sie _@RestController_ verwenden, können Sie keine Ansicht zurückgeben (Mit Viewresolver in Spring/Spring-Boot)
  • _@RestController_ konvertiert auch die Antwort auf _JSON/XML automatically_, während _@ResponseBody_ die zurückgegebenen Objekte zu etwas macht, das sich im Körper befinden könnte, _e.g. JSON or XML_

@Controller

enter image description here

  • Mit _@Controller_ werden Klassen als Spring MVC Controller gekennzeichnet. Diese Annotation 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.

Detailliertere Ansicht

2
Patel Romil

Um diese Darstellung zu vereinfachen, betrachten wir die technische Umsetzung anhand des Anwendungsfalls. Diese Anmerkungen werden zum Injizieren verwendet und bedeuten, wie ich wörtlich sagte, " zum Injizieren ", wenn Sie wissen, wie man Dependency Injection "DI" verwendet und Sie sollten, dann werden Sie immer nach diesen Annotationen suchen und die Klassen mit diesen annotieren Stereotypen , Sie informieren den DI Container, um sie zu scannen, damit sie an anderen Stellen für die Injektion bereit sind Dies ist das praktische Ziel.

Gehen wir nun zu jedem einzelnen ü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 normale Klasse oder Sie können es als Schnittstelle verwenden, wenn Sie möchten, und es ist so geschrieben

@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 Es handelt sich um eine Schnittstelle, die die Implementierung für das Repository-Muster Repository-Entwurfsmuster anwendet =, im Allgemeinen wird es verwendet, wenn Sie mit einem Datenspeicher oder einer Datenbank zu tun haben, und Sie werden feststellen, dass es mehrere vorbereitete Implementierungen enthält, mit denen Sie Datenbankoperationen abwickeln können. Es kann sich um CrudRepository , JpaRepository usw. handeln.

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

Schließlich die @ -Komponente , dies ist die generische Form für registrierte Beans im Frühjahr, das heißt, spring sucht immer nach Beans, die mit @Component markiert sind, um registriert zu werden Sowohl @Service als auch @Repository sind Spezialfälle von @Component. Der übliche Anwendungsfall für Komponenten ist jedoch, wenn Sie etwas rein Technisches erstellen, das nicht für den direkten Geschäftsfall geeignet ist. wie Datumsformatierung oder Übergabe von Sonderwünschen Serialisierungsmechanismus und so weiter.

1
Mohamed Sweelam

nterschied zwischen @Component-, @Repository-, @Controller- und @Service-Annotationen

@Component - generisch und kann anwendungsübergreifend verwendet werden.
@ Service - Klassen auf Serviceebene mit Anmerkungen versehen.
@ Controller - Kommentieren Sie Klassen auf Präsentationsebenenebene, die hauptsächlich in Spring MVC verwendet werden.
@ Repository - Kommentieren Sie Klassen in der Persistenzschicht, die als Datenbank-Repository fungiert.

@Controller = @Component (Interne Annotation) + Präsentationsebenenfunktionen
@ Service = @Component (Interne Annotation) + Service Layer-Funktionen
@ Component = Aktuelle Komponenten (Bohnen)
@ Repository = @Component (Interne Annotation) + Data Layer Features (Verwendung für die Behandlung der Domain Beans)

0
Lova Chittumuri