java - with - Qual é a diferença entre @Inject e @Autowired no Spring Framework? Qual deles usar sob qual condição?




spring inject with qualifier (7)

A anotação @Inject é uma das coleções de anotações JSR-330. Isso tem caminhos de execução de correspondência por tipo, correspondência por qualificador, correspondência por nome. Esses caminhos de execução são válidos tanto para o setter quanto para a injeção de campo. O comportamento da anotação @Autowired é o mesmo que a anotação @Inject . A única diferença é que a anotação @Autowired é uma parte do framework Spring. @Autowired anotação @Autowired também possui os caminhos de execução acima. Por isso recomendo o @Autowired pela sua resposta.

Eu estou passando por alguns blogs na SpringSource e em um dos blogs, o autor está usando o @Inject e suponho que ele também possa usar o @Autowired .

Aqui está o pedaço de código:

@Inject private CustomerOrderService customerOrderService;

Não tenho certeza sobre a diferença entre @Inject e @Autowired e gostaria que alguém explicasse a diferença e qual deles usar em que situação?


A partir do Spring 3.0, o Spring oferece suporte para anotações de injeção de dependência JSR-330 ( @Inject , @Named , @Singleton ).

Há uma seção separada na documentação do Spring sobre eles, incluindo comparações com seus equivalentes do Spring.


Além do acima:

  1. O escopo padrão para @Autowired beans é o Singleton, enquanto que usar a anotação @Inject do JSR 330 é como o prototype do Spring.
  2. Não há equivalente de @Lazy no JSR 330 usando @Inject
  3. Não há equivalente de @Value no JSR 330 usando @Inject

Aqui está uma postagem no blog que compara @Resource , @Inject e @Autowired , e parece fazer um trabalho bastante abrangente.

A partir do link:

Com exceção dos testes 2 e 7, a configuração e os resultados foram idênticos. Quando eu olhei sob o capô, eu determinei que as anotações '@Autowired' e '@Inject' se comportam de maneira idêntica. Ambas as anotações usam o 'AutowiredAnnotationBeanPostProcessor' para injetar dependências. '@Autowired' e '@Inject' podem ser usados ​​como intercambiáveis ​​para injetar grãos de Spring. No entanto, a anotação '@Resource' usa o 'CommonAnnotationBeanPostProcessor' para injetar dependências. Mesmo que eles usem classes de pós-processadores diferentes, todos se comportam de forma quase idêntica. Abaixo está um resumo de seus caminhos de execução.

Os testes 2 e 7 que o autor faz referência são 'injeção por nome de campo' e 'uma tentativa de resolver um bean usando um qualificador ruim', respectivamente.

A conclusão deve fornecer todas as informações de que você precisa.


Melhor usar @Inject o tempo todo. Porque é a abordagem de configuração java (fornecida pelo sun) que torna nosso aplicativo agnóstico para o framework. Então, se você pular também, suas aulas funcionarão.

Se você usar o @Autowired, ele funcionará apenas com a mola porque o @Autowired é uma anotação fornecida pela primavera.


Para lidar com a situação na qual não há fiação, os beans estão disponíveis com o atributo required @Autowired configurado como false .

Mas ao usar @Inject , a interface Provider trabalha com o bean, o que significa que o bean não é injetado diretamente, mas com o Provider.


@Inject não tem atributo 'obrigatório'







inject