85 votes

L'annotation Spring @Controller est-elle identique à @Service ?

L'annotation Spring est-elle @Controller même que @Service ?

J'ai une idée sur @Controller qui peut être utilisé pour URL le mappage et l'invocation de la logique d'entreprise.

alors que @Service utilisé pour annoter la classe de service qui contient la logique commerciale.

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

139voto

AndreaNobili Points 2673

Non, ils sont très différents les uns des autres.

Les deux sont des spécialisations différentes de la @Composant (en pratique, il s'agit de deux implémentations différentes de la même interface), de sorte qu'elles peuvent toutes deux être découvertes par l'analyse du chemin de classe (si vous le déclarez dans votre configuration XML).

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

@Contrôleur est une annotation utilisée dans le cadre Spring MVC (le composant du cadre Spring utilisé pour mettre en œuvre une application Web). L'annotation @Controller indique qu'une classe particulière joue le rôle de contrôleur. L'annotation @Controller agit comme un stéréotype pour la classe annotée, indiquant son rôle. Le répartiteur analyse ces classes annotées à la recherche de méthodes mappées et détecte les annotations @RequestMapping.

En examinant l'architecture Spring MVC, vous avez une classe DispatcherServlet (que vous déclarez dans votre configuration XML) qui représente un contrôleur frontal qui dispatche toutes les requêtes HTTP vers les classes de contrôleurs appropriées (annotées par @Controller). Cette classe exécute la logique commerciale (et peut appeler les services) par ses méthodes. Ces classes (ou leurs méthodes) sont typiquement annotées aussi par @Controller. @RequestMapping qui spécifie quelle 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 un contrôleur.

Cette classe traite toutes les requêtes HTTP vers le dossier "/appointements" et en particulier la méthode get est la méthode appelée pour traiter toutes les requêtes HTTP GET vers le dossier "/appointements".

J'espère que les choses sont maintenant plus claires pour vous.

42voto

Raman Sahasi Points 14959

Si vous regardez les définitions de @Controller , @Service vous constaterez qu'il s'agit d'un type particulier d'annotations. @Component annotation.

@Component
public @interface Service {
    ….
}

@Component
public @interface Controller {
    …
}

Quelle est la différence ?

@Contrôleur

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

Qu'est-ce que @Controller a de particulier ?

Vous ne pouvez pas remplacer cette annotation par une autre du même type. @Service o @Repository même s'ils se ressemblent. Le répartiteur analyse les classes annotées avec @Controller et détecte @RequestMapping annotations à l'intérieur de celles-ci. Vous ne pouvez utiliser que des @RequestMapping sur @Controller classes annotées.


@Service

@Services contenir la logique métier et appeler la méthode dans la couche référentiel.

Quelle est la particularité de @Service ?

Hormis le fait qu'elle est utilisée pour indiquer qu'elle contient la logique métier, cette annotation n'apporte aucune spécialité notable, mais qui sait, Spring pourrait ajouter quelques exceptions supplémentaires à l'avenir.

Réponse liée : Quelle est la différence entre les annotations @Component, @Repository et @Service dans Spring ?

7voto

NilsH Points 7340

Non, @Controller n'est pas la même chose que @Service bien qu'il s'agisse dans les deux cas d'une spécialisation de @Component ce qui les rend tous deux candidats à la découverte par l'analyse des chemins d'accès. Les @Service est utilisée dans votre couche de service, et l'annotation @Controller est pour les contrôleurs Spring MVC dans votre couche de présentation. A @Controller aurait typiquement une correspondance URL et serait déclenchée par une requête web.

5voto

Kanthishere Points 1

@Service vs @Contrôleur

@Service : la classe est une "Business Service Facade" (au sens des modèles Core J2EE), ou quelque chose de similaire.

@Controller : indique qu'une classe annotée est un "contrôleur" (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

@interface Composant

  @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 à l'autodétection lors de l'utilisation de la configuration basée sur les annotations et de l'analyse du chemin de classe.

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

@interface Contrôleur

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

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

Cette annotation est une spécialisation de @Component, permettant aux classes d'implémentation d'être autodétectées par l'analyse du chemin de classe. Elle est généralement utilisée en combinaison avec des méthodes de traitement annotées basées sur l'annotation RequestMapping.

@ interface Service

@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 Domain-Driven Design (Evans, 2003) comme "une opération proposée comme une interface autonome dans le modèle, sans état encapsulé". Cette annotation peut également indiquer qu'une classe est une "Business Service Facade" (au sens des modèles Core J2EE), ou quelque chose de similaire. Cette annotation est un stéréotype à usage général et les équipes individuelles peuvent restreindre leur sémantique et l'utiliser comme il convient.

Cette annotation est une spécialisation de @Component, permettant aux classes d'implémentation d'être autodétectées par l'analyse du chemin de classe.

@interface Repository

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

Indique qu'une classe annotée est un "Référentiel", défini à l'origine par Domain-Driven Design (Evans, 2003) comme "un mécanisme d'encapsulation du stockage, de la récupération et de la 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 prendre soin de comprendre la distinction entre les objets d'accès aux données et les référentiels de type DDD avant de le faire. Cette annotation est un stéréotype d'usage général et les équipes individuelles peuvent restreindre leur sémantique et l'utiliser comme il convient.

Une classe ainsi annotée est éligible à la traduction des Spring DataAccessException 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 globale de l'application à des fins d'outillage, d'aspects, etc.

Depuis Spring 2.5, cette annotation sert également de spécialisation de @Component, ce qui permet aux classes d'implémentation d'être détectées automatiquement par l'analyse du chemin de classe.

1voto

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

Non, les deux sont différents.

L'annotation @Service est utilisée à d'autres fins et l'annotation @Controller à d'autres fins. En fait, les annotations Spring @Component, @Service, @Repository et @Controller sont utilisées pour la détection automatique des beans à l'aide du classpath scan dans le framework Spring, mais cela ne signifie pas que toutes les fonctionnalités sont les mêmes. mais cela ne signifie pas que toutes les fonctionnalités sont identiques. @Service : Il indique que la classe annotée est un composant de service dans la couche métier.

@Contrôleur : La classe annotée indique qu'il s'agit d'un composant de contrôleur, principalement utilisé au niveau de la couche de présentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X