Ist die Spring-Annotation @Controller mit @Service identisch?


80

Ist die Frühlingsanmerkung @Controllerdieselbe wie @Service?

Ich habe eine Idee, @Controllerwelche zum URLZuordnen und Aufrufen von Geschäftslogik verwendet werden kann.

wird @Serviceverwendet, um Serviceklassen zu kommentieren, die Geschäftslogik enthalten.

Kann ich die Serviceklasse @Controlleranstelle von @Servicemit Anmerkungen versehen?

Antworten:


123

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.


3
Sehr schöne Erklärung. Ein Punkt zu erwähnen, (at) Controller-Klassen müssen nicht (at) RequestMapping haben, (at) RequestMapping kann auch auf Methodenebene sein.
Zeitnehmer

1
Kann ich sie in Einzelklassendefinition mischen? Oder ist es besser, sie als separate Klassen zu implementieren?
Kensai

37

Wenn man sich die Definitionen von aussehen @Controller, @ServiceAnmerkungen, dann werden Sie feststellen , dass diese spezielle Art von sind @ComponentAnmerkung.

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

Was ist der Unterschied?

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

Sie können diese Anmerkung nicht durch eine andere wie @Serviceoder @Repositoryersetzen, obwohl sie gleich aussieht. Der Dispatcher scannt die mit Anmerkungen versehenen Klassen @Controllerund erkennt darin enthaltene @RequestMappingAnmerkungen. Sie können nur @RequestMappingfür @Controllerkommentierte Klassen verwenden.


@Bedienung

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


7

Nein, @Controllerist 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 @ServiceAnmerkung wird in Ihrer Service-Schicht verwendet und @Controllergilt für Spring MVC-Controller in Ihrer Präsentationsschicht. Ein hat @Controllernormalerweise eine URL-Zuordnung und wird durch eine Webanforderung ausgelöst.


5

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


1

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.


0

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.


0

Vom Frühling in Aktion

Wie Sie sehen können, ist diese Klasse mit @Controller versehen. @Controller allein macht nicht viel. Der Hauptzweck besteht darin, diese Klasse als Komponente für das Scannen von Komponenten zu identifizieren. Da HomeController mit @Controller kommentiert ist, erkennt Spring beim Komponentenscannen dies automatisch und erstellt eine Instanz von HomeController als Bean im Spring-Anwendungskontext.

Tatsächlich erfüllen eine Handvoll anderer Anmerkungen (einschließlich @Component, @Service und @Repository) einen ähnlichen Zweck wie @Controller. Sie hätten HomeController genauso effektiv mit diesen anderen Anmerkungen versehen können, und es hätte immer noch genauso funktioniert. Die Wahl von @Controller beschreibt jedoch eher die Rolle dieser Komponente in der Anwendung.


0

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


0
  • Der Controller übernimmt die Navigation zwischen den verschiedenen Ansichten. Ihre Zuordnungsanforderungszuordnungen werden mit Hilfe des Controllers verarbeitet.
  • Der Service interagiert direkt mit dem Repository, in dem normalerweise die Geschäftslogik ausgeführt wird. Sie können auf der Serviceebene hinzufügen, löschen, entfernen usw.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.