2321 votes

Quelle est la différence entre les annotations @Component, @Repository & @Service dans Spring ?

Pouvez-vous utiliser les annotations @Component, @Repository, et @Service de manière interchangeable dans Spring ou fournissent-elles une fonctionnalité spécifique en plus de servir de dispositif de notation?

En d'autres termes, si j'ai une classe Service et que je change son annotation de @Service à @Component, va-t-elle continuer à fonctionner de la même manière?

L'annotation influence-t-elle également le comportement et la fonctionnalité de la classe?

12 votes

Étant un développeur avec une expérience chez Microsoft, je me souviens de la définition sémantique des services dans l'ancien framework MS SmartClientSoftwareFactory (maintenant un ancien framework complexe pour les applications de bureau distribuées). Cette définition (bien documentée par Rich Newman) a défini les services comme des objets réutilisables sans état, de préférence avec une portée singleton, utilisés pour effectuer des opérations de logique métier sur d'autres objets passés en tant qu'arguments. J'ai tendance à voir les services Spring de la même manière.

3 votes

Peu importe!! Peu importe ce qui fonctionne pour vous :) J'ai toujours détesté cela à propos de Spring qu'ils ont toujours tendance à définir des "règles" pour vous, qui n'ajoutent qu'une valeur triviale à votre application. Sans oublier que Spring vient avec une énorme pile de ses propres.

44 votes

@TriCore Sprting est un cadre, définir "règles" pour vous est son travail :)

1652voto

stivlo Points 28997

De Documentation Spring :

L'annotation @Repository est un marqueur pour toute classe qui remplit le rôle ou le stéréotype d'un référentiel (également connu sous le nom d'objet d'accès aux données ou DAO). Parmi les utilisations de ce marqueur figure la traduction automatique des exceptions, comme décrit dans Traduction des Exceptions.

Spring fournit d'autres annotations de stéréotype : @Component, @Service et @Controller. @Component est un stéréotype générique pour tout composant géré par Spring. @Repository, @Service et @Controller sont des spécialisations de @Component pour des cas d'utilisation plus spécifiques (dans les couches de persistance, de service et de présentation, respectivement). Par conséquent, vous pouvez annoter vos classes de composants avec @Component, mais en les annotant avec @Repository, @Service ou @Controller à la place, vos classes conviennent mieux au traitement par des outils ou à l'association avec des aspects.

Par exemple, ces annotations de stéréotype sont des cibles idéales pour des pointcuts. @Repository, @Service et @Controller peuvent également porter des sémantiques supplémentaires dans les versions futures du Framework Spring. Ainsi, si vous devez choisir entre l'utilisation de @Component ou @Service pour votre couche de service, @Service est clairement le meilleur choix. De la même manière, comme indiqué précédemment, @Repository est déjà pris en charge en tant que marqueur pour la traduction automatique des exceptions dans votre couche de persistance.

Annotation

Sens

@Component

stéréotype générique pour tout composant géré par Spring

@Repository

stéréotype pour la couche de persistance

@Service

stéréotype pour la couche de service

@Controller

stéréotype pour la couche de présentation (spring-mvc)

6 votes

Est-ce que cela aurait du sens d'ajouter @Controller (ou @Component) à un @WebServlet ? Ce n'est pas un contrôleur Spring MVC, mais c'est le plus proche conceptuellement. Et les filtres de servlets ?

1 votes

Qu'est-ce que "@Repository est déjà pris en charge en tant que marqueur pour la traduction automatique des exceptions dans votre couche de persistance." signifie?

11 votes

Il s'agit du fait que ces annotations sont de bonnes cibles pour l'AOP, et même si les autres annotations ne définissent pas encore de point de coupe, elles pourraient le faire à l'avenir. En revanche, @Repository est déjà une cible pour un point de coupe à l'heure actuelle. Ce point de coupe est utilisé pour les traductions d'exceptions, c'est-à-dire pour traduire des exceptions spécifiques à la technologie en exceptions Spring plus génériques, afin d'éviter un couplage trop serré.

446voto

Bozho Points 273663

Ils sont presque les mêmes - tous signifient que la classe est un bean Spring. @Service, @Repository et @Controller sont des @Component spécialisés. Vous pouvez choisir d'effectuer des actions spécifiques avec eux. Par exemple :

  • Les beans @Controller sont utilisés par spring-mvc
  • Les beans @Repository sont éligibles pour la traduction des exceptions de persistance

Autre chose est que vous désignez les composants sémantiquement à différentes couches.

Une chose que @Component offre est que vous pouvez annoter d'autres annotations avec elle, et ensuite les utiliser de la même manière que @Service.

Par exemple, récemment j'ai fait :

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Ainsi, toutes les classes annotées avec @ScheduledJob sont des beans Spring et en plus de cela sont enregistrées en tant qu'emplois Quartz. Vous devez simplement fournir du code qui gère l'annotation spécifique.

1 votes

@Component signifie simplement un bean spring, a-t-il une autre utilité ?

23 votes

Les beans @Component sont automatiquement détectables par le conteneur Spring. Vous n'avez pas besoin de définir le bean dans le fichier de configuration, il sera automatiquement détecté au moment de l'exécution par Spring.

1 votes

I'm quite fond of the generic @Component... especially in combo with @Scope( proxyMode = ScopedProxyMode.//MODE)

400voto

Oliver Points 500

@Component est équivalent à

@Service, @Controller, @Repository = {@Component + quelques fonctionnalités spéciales supplémentaires}

Cela signifie que Service, Le Controller et le Repository sont fonctionnellement les mêmes.

Les trois annotations sont utilisées pour séparer les "couches" de votre application,

  • Les contrôleurs font des choses comme la répartition, la redirection, l'appel de méthodes de service, etc.
  • Les services contiennent la logique métier, les calculs, etc.
  • Les référentiels sont les DAO (Data Access Objects), ils accèdent directement à la base de données.

