Frage Was ist der Unterschied zwischen @Component-, @Repository- und @Service-Anmerkungen im Frühling?


Kann @Component, @Repository und @Service können Annotationen im Frühling synonym verwendet werden oder stellen sie eine bestimmte Funktionalität zur Verfügung, außer dass sie als Notationsgerät fungieren?

Mit anderen Worten, wenn ich eine Service-Klasse habe und ich die Anmerkung von ändern @Service zu @Component, wird es sich immer noch genauso verhalten?

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


1515
2017-07-26 09:10


Ursprung


Antworten:


Von Frühlingsdokumentation:

Im Frühjahr 2.0 und später, der @Repository Annotation ist ein Marker für   jede Klasse, die die Rolle oder den Stereotyp erfüllt (auch bekannt als Data   Access Object oder DAO) eines Repositories. Unter den Verwendungen dieses Markers   ist die automatische Übersetzung von Ausnahmen.

Frühling 2.5 führt weitere stereotype Annotationen ein: @Component,    @Service, und @Controller. @Component ist ein generisches Stereotyp für alle   Spring-verwaltete Komponente. @Repository, @Service, und @Controller sind   Spezialisierungen von @Component für spezifischere Anwendungsfälle, z   B. in den Persistenz-, Service- und Präsentationsebenen,   beziehungsweise.

Daher können Sie Ihre Komponentenklassen mit annotieren @Component,   aber indem ich sie mit annotiere @Repository, @Service, oder @Controller   Stattdessen eignen sich Ihre Klassen besser für die Verarbeitung mit Tools   oder assoziieren mit Aspekten. Zum Beispiel diese Stereotyp-Annotationen   mach ideale Ziele für Pointcuts.

Also, wenn Sie zwischen verwenden wählen @Component oder @Service zum   Ihre Serviceschicht, @Service ist eindeutig die bessere Wahl. Ähnlich,   wie oben erwähnt, @Repository wird bereits als Markierung für unterstützt   automatische Ausnahmeübersetzung in Ihrer Persistenzschicht.

┌────────────┬─────────────────────────────────────────────────────┐
│ 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)      │
└────────────┴─────────────────────────────────────────────────────┘

1110
2017-08-01 10:20



Da viele der Antworten bereits angeben, wofür diese Anmerkungen verwendet werden, konzentrieren wir uns hier auf einige kleine Unterschiede zwischen ihnen.

Zuerst die Ähnlichkeit 

Ein erster Punkt, der noch einmal hervorzuheben ist: in Bezug auf Scan-Auto-Erkennung und Abhängigkeitsinjektion für BeanDefinition all diese Anmerkungen (z. B. @Component, @Service,   @Repository, @Controller) sind gleich. Wir können einen an Ort und Stelle verwenden   von einem anderen und kann immer noch herumkommen.


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

@Komponente

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

Was ist das Besondere an @Component?
<context:component-scan> scannt nur @Component und sucht nicht @Controller, @Service und @Repository Im Algemeinen. Sie werden gescannt, weil sie selbst mit Anmerkungen versehen sind @Component.

Sieh es dir einfach an @Controller, @Service und @Repository Annotationsdefinitionen:

@Component
public @interface Service {
    ….
}

@Component
public @interface Repository {
    ….
}

@Component
public @interface Controller {
    …
}

Also ist es nicht falsch das zu sagen @Controller, @Service und @Repository sind besondere Arten von @Component Anmerkung. <context:component-scan> nimmt sie auf und registriert ihre folgenden Klassen als Bohnen, so als ob sie mit Anmerkungen versehen wären @Component.

Sie werden gescannt, weil sie selbst mit Anmerkungen versehen sind @Component Anmerkung. Wenn wir unsere eigene benutzerdefinierte Annotation definieren und mit kommentieren @Component, dann wird es auch gescannt <context:component-scan>


@Repository

Dies bedeutet, dass die Klasse ein Daten-Repository definiert.

Was ist das Besondere an @Repository? 

Zusätzlich zu dem Hinweis, dass dies ein Annotation-basierte Konfiguration, @RepositoryDie Aufgabe besteht darin, plattformspezifische Ausnahmen abzufangen und sie als eine der unangepassten ungeprüften Ausnahmen von Spring erneut zu werfen. Und dafür sind wir ausgestattet PersistenceExceptionTranslationPostProcessor, die wir in unserem Spring-Anwendungskontext hinzufügen müssen:

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

Dieser Bean-Post-Prozessor fügt einen Advisor zu jeder Bean hinzu, der mit Anmerkungen versehen ist @Repository Daher werden alle plattformspezifischen Ausnahmen abgefangen und anschließend als eine der ungeprüften Datenzugriffsausnahmen von Spring erneut gestartet.


@Regler

