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@Component
e não procura@Controller
,@Service
e@Repository
em geral. Eles são verificados porque eles mesmos são anotados@Component
.
Basta dar uma olhada @Controller
, @Service
e @Repository
definições de anotação:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Assim, não é errado dizer que @Controller
, @Service
e @Repository
são tipos especiais de @Component
anotaçã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 @Component
anotação, o que significa que também são @Component
s. 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 , @Repository
a 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 PersistenceExceptionTranslationPostProcessor
obrigados 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 @Repository
para 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 @Controller
anotação indica que uma classe específica cumpre a função de um controlador. A @Controller
anotaçã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 @Service
ou @Repository
, mesmo que pareçam iguais. O expedidor varre as classes anotadas com @Controller
e detecta métodos anotados com @RequestMapping
anotações dentro delas. Podemos usar @RequestMapping
on / in apenas os métodos cujas aulas são anotados com @Controller
e vai NÃO trabalhar com @Component
, @Service
, @Repository
etc ...
Nota: Se uma classe já estiver registrada como um bean por meio de qualquer método alternativo, como anotações completas @Bean
ou completas @Component
, @Service
etc ..., @RequestMapping
poderá ser selecionada se a classe também for anotada com @RequestMapping
anotaçã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
, @Controller
e @Repository
com base em suas convenções camadas. Portanto, é sempre uma boa idéia respeitar a convenção e usá-la de acordo com as camadas.