Maintenant, vous pouvez vous demander pourquoi les séparer : (Je suppose que vous connaissez la POA - Programmation Orientée Aspect)

Disons que vous souhaitez surveiller l'activité de la couche DAO uniquement. Vous allez écrire une classe Aspect qui fait un journal avant et après chaque méthode de votre DAO invoquée, vous pouvez le faire en utilisant la POA car vous avez trois couches distinctes et ne sont pas mélangées.

Vous pouvez donc journaliser les méthodes DAO "autour", "avant" ou "après" l'appel des méthodes DAO. Vous pourriez le faire parce que vous aviez un DAO en premier lieu. Ce que vous venez de réaliser est la séparation des préoccupations ou des tâches.

Imaginez s'il n'y avait qu'une seule annotation @Controller, alors ce composant aurait la répartition, la logique métier et l'accès à la base de données tout mélangé, donc du code sale !

Ce qui précède est un scénario très courant, il existe de nombreux autres cas d'utilisation pour expliquer pourquoi utiliser trois annotations.

10 votes

J'ai une question fondamentale - les annotations sont-elles utilisées par le mécanisme Spring ou servent-elles simplement au programmeur pour se souvenir de ce que font ces morceaux de code?

29 votes

@user107986 Ils sont principalement destinés au programmeur pour se rappeler des couches de l'application. Cependant @Respository a également une fonctionnalité de traduction automatique des exceptions. Par exemple, lorsqu'une exception se produit dans un @Repository, il y a généralement un gestionnaire pour cette exception et il n'est pas nécessaire d'ajouter des blocs try catch dans la classe DAO. Il est utilisé en conjonction avec PersistenceExceptionTranslationPostProcessor.

0 votes

Aussi, bien que les annotations fonctionnent actuellement de la même manière, il est possible qu'une fonctionnalité spécifique pour un attribut donné soit ajoutée à l'avenir.

236voto

Harshal Patil Points 1379

En Spring @Component, @Service, @Controller et @Repository sont des annotations de stéréotype qui sont utilisées pour :

@Controller: où votre demande mapping de la page de présentation est faite c'est-à-dire que la couche de présentation n'ira pas vers un autre fichier, elle ira directement vers la classe @Controller et vérifiera le chemin demandé dans l'annotation @RequestMapping qui est écrite avant les appels de méthode selon les besoins.

@Service: Toute la logique métier est ici c'est-à-dire les calculs liés aux données et tout cela. Cette annotation de la couche métier dans laquelle notre utilisateur n'appelle pas directement la méthode persistante alors il appellera cette méthode en utilisant cette annotation. Il demandera @Repository selon la demande de l'utilisateur

@Repository: Il s'agit de la couche de persistance (couche d'accès aux données) de l'application qui est utilisée pour obtenir des données de la base de données. c'est-à-dire toutes les opérations liées à la base de données sont effectuées par le dépôt.

@Component - Annoter vos autres composants (par exemple les classes de ressources REST) avec un stéréotype de composant.

Indique qu'une classe annotée est un "composant". Ces classes sont considérées comme des candidats à la détection automatique lors de l'utilisation de la configuration basée sur les annotations et de l'analyse du classpath.

D'autres annotations au niveau de la classe peuvent également être considérées pour identifier un composant également, généralement un type spécial de composant : par exemple l'annotation @Repository ou l'annotation @Aspect de AspectJ.

description de l'image

27 votes

Ces réponses sont toutes bonnes et tout, mais je suis assez sûr que ce que la plupart d'entre nous veulent, ce sont des exemples de code des fonctionnalités que les composants comme le service offrent, que nous pouvons mettre plus concrètement dans notre tête plutôt que juste une description générale comme "la logique métier" appartient à cet objet. Sinon, nous supposons toujours "oh c'est génial et tout mais je peux toujours appliquer le même code au composant"

2 votes

Ne toute la logique métier ne devrait aller dans les services! Les services, en termes de DDD, ne devraient contenir que la logique métier qui affecte plus d'une entité. Voir réponse stackoverflow.com/a/41358034/238134

0 votes

@deamon Oui, mais cela dépend de l'approche des développeurs

78voto

Ajit Singh Points 406

Spring 2.5 introduit d'autres annotations de stéréotype : @Component, @Service et @Controller. @Component sert de stéréotype générique pour n'importe quel composant géré par Spring ; tandis que @Repository, @Service et @Controller servent de spécialisations de @Component pour des cas d'utilisation plus spécifiques (par exemple, dans les couches de persistance, de service et de présentation, respectivement). Cela signifie que vous pouvez annoter vos classes de composants avec @Component, mais en les annotant plutôt avec @Repository, @Service ou @Controller, vos classes sont mieux adaptées pour être traitées par des outils ou associées à des aspects. Par exemple, ces annotations de stéréotype constituent des cibles idéales pour des pointcuts. Bien sûr, il est également possible que @Repository, @Service et @Controller puissent avoir des sémantiques supplémentaires dans les futures versions du Framework Spring. Ainsi, si vous devez choisir entre utiliser @Component ou @Service pour votre couche de service, @Service est clairement le meilleur choix. De même, comme indiqué ci-dessus, @Repository est déjà pris en charge en tant que marqueur pour la traduction automatique des exceptions dans votre couche de persistance.

@Component - Indique un composant de scan automatique.
@Repository - Indique un composant DAO dans la couche de persistance.
@Service - Indique un composant de service dans la couche métier.
@Controller - Indique un composant de contrôleur dans la couche de présentation.

référence : - Documentation Spring - Analyse du classpath, composants gérés et écriture de configurations en utilisant Java

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