Introduction : Pourquoi trois annotations dans Spring pour la même chose ?
\n\nQuiconque a commencé à travailler avec Spring s'est tôt ou tard posé la question : "Pourquoi avons-nous besoin de trois annotations différentes — @Component, @Repository et @Service — si elles enregistrent toutes simplement un bean dans le contexte ?".
Cette question est si populaire que sur Stack Overflow, elle a recueilli des milliers de vues et des dizaines de réponses. Et ce n'est pas un hasard. À première vue, les annotations font effectivement la même chose. Mais le diable, comme toujours, se cache dans les détails.
\n\nDans cet article, nous ne nous contenterons pas d'énumérer les différences. Nous analyserons la philosophie de Spring, nous regarderons sous le capot du conteneur et montrerons comment une utilisation correcte des annotations peut sauver votre projet de bugs cachés. C'est parti !
\n\nPetit rappel : Que sont les annotations stéréotypées ?
\n\nToutes les trois annotations appartiennent à ce qu'on appelle les annotations stéréotypées (stereotype annotations). Elles indiquent à Spring que la classe est un composant géré (bean) et doit être automatiquement détectée lors du scan du classpath.
\n\nL'annotation de base est @Component. C'est le fondement. @Repository, @Service et @Controller sont des formes spécialisées de @Component qui ajoutent une sémantique et un comportement supplémentaires.
@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@Component // Voici le point clé !\npublic @interface Service {\n // ...\n}\n\nComme vous pouvez le voir, @Service est elle-même annotée avec @Component. Cela signifie que Spring la traitera exactement comme un @Component ordinaire. Mais alors pourquoi compliquer les choses ?
@Component — le soldat universel
\n\n@Component est l'annotation la plus générale. Utilisez-la lorsque votre classe ne correspond à aucune des catégories plus spécifiques.
Exemples typiques :
\n- \n
- Utilitaires auxiliaires \n
- Objets de configuration (à ne pas confondre avec
@Configuration) \n - Toutes les classes qui doivent être des beans mais ne sont ni des services, ni des repositories, ni des contrôleurs \n
import org.springframework.stereotype.Component;\n\n@Component\npublic class EmailValidator {\n\n public boolean isValid(String email) {\n return email != null && email.contains("@");\n }\n}\n\nRemarquez : EmailValidator n'exécute pas de logique métier (ce n'est pas un @Service) et ne travaille pas avec la base de données (ce n'est pas un @Repository). Donc @Component est le choix idéal.
@Repository — le gardien des données
\n\n@Repository est la première annotation spécialisée qui ajoute une fonctionnalité réelle. En plus de l'enregistrement du bean, elle remplit deux tâches importantes :
- \n
- Interception des exceptions d'accès aux données. Spring encapsule automatiquement les exceptions des DAO (Data Access Object) dans
DataAccessException— la hiérarchie d'exceptions de Spring. \n - Amélioration de la lisibilité du code. Tout développeur, voyant
@Repository, comprend immédiatement : "Ah, ici on travaille avec la base de données". \n
import org.springframework.stereotype.Repository;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\n@Repository\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n User findByEmail(String email);\n}\n\nImportant : Si vous utilisez Spring Data JPA et héritez de JpaRepository, Spring créera lui-même un bean proxy. L'annotation explicite @Repository n'est pas obligatoire, mais elle est recommandée pour indiquer clairement le but.
La principale "spécialité" de @Repository est l'intercepteur AOP (PersistenceExceptionTranslationPostProcessor)
Blogs
Book Recommendations
Lire aussi
Comment faire une redirection en JavaScript : meilleures pratiques 2025
Débogage de code Kotlin : techniques avancées et outils pour les pros
Concurrence et multithreading en TypeScript : niveau avancé
Travailler avec les dates et l'heure en Go : des bases aux techniques avancées
YouTube API : comment obtenir l'aperçu d'une vidéo sans tomber dans les pièges