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@Component
et ne recherche pas@Controller
,@Service
et@Repository
en général. Ils sont scannés car ils sont eux-mêmes annotés@Component
.
Il suffit de jeter un oeil à @Controller
, @Service
et les @Repository
dé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
, @Service
et ce @Repository
sont des types spéciaux d' @Component
annotation. <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 @Component
annotations, ce qui signifie qu'elles sont également des @Component
s. 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 , @Repository
le 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é @Repository
afin 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' @Controller
annotation indique qu'une classe particulière joue le rôle d'un contrôleur. L' @Controller
annotation 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 @Service
ou @Repository
, même si elles se ressemblent. Le répartiteur analyse les classes annotées @Controller
et détecte les méthodes annotées avec des @RequestMapping
annotations en leur sein. Nous pouvons utiliser @RequestMapping
le / uniquement dans les méthodes dont les classes sont annotés avec @Controller
et il sera PAS travailler avec @Component
, @Service
, @Repository
etc ...
Remarque: Si une classe est déjà enregistrée en tant que bean via une autre méthode, comme les annotations through @Bean
ou through @Component
, @Service
etc ..., elle @RequestMapping
peut être sélectionnée si la classe est également annotée avec @RequestMapping
annotation. 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
, @Controller
et en @Repository
fonction 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.