Comme de nombreuses réponses indiquent déjà à quoi servent ces annotations, nous nous concentrerons ici sur quelques différences mineures entre elles.
D'abord la similitude
Le premier point à souligner de nouveau est qu'en ce qui concerne la détection automatique de scan et l'injection de dépendances pour BeanDefinition, toutes ces annotations (à savoir, @Component, @Service, @Repository, @Controller) sont les mêmes. Nous pouvons en utiliser un à la place d'un autre et nous pouvons toujours nous déplacer.
Différences entre @Component, @Repository, @Controller et @Service
@Composant
Il s'agit d'une annotation de stéréotype à usage général indiquant que la classe est un composant ressort.
La particularité de @Component
<context:component-scan> analyse uniquement@Componentet ne recherche pas@Controller,@Serviceet@Repositoryen général. Ils sont scannés car ils sont eux-mêmes annotés@Component.
Il suffit de jeter un oeil à @Controller, @Serviceet les @Repositorydéfinitions d'annotation:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Ainsi, il n'est pas faux de dire cela @Controller, @Serviceet ce @Repositorysont des types spéciaux d' @Componentannotation. <context:component-scan>les récupère et enregistre leurs classes suivantes en tant que beans, comme si elles étaient annotées avec @Component.
Les annotations de type spécial sont également analysées, car elles-mêmes sont annotées avec des @Componentannotations, ce qui signifie qu'elles sont également des @Components. Si nous définissons notre propre annotation personnalisée et l'annotons avec @Component, elle sera également analysée avec<context:component-scan>
@Dépôt
Ceci indique que la classe définit un référentiel de données.
Quelle est la particularité de @Repository?
En plus de souligner qu'il s'agit d'une configuration basée sur des annotations , @Repositoryle travail consiste à intercepter les exceptions spécifiques à la plate-forme et à les renvoyer comme l'une des exceptions unifiées non contrôlées de Spring. Pour cela, nous sommes fournis avec PersistenceExceptionTranslationPostProcessor, que nous sommes tenus d'ajouter dans notre contexte d'application de Spring comme ceci:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Ce post-processeur de bean ajoute un conseiller à tout bean annoté @Repositoryafin que toutes les exceptions spécifiques à la plate-forme soient interceptées puis renvoyées comme l'une des exceptions d'accès aux données non contrôlées de Spring.
@Manette
L' @Controllerannotation indique qu'une classe particulière joue le rôle d'un contrôleur. L' @Controllerannotation agit comme un stéréotype pour la classe annotée, indiquant son rôle.
Quelle est la particularité de @Controller?
Nous ne pouvons pas changer cette annotation avec une autre comme @Serviceou @Repository, même si elles se ressemblent. Le répartiteur analyse les classes annotées @Controlleret détecte les méthodes annotées avec des @RequestMappingannotations en leur sein. Nous pouvons utiliser @RequestMappingle / uniquement dans les méthodes dont les classes sont annotés avec @Controlleret il sera PAS travailler avec @Component, @Service, @Repositoryetc ...
Remarque: Si une classe est déjà enregistrée en tant que bean via une autre méthode, comme les annotations through @Beanou through @Component, @Serviceetc ..., elle @RequestMappingpeut être sélectionnée si la classe est également annotée avec @RequestMappingannotation. Mais c'est un scénario différent.
@Un service
@Service Les beans contiennent la logique métier et les méthodes d'appel dans la couche de référentiel.
Quelle est la particularité de @Service?
Mis à part le fait qu'il est utilisé pour indiquer, qu'il détient la logique métier, il n'y a rien d'autre visible dans cette annotation; mais qui sait, le printemps pourrait ajouter d'autres exceptionnels à l'avenir.
Quoi d'autre?
Similaire ci - dessus, dans le futur printemps peut ajouter des fonctionnalités spéciales pour @Service, @Controlleret en @Repositoryfonction de leurs conventions de stratification. Par conséquent, c'est toujours une bonne idée de respecter la convention et de l'utiliser en ligne avec les calques.