Nein, sie sind ziemlich unterschiedlich voneinander.
Bei beiden handelt es sich um unterschiedliche Spezialisierungen der @ Component- Annotation (in der Praxis handelt es sich um zwei verschiedene Implementierungen derselben Schnittstelle), sodass beide durch das Scannen von Klassenpfaden erkannt werden können (wenn Sie dies in Ihrer XML-Konfiguration deklarieren).
Die @ Service- Annotation wird in Ihrer Service-Schicht verwendet und kommentiert Klassen, die Serviceaufgaben ausführen. Oft verwenden Sie sie nicht, aber in vielen Fällen verwenden Sie diese Annotation, um eine bewährte Methode darzustellen. Sie könnten beispielsweise direkt eine DAO-Klasse aufrufen, um ein Objekt in Ihrer Datenbank zu speichern, aber das ist schrecklich. Es ist ziemlich gut, eine Serviceklasse anzurufen, die ein DAO aufruft. Dies ist eine gute Sache, um das Muster der Trennung von Bedenken durchzuführen.
Die @ Controller- Annotation ist eine Annotation, die im Spring MVC-Framework (der Komponente von Spring Framework, die zum Implementieren der Webanwendung verwendet wird) verwendet wird. Die Annotation @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 ihre Rolle an. Der Dispatcher durchsucht solche mit Anmerkungen versehenen Klassen nach zugeordneten Methoden und erkennt @ RequestMapping-Anmerkungen.
Wenn Sie sich also die Spring MVC-Architektur ansehen, haben Sie eine DispatcherServlet-Klasse (die Sie in Ihrer XML-Konfiguration deklarieren), die einen Front-Controller darstellt, der die gesamte HTTP-Anforderung an die entsprechenden Controller-Klassen sendet (kommentiert von @Controller). Diese Klasse führt die Geschäftslogik (und kann die Dienste aufrufen) anhand ihrer Methode aus. Diese Klassen (oder ihre Methoden) werden normalerweise auch mit der Annotation @RequestMapping versehen , die angibt, welche HTTP-Anforderung vom Controller und von seiner Methode verarbeitet wird.
Zum Beispiel:
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
private final AppointmentBook appointmentBook;
@Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
}
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return appointmentBook.getAppointmentsForToday();
}
Diese Klasse ist ein Controller.
Diese Klasse verarbeitet alle HTTP-Anforderungen in Richtung "/ Termine" "Ordner", und insbesondere die Methode get ist die Methode, die aufgerufen wird, um alle GET-HTTP-Anforderungen in Richtung des Ordners "/ Termine" zu verarbeiten.
Ich hoffe, dass es Ihnen jetzt klarer wird.
Wenn man sich die Definitionen von aussehen
@Controller
,@Service
Anmerkungen, dann werden Sie feststellen , dass diese spezielle Art von sind@Component
Anmerkung.@Component public @interface Service { …. }
@Component public @interface Controller { … }
Was ist der Unterschied?
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?
Sie können diese Anmerkung nicht durch eine andere wie
@Service
oder@Repository
ersetzen, obwohl sie gleich aussieht. Der Dispatcher scannt die mit Anmerkungen versehenen Klassen@Controller
und erkennt darin enthaltene@RequestMapping
Anmerkungen. Sie können nur@RequestMapping
für@Controller
kommentierte Klassen verwenden.@Services
Halten Sie die Geschäftslogik und die 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 enthält, gibt es keine erkennbare Besonderheit, die diese Anmerkung bietet, aber wer weiß, der Frühling kann in Zukunft einige zusätzliche Ausnahmen hinzufügen.
Verknüpfte Antwort: Was ist der Unterschied zwischen den Anmerkungen @Component, @Repository und @Service im Frühjahr?
quelle
Nein,
@Controller
ist nicht dasselbe wie@Service
, obwohl beide Spezialisierungen von sind@Component
, was sie beide zu Kandidaten für die Entdeckung durch das Scannen von Klassenpfaden macht. Die@Service
Anmerkung wird in Ihrer Service-Schicht verwendet und@Controller
gilt für Spring MVC-Controller in Ihrer Präsentationsschicht. Ein hat@Controller
normalerweise eine URL-Zuordnung und wird durch eine Webanforderung ausgelöst.quelle
@Service vs @Controller
@Service: Klasse ist eine "Business Service Facade" (im Sinne von Core J2EE-Mustern) oder ähnliches.
@Controller: Gibt an, dass eine mit Anmerkungen versehene Klasse ein "Controller" ist (z. B. ein Webcontroller).
---------- Nützliche Hinweise zu wichtigen Stereotypen finden http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
@ Interface-Komponente
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented public @interface Component
Gibt an, dass eine mit Anmerkungen versehene Klasse eine Komponente ist. Solche Klassen werden als Kandidaten für die automatische Erkennung betrachtet, wenn annotationsbasierte Konfiguration und Klassenpfad-Scan verwendet werden.
Andere Annotationen auf Klassenebene können ebenfalls als identifizierend für eine Komponente angesehen werden, typischerweise eine spezielle Art von Komponente: z. B. die Annotation @Repository oder die Annotation @Aspect von AspectJ.
@ Interface Controller
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Controller
Gibt an, dass eine mit Anmerkungen versehene Klasse ein "Controller" ist (z. B. ein Web-Controller).
Diese Annotation dient als Spezialisierung von @Component, sodass Implementierungsklassen durch das Scannen von Klassenpfaden automatisch erkannt werden können. Es wird normalerweise in Kombination mit kommentierten Handlermethoden verwendet, die auf der Annotation RequestMapping basieren.
@ Interface Service
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Service
Gibt an, dass eine mit Anmerkungen versehene Klasse ein "Dienst" ist, der ursprünglich von Domain-Driven Design (Evans, 2003) als "eine Operation definiert wurde, die als Schnittstelle angeboten wird, die im Modell allein steht und keinen gekapselten Status aufweist". 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.
Diese Annotation dient als Spezialisierung von @Component und ermöglicht die automatische Erkennung von Implementierungsklassen durch das Scannen von Klassenpfaden.
@interface Repository
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Repository
Gibt an, dass eine mit Anmerkungen versehene Klasse ein "Repository" ist, das ursprünglich von Domain-Driven Design (Evans, 2003) als "Mechanismus zum Einkapseln von Speicher-, Abruf- und Suchverhalten, das eine Sammlung von Objekten emuliert" definiert wurde. Teams, die traditionelle J2EE-Muster wie "Datenzugriffsobjekt" implementieren, können dieses Stereotyp auch auf DAO-Klassen anwenden. Dabei sollte jedoch darauf geachtet werden, die Unterscheidung zwischen Datenzugriffsobjekt- und DDD-Repositorys zu verstehen. Diese Anmerkung ist ein allgemeines Stereotyp, und einzelne Teams können ihre Semantik einschränken und gegebenenfalls verwenden.
Eine so kommentierte Klasse kann in Verbindung mit einem PersistenceExceptionTranslationPostProcessor für die Spring DataAccessException-Übersetzung verwendet werden. Die mit Anmerkungen versehene Klasse wird auch hinsichtlich ihrer Rolle in der gesamten Anwendungsarchitektur zum Zweck von Werkzeugen, Aspekten usw. geklärt.
Ab Spring 2.5 dient diese Annotation auch als Spezialisierung von @Component, sodass Implementierungsklassen durch das Scannen von Klassenpfaden automatisch erkannt werden können.
quelle
Ich habe hier bereits eine ähnliche Frage beantwortet. Hier ist der Link
Nein, beide sind unterschiedlich.
@ Service Annotation wird für andere Zwecke und @ Controller für andere Zwecke verwendet. Tatsächlich werden die Annotationen Spring @Component, @Service, @Repository und @Controller für die automatische Bean-Erkennung mithilfe des Klassenpfad-Scans im Spring-Framework verwendet. Dies bedeutet jedoch nicht, dass alle Funktionen gleich sind. @Service: Gibt an, dass die mit Anmerkungen versehene Klasse eine Servicekomponente in der Geschäftsschicht ist.
@Controller: Die mit Anmerkungen versehene Klasse gibt an, dass es sich um eine Controller-Komponente handelt, die hauptsächlich auf Präsentationsebene verwendet wird.
quelle
Nein, du kannst nicht, sie sind anders. Wenn die App bereitgestellt wurde, wurden beispielsweise Ihre Controller-Zuordnungen blockiert.
Warum möchten Sie überhaupt, ein Controller ist kein Dienst und umgekehrt.
quelle
Vom Frühling in Aktion
quelle
Sie können einen @service als @Controller deklarieren .
Sie können einen @ Controller NICHT als @ Service deklarieren
@Bedienung
Es ist regelmäßig. Sie deklarieren nur die Klasse als Komponente.
@Regler
Es ist etwas spezieller als Component. Der Dispatcher sucht hier nach @RequestMapping . Eine mit @Controller kommentierte Klasse kann daher zusätzlich URLs deklarieren, über die APIs aufgerufen werden
quelle
quelle