Das @Controller Anmerkung bedeutet, dass eine bestimmte Klasse die Rolle eines Controllers übernimmt. Das @Controller Annotation fungiert als Stereotyp für die annotierte Klasse und zeigt ihre Rolle an.

Was ist das Besondere an @Controller? 

Wir können diese Annotation nicht mit anderen ähnlichen Objekten austauschen @Service oder @Repositoryobwohl sie gleich aussehen. Der Dispatcher scannt die mit Anmerkungen versehenen Klassen @Controller und erkennt @RequestMapping Anmerkungen in ihnen. Wir können nur benutzen @RequestMapping auf @Controller annotierte Klassen.


@Bedienung

@Services Halten Sie Geschäftslogik und Aufrufmethode 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 hält, gibt es keine bemerkenswerte Spezialität, die diese Anmerkung bietet, aber wer weiß, Frühling kann einige zusätzliche Ausnahme in der Zukunft hinzufügen.


Was sonst?

Ähnlich wie oben könnte Spring in Zukunft zusätzliche Funktionalitäten hinzufügen @Service, @Controller und @Repository basierend auf ihren Überlappungskonventionen. Daher ist es immer eine gute Idee, die Konvention zu respektieren und sie im Einklang mit den Ebenen zu verwenden.


423
2017-07-24 06:43



Sie sind fast gleich - alle bedeuten, dass die Klasse eine Frühlingsbohne ist. @Service, @Repository und @Controller sind spezialisiert @Components. Sie können wählen, bestimmte Aktionen mit ihnen durchzuführen. Beispielsweise:

  • @Controller Bohnen werden von Spring-Mvc verwendet
  • @Repository Beans sind für die Persistenzausnahmeübersetzung geeignet

Eine andere Sache ist, dass Sie die Komponenten semantisch zu verschiedenen Layern zuweisen.

Eine Sache, die @Component Angebote sind, 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 {..}

Also alle Klassen kommentiert mit @ScheduledJob sind Frühlingsbohnen und zusätzlich sind sie als Quarzjobs registriert. Sie müssen nur Code bereitstellen, der die spezifische Anmerkung behandelt.


388
2017-07-26 09:16



@Component ist äquivalent zu

<bean>

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

Das bedeutet Service, Controller und Repository sind funktional gleich.

Die drei Anmerkungen werden zum Trennen verwendet "Lagen" in Ihrer Anwendung,

  • Controller machen nur Sachen wie Dispatching, Weiterleitung, Aufruf von Service-Methoden etc.
  • Service Hold Geschäftslogik, Berechnungen etc.
  • Repository sind die DAOs (Data Access Objects), sie greifen direkt auf die Datenbank zu.

Jetzt können Sie fragen, warum sie trennen: (Ich nehme an, Sie kennen AOP-Aspekt-orientierte Programmierung)

Nehmen wir an, Sie möchten nur die Aktivität der DAO-Schicht überwachen. Sie schreiben eine Aspect-Klasse (A-Klasse), die eine Protokollierung vor und nach jeder Methode Ihres DAO durchführt. Sie können dies mit AOP tun, da Sie drei verschiedene Layer haben und nicht gemischt sind.

So können Sie DAO "herum", "vor" oder "nach" den DAO-Methoden protokollieren. Sie könnten das tun, weil Sie überhaupt ein DAO hatten. Was du gerade erreicht hast ist Trennung von Anliegen oder Aufgaben.

Stellen Sie sich vor, es gäbe nur eine Annotation @Controller, dann hätte diese Komponente Dispatching, Geschäftslogik und Zugriff auf die Datenbank, alles gemischt, also schmutziger Code!

Oben erwähnt ist ein sehr häufiges Szenario, es gibt viel mehr Anwendungsfälle von warum drei Anmerkungen zu verwenden.


332
2018-05-23 05:15



Im Frühling @Component, @Service, @Controller, und @Repository sind Stereotyp Anmerkungen, die verwendet werden für:

@Controller: wo dein anfordern  Mapping von der Präsentationsseite fertig, d. h. die Präsentationsschicht wird nicht in eine andere Datei verschoben, zu der sie direkt geht @Controller Klasse und prüft auf angeforderten Pfad in @RequestMapping Annotation, die vor Methodenaufrufen geschrieben wird, falls erforderlich.

@Service: Alle Geschäftslogik ist hier d. H. Daten bezogene Berechnungen und all. Diese Annotation der Business-Schicht, in der unser Benutzer Persistenzmethode nicht direkt aufrufen, so dass diese Methode diese Annotation aufrufen wird. Es wird @Repository nach Benutzeranforderung anfordern

@Repository: Dies ist der Persistence-Layer (Datenzugriffsschicht) der Anwendung, mit dem Daten aus der Datenbank abgerufen wurden. d.h. 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 ein "Komponente". Solche Klassen sind   als Kandidaten für die automatische Erkennung bei der Verwendung betrachtet   Annotation-basierte Konfiguration und Klassenpfad-Scan.

