Como muitas das respostas já indicam para que essas anotações são usadas, aqui vamos nos concentrar em algumas pequenas diferenças entre elas.
Primeiro a semelhança
O primeiro ponto a ser destacado novamente é que, com relação à detecção automática de varredura e injeção de dependência para o BeanDefinition, todas essas anotações (a saber, @Component, @Service, @Repository, @Controller) são as mesmas. Podemos usar um no lugar do outro e ainda podemos dar a volta.
Diferenças entre @Component, @Repository, @Controller e @Service
@Componente
Esta é uma anotação de estereótipo de uso geral, indicando que a classe é um componente de mola.
O que há de especial no @Component
<context:component-scan> apenas verifica@Componente não procura@Controller,@Servicee@Repositoryem geral. Eles são verificados porque eles mesmos são anotados@Component.
Basta dar uma olhada @Controller, @Servicee @Repositorydefinições de anotação:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Assim, não é errado dizer que @Controller, @Servicee @Repositorysão tipos especiais de @Componentanotação. <context:component-scan>as pega e registra as seguintes classes como beans, como se fossem anotadas @Component.
As anotações de tipo especial também são digitalizadas, porque elas próprias são anotadas com @Componentanotação, o que significa que também são @Components. Se definirmos nossa própria anotação personalizada e a anotamos @Component, ela também será digitalizada com<context:component-scan>
@Repositório
Isso é para indicar que a classe define um repositório de dados.
O que há de especial no @Repository?
Além de apontar que essa é uma configuração baseada em anotações , @Repositorya tarefa é capturar exceções específicas da plataforma e jogá-las novamente como uma das exceções não verificadas e unificadas do Spring. Para isso, somos PersistenceExceptionTranslationPostProcessorobrigados a adicionar no contexto de aplicativos do Spring assim:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Esse processador de postagem de bean adiciona um orientador a qualquer bean anotado @Repositorypara que quaisquer exceções específicas da plataforma sejam capturadas e, em seguida, lançadas novamente como uma das exceções de acesso a dados não verificadas do Spring.
@Controlador
A @Controlleranotação indica que uma classe específica cumpre a função de um controlador. A @Controlleranotação atua como um estereótipo para a classe anotada, indicando sua função.
O que há de especial no @Controller?
Não podemos alternar esta anotação com outra igual @Serviceou @Repository, mesmo que pareçam iguais. O expedidor varre as classes anotadas com @Controllere detecta métodos anotados com @RequestMappinganotações dentro delas. Podemos usar @RequestMappingon / in apenas os métodos cujas aulas são anotados com @Controllere vai NÃO trabalhar com @Component, @Service, @Repositoryetc ...
Nota: Se uma classe já estiver registrada como um bean por meio de qualquer método alternativo, como anotações completas @Beanou completas @Component, @Serviceetc ..., @RequestMappingpoderá ser selecionada se a classe também for anotada com @RequestMappinganotação. Mas esse é um cenário diferente.
@Serviço
@Service beans mantêm a lógica de negócios e chamam métodos na camada de repositório.
O que há de especial no @Service?
Além do fato de ser usado para indicar, de manter a lógica de negócios, não há mais nada perceptível nesta anotação; mas quem sabe, o Spring poderá adicionar mais algumas exceções no futuro.
O quê mais?
Semelhante ao anterior, no futuro Primavera pode adicionar funcionalidades especiais para @Service, @Controllere @Repositorycom base em suas convenções camadas. Portanto, é sempre uma boa idéia respeitar a convenção e usá-la de acordo com as camadas.