Entendo que a @Component
anotação foi introduzida na primavera 2.5 para livrar-se da definição de bean xml usando a verificação do caminho de classe.
@Bean
foi introduzido na primavera 3.0 e pode ser usado com o @Configuration
fim de se livrar completamente do arquivo xml e usar a configuração java.
Teria sido possível reutilizar a @Component
anotação em vez de introduzi-la @Bean
? Meu entendimento é que o objetivo final é criar beans nos dois casos.
java
spring
annotations
autowired
user1396576
fonte
fonte
@Component
,@Repository
&@Service
anotações no Spring?Lite mode
. E isso não é recomendado. Veja aqui: docs.spring.io/spring/docs/current/spring-framework-reference/…@bean
retorna uma instância personalizável do spring bean, enquanto@component
define uma classe que pode ser instanciada posteriormente pelo mecanismo IoC da primavera, quando necessário.Respostas:
@Component
e@Bean
faça duas coisas bem diferentes, e não deve ser confundida.@Component
(e@Service
e@Repository
) são usados para detectar e configurar automaticamente os beans usando a verificação do caminho de classe. Há um mapeamento implícito de um para um entre a classe anotada e o bean (ou seja, um bean por classe). O controle da fiação é bastante limitado com essa abordagem, pois é puramente declarativa.@Bean
é usado para declarar explicitamente um único bean, em vez de permitir que o Spring faça isso automaticamente como acima. Ele separa a declaração do bean da definição de classe e permite criar e configurar os beans exatamente como você escolhe.Para responder sua pergunta ...
Claro, provavelmente; mas eles escolheram não, pois os dois são bem diferentes. A primavera já é confusa o suficiente sem atrapalhar ainda mais as águas.
fonte
@Component
quando é necessário conectar automaticamente? Parece@Bean
que não pode afetar@Autowired
@Autowired
com@Bean
que você tenha anotado a sua classe de bean com@Configuration
@ Componente Preferível para varredura de componentes e fiação automática.
Quando você deve usar o @Bean ?
Às vezes, a configuração automática não é uma opção. Quando? Vamos imaginar que você deseja conectar componentes de bibliotecas de terceiros (você não possui o código-fonte para não poder anotar suas classes com @Component), portanto, a configuração automática não é possível.
A anotação @Bean retorna um objeto que a primavera deve registrar como bean no contexto do aplicativo. O corpo do método possui a lógica responsável pela criação da instância.
fonte
@Component
continua as próprias classes enquanto@Bean
continua os métodos de classe (que produzem instâncias de objetos de classe).Vamos considerar que quero uma implementação específica, dependendo de algum estado dinâmico.
@Bean
é perfeito para esse caso.No entanto, não há como fazer isso
@Component
.fonte
@Configuration
fonte
Ambas as abordagens visam registrar o tipo de destino no contêiner Spring.
A diferença é que
@Bean
é aplicável aos métodos , enquanto que@Component
é aplicável aos tipos .Portanto, ao usar a
@Bean
anotação, você controla a lógica de criação da instância no corpo do método (veja o exemplo acima ). Com@Component
anotação, você não pode.fonte
Eu vejo muitas respostas e em quase todos os lugares o @Component mencionado é para ligação automática, onde o componente é verificado e o @Bean está exatamente declarando que o bean deve ser usado de maneira diferente. Deixe-me mostrar como é diferente.
Primeiro, é uma anotação no nível do método. Segundo, você geralmente usa para configurar beans em um código java (se você não estiver usando a configuração xml) e depois chamá-lo de uma classe usando o método getBean do ApplicationContext. gostar
É uma maneira geral de anotar um bean e não um bean especializado. Uma anotação em nível de classe e é usada para evitar todo esse material de configuração através da configuração java ou xml.
Temos algo parecido com isto.
É isso aí . Foi introduzido apenas para evitar todas as etapas de configuração para instanciar e usar esse bean.
fonte
@Bean
abordagem. Você ainda pode usar@Autowire
para obter o bean como faria no caso de@Component
.@Bean
apenas adiciona o Bean ao contêiner de primavera da mesma forma que faria@Component
. A diferença é a seguinte. 1. Usando@Bean
, você pode adicionar Classes de Terceiros ao Spring Container. 2. Usando@Bean
, você pode obter a implementação desejada de uma interface em tempo de execução (Usando o padrão de design de fábrica)Você pode usar
@Bean
para disponibilizar uma classe de terceiros existente para o contexto de aplicativo da estrutura Spring.Usando a
@Bean
anotação, você pode agrupar uma classe de terceiros (ela pode não ter@Component
e não pode usar Spring), como um bean Spring. E, depois de empacotado@Bean
, é como um objeto singleton e está disponível no seu contexto de aplicativo da estrutura Spring. Agora você pode compartilhar / reutilizar facilmente esse bean em seu aplicativo usando injeção e dependência@Autowired
.Então, pense na
@Bean
anotação como um invólucro / adaptador para classes de terceiros. Você deseja disponibilizar as classes de terceiros para o contexto do aplicativo da estrutura Spring.Usando
@Bean
o código acima, declaro explicitamente um único bean porque, dentro do método, estou criando explicitamente o objeto usando anew
palavra - chave. Também estou chamando manualmente métodos setter da classe especificada. Para que eu possa alterar o valor do campo prefixo. Portanto, este trabalho manual é chamado de criação explícita. Se eu usar o@Component
para a mesma classe, o bean registrado no contêiner Spring terá valor padrão para o campo prefixo.Por outro lado, quando anotamos uma classe com
@Component
, não precisamos usar manualmente anew
palavra - chave. É tratado automaticamente pelo Spring.fonte
Quando você usa a
@Component
tag, é o mesmo que ter um POJO (Plain Old Java Object) com um método de declaração de bean de baunilha (anotado com@Bean
). Por exemplo, os seguintes métodos 1 e 2 fornecerão o mesmo resultado.Método 1
com um bean para 'theNumber':
Método 2
com o feijão para ambos:
O método 2 permite que você mantenha as declarações de bean juntas, é um pouco mais flexível etc. Você pode até querer adicionar outro bean SomeClass não baunilha, como o seguinte:
fonte
Você tem duas maneiras de gerar beans. Uma é criar uma classe com uma anotação
@Component
. O outro é criar um método e anotá-lo@Bean
. Para as classes que contêm o método with,@Bean
devem ser anotadas com@Configuration
Depois que você executa o projeto da primavera, a classe com uma@ComponentScan
anotação varre todas as classes@Component
nele e restaura a instância dessa classe no Container Ioc. Outra coisa@ComponentScan
que você faria é executar os métodos@Bean
nele e restaurar o objeto de retorno para o Ioc Container como um bean. Portanto, quando você precisar decidir que tipo de beans você deseja criar, dependendo dos estados atuais, precisará usar@Bean
. Você pode escrever a lógica e retornar o objeto que deseja. Outra coisa que vale a pena mencionar é o nome do método com@Bean
o nome padrão de bean.fonte
fonte
O @Bean foi criado para evitar o acoplamento do Spring e das regras de negócios em tempo de compilação. Isso significa que você pode reutilizar suas regras de negócios em outras estruturas, como PlayFramework ou JEE.
Além disso, você tem controle total sobre como criar beans, onde não é suficiente a instanciação padrão do Spring.
Eu escrevi um post falando sobre isso.
https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/
fonte
Diferença entre Bean e Componente:
fonte
1. Sobre o @Component
@Component funciona da mesma forma que o @Configuration.
Ambos indicam que a classe anotada possui um ou mais beans que precisam ser registrados
Spring-IOC-Container
.A classe anotada por @Component, como chamamos
Component of Spring
. É um conceito que contém vários feijões.Component class
precisa ser verificado automaticamente pelo Spring para registrar esses beans docomponent class
.2. Sobre o @Bean O
@Bean é usado para anotar o método de
component-class
(como mencionado acima). Indica que a instância recuperada pelo método anotado precisa ser registradaSpring-IOC-Container
.3. Conclusão
A diferença entre os dois é relativamente inconsciente, eles são usados em
different circumstances
. O uso geral é:fonte
Pontos adicionais das respostas acima
Digamos que temos um módulo que é compartilhado em vários aplicativos e contém alguns serviços. Nem todos são necessários para cada aplicativo.
Se usar @Component nessas classes de serviço e a varredura de componentes no aplicativo,
Nesse caso, você teve que ajustar a filtragem da varredura de componente ou fornecer a configuração que até os beans não utilizados podem executar. Caso contrário, o contexto do aplicativo não será iniciado.
Nesse caso, é melhor trabalhar com a anotação @Bean e instanciar apenas esses beans,
Portanto, essencialmente, use o @Bean para adicionar classes de terceiros ao contexto. E o @Component, se for apenas dentro do seu aplicativo único.
fonte