Est-ce que L'annotation du ressort @Controller est la même que @Service?

est-ce que L'annotation de printemps @Controller est la même que @Service ?

j'ai une idée de @Controller qui peut être utilisé pour URL cartographie et invoquer la logique d'affaires.

tandis que @Service sert à annoter la classe de service qui contient la logique commerciale.

puis-je utiliser @Controller au lieu de @Service pour annoter la classe de Service?

54
demandé sur subodh 2013-04-10 14:13:10

6 réponses

Non, ils sont assez différents les uns des autres.

les deux sont des spécialisations différentes de @Component annotation (en pratique, ce sont deux implémentations différentes de la même interface) donc les deux peuvent être découverts par le scan classpath (si vous le déclarez dans votre configuration XML)

@Service l'annotation est utilisée dans votre couche de service et annote les classes qui effectuent le service tâches, souvent vous ne l'utilisez pas, mais dans de nombreux cas, vous utilisez cette annotation pour représenter une meilleure pratique. Par exemple, vous pouvez appeler directement une classe DAO pour persister un objet dans votre base de données, mais c'est horrible. Il est assez bon d'appeler une classe de service qui appelle un DAO. C'est une bonne chose pour effectuer la séparation des préoccupations modèle.

@Controller l'annotation est une annotation utilisée dans le cadre MVC du ressort (la composante du cadre du ressort). utilisé pour mettre en œuvre L'Application Web). @Contrôleur annotation indique qu'une classe particulière remplit le rôle d'un contrôleur. L'annotation @Controller agit comme un stéréotype pour la classe annotée, indiquant son rôle. Le répartiteur scanne ces classes annotées pour les méthodes cartographiées et détecte les annotations @RequestMapping.

donc, en regardant l'architecture MVC du printemps, vous avez une classe DispatcherServlet (que vous déclarez dans votre configuration XML) qui représente contrôleur frontal qui envoie toutes les requêtes HTTP vers les classes de contrôleur appropriées (annoté par @Controller). Cette classe exécute la logique commerciale (et peut appeler les services) par sa méthode. Ces classes (ou ses méthodes) sont typiquement annotées aussi avec @RequestMapping annotation qui spécifie ce que la requête HTTP est traitée par le contrôleur et par sa méthode.

par exemple:

@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();
    }

cette classe est une contrôleur.

cette classe gère toute la requête HTTP vers" /appointments "" folder "et en particulier la méthode get est la méthode appelée pour gérer toute la requête HTTP GET vers le dossier"/appointments".

j'espère que maintenant c'est plus clair pour vous.

88
répondu AndreaNobili 2016-02-05 23:40:11

si vous regardez les définitions de @Controller , @Service annotations, Alors vous trouverez qu'il s'agit d'un type spécial de @Component annotation.

@Component
public @interface Service {
    ….
}

@Component
public @interface Controller {
    …
}

alors quelle est la différence?

@Controller

le @Controller annotation indique qu'une classe particulière remplit le rôle d'un contrôleur. L'annotation @Controller Sert de stéréotype pour la classe annotée, indiquant son rôle.

Qu'y a-t-il de spécial sur @Controller?

vous ne pouvez pas échanger cette annotation avec une autre comme @Service ou @Repository , même si elles semblent identiques. Le répartiteur scanne les classes annotées avec @Controller et détecte @RequestMapping annotations à l'intérieur d'eux. Vous ne pouvez utiliser @RequestMapping sur @Controller classes annotées.


@Service

@Services tenir la logique métier et l'appel de la méthode dans le dépôt de la couche.

Qu'y a-t-il de spécial dans @Service?

mis à part le fait qu'il est utilisé pour indiquer qu'il détient la logique d'affaires, il n'y a pas de spécialité notable que cette annotation fournit, mais qui sait, le printemps peut ajouter un peu plus exceptionnelle à l'avenir.

réponse liée: Quelle est la différence entre les annotations @Component, @Repository & @Service au printemps?

23
répondu Raman Sahasi 2018-05-22 03:59:22

