Poiché molte delle risposte indicano già a cosa servono queste annotazioni, qui ci concentreremo su alcune differenze minori tra loro.
Innanzitutto la somiglianza
Il primo punto da sottolineare è che per quanto riguarda la rilevazione automatica della scansione e l'iniezione di dipendenza per BeanDefinition tutte queste annotazioni (vale a dire, @Component, @Service, @Repository, @Controller) sono le stesse. Possiamo usarne uno al posto di un altro e possiamo ancora spostarci.
Differenze tra @Component, @Repository, @Controller e @Service
@Componente
Questa è un'annotazione stereotipata per uso generico che indica che la classe è un componente spring.
La particolarità di @Component
<context:component-scan>
scansiona@Component
e non cerca@Controller
,@Service
e@Repository
in generale. Vengono scansionati perché sono essi stessi annotati@Component
.
Basta dare un'occhiata a @Controller
, @Service
e @Repository
le definizioni della nota:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Così, non è sbagliato dire che @Controller
, @Service
e @Repository
sono particolari tipi di @Component
annotazione. <context:component-scan>
le raccoglie e registra le loro seguenti classi come bean, proprio come se fossero annotate @Component
.
Anche le annotazioni di tipo speciale vengono scansionate, poiché sono esse stesse annotate con @Component
annotazione, il che significa che sono anche @Component
s. Se definiamo la nostra annotazione personalizzata e la annotiamo con @Component
, verrà scansionata anche con<context:component-scan>
@Repository
Questo per indicare che la classe definisce un repository di dati.
Cosa c'è di speciale in @Repository?
Oltre a sottolineare che si tratta di una configurazione basata su annotazioni , @Repository
il compito è quello di catturare le eccezioni specifiche della piattaforma e rilanciarle come una delle eccezioni unificate non controllate di Spring. Per questo, ci viene fornito PersistenceExceptionTranslationPostProcessor
, che ci viene richiesto di aggiungere nel nostro contesto applicativo di Spring in questo modo:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Questo post processor del bean aggiunge un advisor a qualsiasi bean annotato in @Repository
modo tale che vengano rilevate eventuali eccezioni specifiche della piattaforma e quindi rilanciate come una delle eccezioni di accesso ai dati non controllate di Spring.
@Controller
L' @Controller
annotazione indica che una particolare classe svolge il ruolo di controller. L' @Controller
annotazione funge da stereotipo per la classe annotata, indicandone il ruolo.
Cosa c'è di speciale in @Controller?
Non possiamo cambiare questa annotazione con altri simili @Service
o @Repository
, anche se sembrano uguali. Il dispatcher esegue la scansione delle classi annotate @Controller
e rileva i metodi annotati con @RequestMapping
annotazioni al loro interno. Possiamo usare @RequestMapping
il / nel solo quei metodi le cui classi sono annotati con @Controller
e sarà NON lavorare con @Component
, @Service
, @Repository
ecc ...
Nota: se una classe è già registrata come bean tramite qualsiasi metodo alternativo, come attraverso @Bean
o attraverso @Component
, @Service
ecc ... annotazioni, allora @RequestMapping
può essere scelta se la classe è anche annotata con @RequestMapping
annotazione. Ma questo è uno scenario diverso.
@Servizio
@Service
i bean contengono la logica aziendale e chiamano i metodi nel livello repository.
Cosa c'è di speciale in @Service?
A parte il fatto che è usato per indicare, che sta trattenendo la logica aziendale, non c'è nient'altro evidente in questa annotazione; ma chissà, la primavera potrebbe aggiungere ulteriori eccezionali in futuro.
Cos'altro?
Simile a sopra, in futuro primavera può aggiungere funzionalità speciali per i @Service
, @Controller
e @Repository
in base alle loro convenzioni di stratificazione. Quindi, è sempre una buona idea rispettare la convenzione e usarla in linea con i livelli.