Andere Annotationen auf Klassenebene können als a identifiziert werden   Komponente, typischerweise eine spezielle Art von Komponente: z.B. das   @Repository-Annotation oder AspectJs @ Aspect-Annotation.

enter image description here


188
2018-03-25 08:00



Spring 2.5 führt weitere stereotype Annotationen ein: @Component, @Service und @Controller. @Component dient als generischer Stereotyp für jede Spring-verwaltete Komponente; während @Repository, @Service und @Controller als Spezialisierungen von @Component für spezifischere Anwendungsfälle (z. B. in den Persistenz-, Dienst- und Präsentationsschichten) dienen. Dies bedeutet, dass Sie Ihre Komponentenklassen mit @Component annotieren können, aber indem Sie sie mit @Repository, @Service oder @Controller annotieren, eignen sich Ihre Klassen besser für die Verarbeitung durch Tools oder die Verknüpfung mit Aspekten. Diese Stereotyp-Annotationen sind beispielsweise ideale Ziele für Pointcuts. Natürlich ist es auch möglich, dass @Repository, @Service und @Controller zusätzliche Semantiken in zukünftigen Versionen des Spring Frameworks enthalten. Wenn Sie also eine Entscheidung zwischen der Verwendung von @Component oder @Service für Ihre Serviceebene treffen, ist @Service eindeutig die bessere Wahl. In ähnlicher Weise wird @Repository 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-Scan, verwaltete Komponenten und Schreiben von Konfigurationen mit Java  


59
2018-05-15 12:48



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

Du wirst das alles bemerkt haben @Repository,@Service oder @Controller sind mit kommentiert @Component. Also, können wir nur verwenden @Component für alle Komponenten für das automatische Scannen? Ja, Sie können und Spring scannt automatisch alle Komponenten mit @ Komponent annotiert.

Es funktioniert gut, aber keine gute Praxis, für die Lesbarkeit sollten Sie immer erklären @Repository,@Service oder @Controller für eine bestimmte Ebene, um den Code leichter lesbar zu machen.


51
2017-12-16 18:10



Gebrauch von @Service und @Repository Anmerkungen sind aus der Perspektive der Datenbankverbindung wichtig.

  1. Benutzen @Service für all Ihre Web-Service-Art von DB-Verbindungen
  2. Benutzen @Repository für alle gespeicherten proc DB-Verbindungen

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


40
2017-11-02 16:05



Unterschied zwischen @Component, @Service und @Repository

Der Hauptunterschied zwischen diesen Stereotypen besteht darin, dass sie für unterschiedliche Klassifikationen verwendet werden.

In einer Multi-Tier-Anwendung haben wir verschiedene Ebenen wie Präsentation, Service, Geschäft, Datenzugriff usw. Wenn eine Klasse von Spring zur automatischen Erkennung kommentiert werden soll, sollten wir das entsprechende Stereotyp wie folgt verwenden.

@Component - generisch und kann in der gesamten Anwendung verwendet werden.
@Service - Kommentieren Sie Klassen auf Service-Layer-Ebene.
@Repository - Kommentieren Sie Klassen in der Persistenzschicht, die als Datenbank-Repository fungiert.

Wenn sie technisch identisch sind, warum müssen wir diese dann auf verschiedenen Ebenen verwenden? Warum nicht dasselbe in allen Schichten verwenden? Zum Beispiel, wenn wir verwenden @Service In allen Layern werden alle Beans instanziiert und keine Probleme. Es gibt einen kleinen Unterschied, zum Beispiel zu beachten @Repository.

Der Postprozessor sucht automatisch nach allen Ausnahmeübersetzern (Implementierungen der PersistenceExceptionTranslator-Schnittstelle) und informiert alle mit der Option @Repository Annotation, damit die erkannten Übersetzer die entsprechende Übersetzung auf die ausgelösten Ausnahmen abfangen und anwenden können.

Ähnlich wie oben, kann Spring in Zukunft wählen, Wert für hinzuzufügen @Service, @Controller und @Repository basierend auf ihren Überlappungskonventionen. Für diesen zusätzlichen Vorteil ist es besser, die Konvention zu respektieren und sie in Übereinstimmung mit den Ebenen zu verwenden.

Anders als oben, in Bezug auf Scan-Auto-Erkennung, Abhängigkeitsinjektion für BeanDefinition @Component, @Service, @Repository, @Controller sind gleich.


31
2017-10-10 08:11



@Repository  @Bedienung und @Regler dienen als Spezialisierung von @Component für eine spezifischere Verwendung auf dieser Basis können Sie @Service zu @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.

24
2017-07-18 11:23