@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.