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) │
└────────────┴─────────────────────────────────────────────────────┘
Ils sont presque identiques - ils signifient tous que la classe est un bean Spring. @Service
, @Repository
et @Controller
sont des @Component
s spécialisés. Vous pouvez choisir d'effectuer des actions spécifiques avec eux. Par exemple :
@Controller
sont utilisés par spring-mvc@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.
L'utilisation des annotations @Service
et @Repository
est importante du point de vue de la connexion à la base de données.
@Service
pour toutes vos connexions aux bases de données de type service web.@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.