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
,@Service
und@Repository
im Allgemeinen. Sie werden gescannt, weil sie selbst mit Anmerkungen versehen sind@Component
.
Werfen Sie einen Blick auf @Controller
, @Service
und @Repository
Annotation Definitionen:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Daher ist es nicht falsch, das zu sagen @Controller
, @Service
und @Repository
es handelt sich um spezielle Arten von @Component
Anmerkungen. <context:component-scan>
nimmt sie auf und registriert ihre folgenden Klassen als Bohnen, als ob sie mit Anmerkungen versehen wären @Component
.
Spezielle Typanmerkungen werden ebenfalls gescannt, da sie selbst mit @Component
Anmerkungen versehen sind, was bedeutet, dass sie auch @Component
s sind. Wenn wir unsere eigene benutzerdefinierte Anmerkung definieren und sie mit Anmerkungen versehen @Component
, wird sie auch mit gescannt<context:component-scan>
@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 @Repository
die Aufgabe darin, plattformspezifische Ausnahmen abzufangen und sie als eine der einheitlichen, nicht aktivierten Ausnahmen von Spring erneut auszulösen. Dafür erhalten wir 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, @Repository
sodass plattformspezifische Ausnahmen abgefangen und dann als eine der ungeprüften Datenzugriffsausnahmen von Spring erneut ausgelöst werden.
@Regler
Die @Controller
Anmerkung gibt an, dass eine bestimmte Klasse die Rolle eines Controllers übernimmt. Die @Controller
Annotation fungiert als Stereotyp für die annotierte Klasse und gibt ihre Rolle an.
Was ist das Besondere an @Controller?
Wir können diese Anmerkung nicht durch eine andere wie @Service
oder @Repository
ersetzen, obwohl sie gleich aussieht. Der Dispatcher durchsucht die @Controller
mit @RequestMapping
Anmerkungen versehenen Klassen und erkennt Methoden, die mit Anmerkungen versehen sind. Wir können verwenden @RequestMapping
nur auf / in jenen Methoden , deren Klassen mit annotiert , @Controller
und es wird nicht funktionieren mit @Component
, @Service
, @Repository
etc ...
Hinweis: Wenn eine Klasse bereits als Bohne durch jede andere Methode registriert ist, wie durch @Bean
oder durch @Component
, @Service
usw ... Anmerkungen, dann @RequestMapping
können ausgewählt werden , wenn die Klasse auch mit Anmerkungen versehen ist @RequestMapping
Anmerkung. Aber das ist ein anderes Szenario.
@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
, @Controller
und @Repository
auf der Grundlage ihrer Schichtung Konventionen. Daher ist es immer eine gute Idee, die Konvention zu respektieren und sie in Übereinstimmung mit Ebenen zu verwenden.