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

Les annotations @Component, @Repository et @Service peuvent-elles être utilisées de manière interchangeable dans Spring ou apportent-elles une fonctionnalité particulière en dehors de leur rôle de notation ?

En d'autres termes, si j'ai une classe Service et que je change l'annotation @Service en @Component, se comportera-t-elle de la même manière ?

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

Extrait de Spring Documentation :

Dans Spring 2.0 et plus, l'annotation @Repository est un marqueur pour toute classe qui remplit le rôle ou le stéréotype (également connu sous le nom de Data Access Object ou DAO) d'un référentiel. Parmi les utilisations de ce marqueur est la traduction automatique des exceptions.

Spring 2.5 introduit 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. composant géré par Spring. @Repository, @Service, et @Controller sont des spécialisations de @Component. sont des spécialisations de @Component pour des cas d'utilisation plus spécifiques, par exemple, dans le domaine de la persistance, de l'intégration et de la gestion des données. par exemple, 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 Mais en les annotant avec @Repository, @Service, ou @Controller > à la place, vos classes sont mieux adaptées au traitement par des outils ou à être associées à des aspects. Par exemple, ces annotations de stéréotype font des cibles idéales pour les coupes transversales.

Ainsi, si vous devez choisir entre l'utilisation de @Component ou de @Service pour votre couche de service, @Service est la meilleure solution. votre couche de service, @Service est clairement le meilleur choix. De même, comme indiqué ci-dessus, @Repository est déjà supporté en tant que marqueur pour la traduction automatique des exceptions dans votre persistance. la traduction automatique des exceptions dans votre couche de persistance.

┌────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning                                             │
├────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository│ stereotype for persistence layer                    │
│ @Service   │ stereotype for service layer                        │
│ @Controller│ stereotype for presentation layer (spring-mvc)      │
└────────────┴─────────────────────────────────────────────────────┘
Commentaires (12)

Ils sont presque identiques - ils signifient tous que la classe est un bean Spring. @Service, @Repository et @Controller sont des @Components 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 du type @Repository sont éligibles pour la traduction des exceptions de persistance.

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

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

Par exemple, j'ai récemment fait :

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

Donc toutes les classes annotées avec @ScheduledJob sont des spring beans et en plus de cela sont enregistrées comme des jobs quartz. Vous avez juste à fournir du code qui gère l'annotation spécifique.

Commentaires (3)

L'utilisation des annotations @Service et @Repository est importante du point de vue de la connexion à la base de données.

  1. Utilisez @Service pour toutes vos connexions aux bases de données de type service web.
  2. Utilisez @Repository pour toutes vos connexions à des bases de données de type "stored proc".

Si vous n'utilisez pas les annotations appropriées, vous pouvez être confronté à des exceptions de commit écrasées par des transactions de rollback. Vous verrez des exceptions pendant le test de charge de stress qui sont liées aux transactions JDBC rollback.

Commentaires (2)