Non, @Controller n'est pas la même chose que @Service , bien qu'ils soient tous les deux des spécialisations de @Component , ce qui fait d'eux deux des candidats pour la découverte par balayage de chemin de classe. L'annotation @Service est utilisée dans votre couche de service, et @Controller est pour les contrôleurs MVC de printemps dans votre couche de présentation. Un @Controller aurait normalement une correspondance D'URL et serait déclenché par une requête web.

7
répondu NilsH 2013-04-10 10:21:00

@Service vs @Controller

@Service : la classe est un "Service d'Affaires de Façade" (dans le Noyau J2EE modèles de sens), ou quelque chose de similaire.

@Controller: indique qu'une classe annotée est un "Controller" (par exemple un contrôleur web).

----------trouver des notes utiles sur les principaux stéréotypes http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@Composant de l'interface

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

indique qu'une classe annotée est un composant. Ces classes sont considérées comme des candidats à la détection automatique lorsqu'on utilise la configuration basée sur l'annotation et la numérisation classpath.

d'autres annotations au niveau de la classe peuvent être considérées comme identifiant également un composant, typiquement un type particulier de Composant: par exemple l'annotation @Repository ou l'annotation @Aspect D'AspectJ.

@Contrôleur d'interface

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

indique qu'une classe annotée est un" Controller " (par exemple un contrôleur web).

cette annotation Sert de spécialisation de @Component, permettant aux classes d'implémentation d'être autodétectées par classpath scanning. Il est généralement utilisé en combinaison avec les méthodes de handler annoté basé sur L'annotation RequestMapping.

@ service d'interface

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

indique qu'une classe annotée est un" Service", défini à l'origine par une conception axée sur le domaine (Evans, 2003) comme " une opération offerte comme une interface unique dans le modèle, sans état encapsulé." Peut également indiquer qu'une classe est une "façade de service D'affaires" (au sens de J2EE patterns), ou quelque chose de similaire. Cette annotation est un stéréotype et chaque équipe peut affiner sa sémantique et l'utiliser comme il convient.

cette annotation Sert de spécialisation de @Component, permettant aux classes d'implémentation d'être autodétectées par classpath scanning.

@dépôt d'interface

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

indique qu'une classe annotée est un "dépôt", défini à l'origine par la conception par Domaine (Evans, 2003) comme "un mécanisme d'encapsulation de stockage, la récupération et le comportement de recherche qui émule une collection d'objets". Les équipes qui mettent en œuvre des modèles J2EE traditionnels tels que "Data Access Object" peuvent également appliquer ce stéréotype aux classes DAO, bien qu'il faille veiller à bien comprendre la distinction entre les objets D'accès aux données et les dépôts de type DDD avant de le faire. Cette annotation est un stéréotype universel et les équipes individuelles peuvent restreindre leur sémantique et l'utiliser au besoin.

une classe ainsi annotée est éligible à la traduction D'exception de données de printemps lorsqu'elle est utilisée en conjonction avec un PersistenceExceptionTranslationPostprocessor. La classe annotée est également clarifiée quant à son rôle dans l'architecture d'application globale à des fins d'outillage, d'aspects, etc.

à partir du printemps 2.5, cette annotation sert également de spécialisation de @Component, permettant aux classes d'implémentation d'être autodétectées par classpath scanning.

3
répondu Kanthishere 2016-07-03 06:51:39

j'ai déjà répondu à une question similaire ici voici le lien

Pas de deux sont différents.

annotation @Service utiliser pour d'autres fins et @Controller pour d'autres. En fait, les annotations Spring @Component, @Service, @Repository et @Controller sont utilisées pour la détection automatique des haricots en utilisant classpath scan dans Spring framework, mais elles ne sont pas ne veut pas dire que toutes les fonctionnalités sont les mêmes. @Service: Il indique la classe annotée est un élément de Service dans la couche affaires.

@Controller: Annotated class indique qu'il s'agit d'un composant de controller, principalement utilisé à la couche de présentation.

1
répondu Yasir Shabbir Choudhary 2017-05-23 11:47:16

Non vous ne pouvez pas ils sont différents. Lorsque l'application a été déployée votre contrôleur de mappages serait complètement foireuse par exemple.

Pourquoi voulez-vous de toute façon, un contrôleur est pas un service, et vice versa.

0
répondu NimChimpsky 2013-04-10 10:17:58