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@Componente non cerca@Controller,@Servicee@Repositoryin generale. Vengono scansionati perché sono essi stessi annotati@Component.
Basta dare un'occhiata a @Controller, @Servicee @Repositoryle definizioni della nota:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Così, non è sbagliato dire che @Controller, @Servicee @Repositorysono particolari tipi di @Componentannotazione. <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 @Componentannotazione, il che significa che sono anche @Components. 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 , @Repositoryil 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 @Repositorymodo 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' @Controllerannotazione indica che una particolare classe svolge il ruolo di controller. L' @Controllerannotazione funge da stereotipo per la classe annotata, indicandone il ruolo.
Cosa c'è di speciale in @Controller?
Non possiamo cambiare questa annotazione con altri simili @Serviceo @Repository, anche se sembrano uguali. Il dispatcher esegue la scansione delle classi annotate @Controllere rileva i metodi annotati con @RequestMappingannotazioni al loro interno. Possiamo usare @RequestMappingil / nel solo quei metodi le cui classi sono annotati con @Controllere sarà NON lavorare con @Component, @Service, @Repositoryecc ...
Nota: se una classe è già registrata come bean tramite qualsiasi metodo alternativo, come attraverso @Beano attraverso @Component, @Serviceecc ... annotazioni, allora @RequestMappingpuò essere scelta se la classe è anche annotata con @RequestMappingannotazione. 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, @Controllere @Repositoryin base alle loro convenzioni di stratificazione. Quindi, è sempre una buona idea rispettare la convenzione e usarla in linea con i livelli.