Can @Component
, @Repository
e @Service
anotações ser usados alternadamente na Primavera ou eles fornecem qualquer funcionalidade específica além de atuar como um dispositivo de notação?
Em outras palavras, se eu tiver uma classe de serviço e alterar a anotação de @Service
para @Component
, ela ainda se comportará da mesma maneira?
Ou a anotação também influencia o comportamento e a funcionalidade da classe?
java
spring
spring-mvc
annotations
Colin McCree
fonte
fonte
Respostas:
Da documentação da primavera :
fonte
@Service
é um@Component
(porque a@Service
anotação em si é anotada@Component
). Até onde eu sei, nada no framework Spring faz uso explícito do fato de que algo é um@Service
, então a diferença é realmente apenas conceitual.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.
Diferenças entre @Component, @Repository, @Controller e @Service
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: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>
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, somosPersistenceExceptionTranslationPostProcessor
obrigados a adicionar no contexto de aplicativos do Spring assim: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.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.@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.
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.fonte
@Controller
anotação. Não é necessário se a classe for anotada@RequestMapping
e o bean dessa classe for criado de alguma maneira. Qualquer bean anotado com@Controller
OR@RequestMapping
participará dos mapeamentos de solicitação do Spring MVC. Isso pode ser útil, por exemplo, para criar controladores programaticamente (por exemplo, usando@Bean
métodos) e, ao mesmo tempo, impedir que o Spring tente criá-los pela verificação de pacotes (se o pacote não puder ser excluído da verificação).Eles são quase os mesmos - todos significam que a classe é um bean Spring.
@Service
,@Repository
E@Controller
são especializada@Component
s. Você pode optar por executar ações específicas com eles. Por exemplo:@Controller
feijão são usados por spring-mvc@Repository
beans são elegíveis para tradução de exceção de persistênciaOutra coisa é que você designa os componentes semanticamente para diferentes camadas.
Uma coisa que
@Component
oferece é que você pode fazer anotações com outras anotações e usá-las da mesma maneira que@Service
.Por exemplo, recentemente eu fiz:
Portanto, todas as classes anotadas
@ScheduledJob
são feijão verde e, além disso, são registradas como trabalhos de quartzo. Você apenas precisa fornecer um código que lide com a anotação específica.fonte
@Component é equivalente a
@Service, @Controller, @Repository = {@Component + algumas funcionalidades mais especiais}
Isso significa que Serviço, Controlador e Repositório são funcionalmente iguais.
As três anotações são usadas para separar "Camadas" em seu aplicativo,
Agora você pode perguntar por que os separa: (Presumo que você saiba Programação Orientada AOP)
Digamos que você queira monitorar apenas a atividade da camada DAO. Você escreverá uma classe Aspect (classe A) que faz alguns registros antes e depois de cada método do seu DAO ser invocado, você poderá fazer isso usando o AOP, pois possui três camadas distintas e não é misto.
Portanto, você pode fazer o log do DAO "em volta", "antes" ou "depois" dos métodos DAO. Você poderia fazer isso porque tinha um DAO em primeiro lugar. O que você acabou de conseguir é a separação de preocupações ou tarefas.
Imagine se houvesse apenas uma anotação no @Controller, esse componente terá despacho, lógica de negócios e acesso ao banco de dados todos misturados, código tão sujo!
Acima mencionado é um cenário muito comum, há muitos outros casos de uso do porquê usar três anotações.
fonte
@Respository
também possui o recurso de tradução automática de exceções. Como quando ocorre uma exceção em um@Repository
, geralmente existe um manipulador para essa exceção e não há necessidade de adicionar blocos try try na classe DAO. Ele é usado junto com PersistenceExceptionTranslationPostProcessorNa Primavera
@Component
,@Service
,@Controller
, e@Repository
são anotações estereótipo que são utilizados para:@Controller:
onde o seu mapeamento de solicitação da página de apresentação foi concluído, ou seja, a camada de apresentação não vai para nenhum outro arquivo, ela é direcionada diretamente para a@Controller
classe e verifica o caminho solicitado na@RequestMapping
anotação que foi escrita antes do método chamar, se necessário.@Service
: Toda a lógica de negócios está aqui, isto é, cálculos relacionados a dados e tudo. Esta anotação da camada de negócios na qual nosso usuário não chama diretamente o método de persistência, portanto, chamará esse método usando esta anotação. Ele solicitará @Repository conforme solicitação do usuário@Repository
: É a camada Persistência (camada de acesso a dados) do aplicativo que costumava obter dados do banco de dados. isto é, todas as operações relacionadas ao banco de dados são feitas pelo repositório.@Component
- Anote seus outros componentes (por exemplo, classes de recursos REST) com um estereótipo de componente.fonte
referência: - Documentação Spring - Varredura de caminho de classe, componentes gerenciados e configurações de gravação usando Java
fonte
Tecnicamente
@Controller
,@Service
,@Repository
são todos iguais. Todos eles se estende@Component
.No código-fonte do Spring:
Indica que uma classe anotada é um "componente". Essas classes são consideradas candidatas à detecção automática ao usar a configuração baseada em anotação e a verificação do caminho de classe.
Nós podemos usar diretamente
@Component
para cada feijão, mas para melhor compreensão e manutenção de um aplicativo grande, usamos@Controller
,@Service
,@Repository
.Objetivo de cada anotação:
@Controller
-> Classes anotadas com isso, destinam-se a receber uma solicitação do lado do cliente. A primeira solicitação chega ao Dispatcher Servlet, de onde passa a solicitação para o controlador específico usando o valor de@RequestMapping
anotação.@Service
-> As classes anotadas com isso destinam-se a manipular dados que recebemos do cliente ou buscamos no banco de dados. Toda a manipulação com dados deve ser feita nesta camada.@Repository
-> Classes anotadas com isso, destinam-se a se conectar ao banco de dados. Também pode ser considerado como camada DAO (Data Access Object). Essa camada deve ser restrita apenas às operações CRUD (criar, recuperar, atualizar, excluir). Se qualquer manipulação for necessária, os dados devem ser enviados e enviados de volta para a camada @Service.Se trocarmos seu lugar (use
@Repository
no lugar de@Controller
), nosso aplicativo funcionará bem.O principal objetivo do uso de três diferentes
@annotations
é fornecer melhor modularidade ao aplicativo corporativo.fonte
controller and repository
O uso
@Service
e as@Repository
anotações são importantes da perspectiva da conexão com o banco de dados.@Service
para todo o tipo de serviço da Web de conexões com o banco de dados@Repository
para todas as suas conexões de banco de dados proc armazenadasSe você não usar as anotações adequadas, poderá enfrentar exceções de confirmação substituídas por transações de reversão. Você verá exceções durante o teste de carga de estresse relacionadas à reversão de transações JDBC.
fonte
@Repository
foi projetado especificamente para trabalhar com a camada de persistência. Se você estiver trabalhando com APIs de descanso - você está trabalhando com DTOs, não com DAO.O @Repository @Service e o @Controller servem como especialização do @Component para uso mais específico nessa base. Você pode substituir o @Service por @Component, mas nesse caso você perde a especialização.
fonte
todas essas anotações são do tipo estéreo, a diferença entre essas três anotações é
por exemplo
@Service
or@Repositroy
ou@Controller
por padrão,@Component
a existência no topo da classefonte
Spring fornece quatro tipos diferentes de componentes auto anotações de digitalização, são
@Component
,@Service
,@Repository
e@Controller
. Tecnicamente, não há diferença entre eles, mas cada anotação de varredura de componente automático deve ser usada para uma finalidade especial e dentro da camada definida.@Component
: É uma anotação básica de verificação automática de componentes, indica que a classe anotada é um componente de verificação automática.@Controller
: A classe anotada indica que é um componente do controlador e usado principalmente na camada de apresentação.@Service
: Indica que a classe anotada é um componente de serviço na camada de negócios.@Repository
: Você precisa usar esta anotação na camada de persistência, que age como um repositório de banco de dados.Deve-se escolher uma forma mais especializada de
@Component
anotar sua classe, pois essa anotação pode conter um comportamento específico daqui para frente.fonte
Podemos responder isso de acordo com o padrão java
Referindo-se a
JSR-330
, que agora é suportado pela primavera, você só pode usar@Named
para definir um bean (De alguma forma@Named=@Component
). Assim, de acordo com esta norma, parece que não há nenhum uso para definir estereótipos (como@Repository
,@Service
,@Controller
) a categorias feijão.Mas o usuário seleciona essas anotações diferentes para diferentes usos, por exemplo:
aspect-oriented
, pode ser um bom candidato parapointcuts
)@Repository
A anotação adicionará alguma funcionalidade ao seu bean (alguma conversão automática de exceção à camada de persistência do bean).@RequestMapping
poderá ser adicionado apenas às classes anotadas por@Controller
.fonte
Anote outros componentes com @Component, por exemplo, classes REST Resource.
@Component é um estereótipo genérico para qualquer componente gerenciado do Spring.
@Controller, @Service e @Repository são Especializações de @Component para casos de uso específicos.
@Componente na primavera
fonte
Não há diferença entre
@Component
,@Service
,@Controller
,@Repository
.@Component
é a anotação genérica para representar o componente do nosso MVC. Mas haverá vários componentes como parte de nosso aplicativo MVC, como componentes da camada de serviço, componentes da camada de persistência e componentes da camada de apresentação. Então, para diferenciá-los, o pessoal da Primavera também deu as outras três anotações.@Repository
@Service
@Controller
@Component
para todos eles.fonte
Mesmo se trocarmos @Component ou @Repository ou @service
O comportamento será o mesmo, mas um aspecto é que eles não conseguirão capturar alguma exceção específica relacionada ao DAO em vez do Repository, se usarmos o componente ou o serviço @
fonte
Na primavera 4, versão mais recente:
fonte
@ Componente : você anota uma classe
@Component
, ela diz ao hibernar que é um Bean.@ Repository : você anota uma classe
@Repository
, diz ao hibernate que é uma classe DAO e a trata como classe DAO. Significa que torna as exceções não verificadas (lançadas dos métodos DAO) elegíveis para tradução no SpringDataAccessException
.@ Service : Isso indica ao hibernate que é uma classe de serviço onde você terá
@Transactional
etc anotações da camada de serviço, para que o hibernate o trate como um componente de serviço.Plus
@Service
é avanço de@Component
. Suponha que o nome da classe de bean sejaCustomerService
, como você não escolheu a maneira de configuração do bean XML, portanto, você anotou o bean@Component
para indicá-lo como um Bean. Portanto, ao obter o objeto de beanCustomerService cust = (CustomerService)context.getBean("customerService");
Por padrão, o Spring irá minúscula para o primeiro caractere do componente - de 'CustomerService' para 'customerService'. E você pode recuperar esse componente com o nome 'customerService'. Mas se você usar@Service
anotação para a classe de bean, poderá fornecer um nome de bean específico,e você pode obter o objeto bean
fonte
@Component
é a anotação genérica de nível superior que torna o bean anotado a ser verificado e disponível no contêiner DI@Repository
é uma anotação especializada e traz o recurso de converter todas as exceções não verificadas das classes DAO@Service
é uma anotação especializada. ele não traz nenhum novo recurso a partir de agora, mas esclarece a intenção do beanO @Controller é uma anotação especializada que conscientiza o bean MVC e permite o uso de anotações adicionais, como
@RequestMapping
e todasAqui estão mais detalhes
fonte
A
@Service
para citar a documentação da primavera,Se você observar o design orientado a domínio por eric evans,
e um
Repository
por Eric Evans,fonte
Respostas boas o suficiente estão aqui para explicar as diferenças entre as anotações de serviço do repositório de componentes. Eu gostaria de compartilhar a diferença entre
@Controller & @RestController
@Controller
vsRestController
@RestController
:@Controller
que adiciona@Controller
e@ResponseBody
anota automaticamente. portanto, não precisamos adicionar@ResponseBody
nossos métodos de mapeamento. Que significa@ResponseBody
padrão é ativo.@RestController
não poderá retornar uma visualização (usandoViewresolver
em Spring / Spring-Boot)@RestController
também converte a respostaJSON/XML automatically
como@ResponseBody
faz os objetos retornados em algo que poderia estar no corpo,e.g. JSON or XML
@Controller
@Controller
é usado para marcar classes como Spring MVC Controller. Esta anotação é apenas uma versão especializada de@Component
e permite que as classes do controlador sejam detectadas automaticamente com base na varredura do caminho de classe.@Controller
você pode retornar uma visualização no Spring Web MVC.Vista mais detalhada
fonte
Repositório e Serviço são filhos da anotação de Componente . Então, todos eles são componentes . Repositório e Serviço apenas expandem-no. Como exatamente? O serviço tem apenas uma diferença ideológica: nós o usamos para serviços. O repositório possui um manipulador de exceção específico.
fonte
Explicação dos estereótipos:
@Service
- Anote todas as suas classes de serviço com @Service. Essa camada conhece a unidade de trabalho. Toda a sua lógica de negócios estará nas classes de serviço. Geralmente os métodos da camada de serviço são cobertos pela transação. Você pode fazer várias chamadas DAO a partir do método de serviço, se uma transação falhar, todas as transações deverão reverter.@Repository
- Anote todas as suas classes DAO com @Repository. Toda a lógica de acesso ao banco de dados deve estar nas classes DAO.@Component
- Anote seus outros componentes (por exemplo, classes de recursos REST) com estereótipo de componente.@Autowired
- Deixe o Spring conectar automaticamente outros beans em suas classes usando a anotação @Autowired.@Component
é um estereótipo genérico para qualquer componente gerenciado pelo Spring.@Repository
,,@Service
e@Controller
são especializações de@Component
casos de uso mais específicos, por exemplo, nas camadas de persistência, serviço e apresentação, respectivamente.Originalmente respondida aqui .
fonte
Diferença entre as anotações @Component, @Repository, @Controller & @Service
@Controller
= @Component (anotação interna) + Recursos da camada de apresentação@Service
= @Component (anotação interna) + Recursos da camada de serviço@Component
= Componentes reais (Beans)@Repository
= @Component (anotação interna) + Recursos da camada de dados (use para manipular os beans de domínio)fonte
Na estrutura de primavera, fornece algum tipo especial de anotação, chamado anotação de estereótipo. Estes são os seguintes: -
as anotações declaradas acima são especiais porque, quando adicionamos
<context:component-scan>
ao arquivo xxx-servlet.xml, o spring cria automaticamente o objeto daquelas classes que são anotadas com a anotação acima durante a fase de criação / carregamento de contexto.fonte
@Component
,@ Repository
,@ Service
,@Controller
:@Component
é um estereótipo genérico para os componentes gerenciados pelo Spring@Repository
,@Service
e@Controller
são@Component
especializações para usos mais específicos:@Repository
para persistência@Service
para serviços e transações@Controller
para controladores MVCPor que usar
@Repository
,@Service
,@Controller
ao longo@Component
? Podemos marcar nossas classes de componentes com @Component, mas se usarmos a alternativa que se adapta à funcionalidade esperada. Nossas aulas são mais adequadas à funcionalidade esperada em cada caso específico.Uma classe anotada com
@Repository
uma tradução melhor e um tratamento de erro legível com org.springframework.dao.DataAccessException. Ideal para implementar componentes que acessam dados (DataAccessObject ou DAO).Uma classe anotada com
@Controller
uma função de controlador em um aplicativo Spring Web MVCUma classe anotada com
@Service
uma função nos serviços de lógica de negócios, exemplo padrão de fachada para o Gerenciador de DAO (fachada) e manipulação de transaçõesfonte
As respostas apresentadas aqui são em grande parte tecnicamente corretas, mas, embora a lista de respostas seja longa e esta esteja no final, achei que valeria a pena colocar aqui uma resposta realmente correta também, para o caso de alguém tropeçar nela e aprender algo valioso isto. Não é que o restante das respostas esteja errado, apenas que elas não estão certas. E, para parar as hordas de trolls, sim, eu sei que tecnicamente essas anotações são efetivamente a mesma coisa e mais intercambiáveis até a primavera 5. Agora, para a resposta certa:
Essas três anotações são coisas completamente diferentes e não são intercambiáveis. Você pode dizer isso porque há três deles em vez de apenas um. Eles não devem ser intercambiáveis, apenas implementados dessa maneira por elegância e conveniência.
A programação moderna é invenção, arte, técnica e comunicação, em proporções variadas. O bit de comunicação geralmente é muito importante porque o código geralmente é lido com muito mais frequência do que o escrito. Como programador, você não está apenas tentando resolver o problema técnico, mas também tentando comunicar sua intenção a futuros programadores que leem seu código. Esses programadores podem não compartilhar seu idioma nativo, nem seu ambiente social, e é possível que eles estejam lendo seu código daqui a 50 anos (não é tão improvável quanto você imagina). É difícil se comunicar efetivamente tão longe no futuro. Portanto, é vital que usemos a linguagem mais clara, mais eficiente, correta e comunicativa disponível para nós.
Por exemplo, é vital que
@Repository
seja usado quando estamos escrevendo um repositório, em vez de@Component
. A última é uma escolha muito ruim de anotação para um repositório, porque não indica que estamos vendo um repositório. Podemos assumir que um repositório também é um spring bean, mas não que um componente seja um repositório. Com@Repository
isso, estamos sendo claros e específicos em nosso idioma. Estamos afirmando claramente que este é um repositório. Com@Component
estamos deixando para o leitor decidir que tipo de componente eles estão lendo e eles terão que ler toda a classe (e possivelmente uma árvore de subclasses e interfaces) para inferir o significado. A classe poderia, então, ser mal interpretada por um leitor em um futuro distante como não sendo um repositório, e seríamos parcialmente responsáveis por esse erro, porque nós, que sabíamos muito bem que esse é um repositório, deixamos de ser específicos em nosso idioma. e comunicar efetivamente nossa intenção.Não vou entrar nos outros exemplos, mas declararei da forma mais clara possível: essas anotações são coisas completamente diferentes e devem ser usadas adequadamente, conforme a intenção delas.
@Repository
é para repositórios de armazenamento e nenhuma outra anotação está correta.@Service
é para serviços e nenhuma outra anotação está correta.@Component
é para componentes que não são nem repositórios nem serviços, e o uso de um desses em seu lugar também seria incorreto. Pode ser compilado, pode até executar e passar nos testes, mas estaria errado e eu pensaria menos em você (profissionalmente) se você fizesse isso.Existem exemplos disso ao longo da primavera (e programação em geral). Você não deve usar
@Controller
ao escrever uma API REST, porque@RestController
está disponível. Você não deve usar@RequestMapping
quando@GetMapping
é uma alternativa válida. Etc. Etc. Etc. Você deve escolher o idioma exato e correto mais específico possível para comunicar sua intenção aos seus leitores; caso contrário, você está introduzindo riscos em seu sistema, e o risco tem um custo.fonte
Para simplificar esta ilustração, vamos considerar a tecnicidade por caso de uso. Essas anotações são usadas para serem injetadas e, como eu disse literalmente " costumavam ser injetadas ", isto é, se você souber usar a Injeção de Dependência "DI" e você você sempre procurará essas anotações e, anotando as classes com esses tipos estéreo , estará informando o contêiner de DI para digitalizá-los para que estejam prontos para a injeção em outros locais; esse é o objetivo prático.
Agora vamos passar para cada um; first @Service , Se você estiver construindo alguma lógica para um caso de negócios específico, precisará separar aquela em um local que contenha sua lógica de negócios, esse serviço é uma classe normal ou você pode usá-lo como interface, se quiser, e está escrito como isto
Todos são da mesma maneira quando você os injeta. O @Repository é uma interface que aplica a implementação ao padrão de design do Repository Pattern Repository , geralmente usado quando você está lidando com algum armazenamento de dados ou banco de dados, e verá que ele contém vários implementação pronta para você lidar com operações de banco de dados; pode ser CrudRepository , JpaRepository etc.
Finalmente, o @Component , este é o formulário genérico para beans registrados no Spring, que está sempre procurando o feijão marcado com @Component a ser registrado, então @Service e @Repository são casos especiais de @Component, no entanto, o caso de uso comum para componente é quando você está criando algo puramente técnico, não para cobrir casos de negócios diretos! como formatação de datas ou entrega de mecanismo de serialização de solicitação especial e assim por diante.
fonte
@Component atua como anotação @Bean na classe de configuração, registra o bean no contexto da primavera. Também é pai das anotações @Service, @Repository e @Controller.
@Service , estende a anotação @Component e possui apenas diferença de nome.
@Repository - estende a anotação @Component e converte todas as exceções do banco de dados em DataAccessException .
@ Controlador - atua como controlador no padrão MVC. O expedidor examinará essas classes anotadas em busca de métodos mapeados, detectando anotações @RequestMapping.
fonte
Essas são todas as anotações do StereoType. São úteis para criar nossas classes como feijão verde em um recipiente ioc,
fonte