Estou passando por alguns blogs no SpringSource e em um dos blogs, o autor está usando @Inject
e suponho que ele também possa usar @Autowired
.
Aqui está o trecho de código:
@Inject private CustomerOrderService customerOrderService;
Não tenho certeza sobre a diferença entre @Inject
e @Autowired
gostaria que alguém explicasse sua diferença e qual usar em que situação?
Respostas:
Supondo que você esteja se referindo às
javax.inject.Inject
anotações.@Inject
faz parte do padrão Java CDI ( Contextos e Injeção de Dependências ) introduzido no Java EE 6 (JSR-299), leia mais . O Spring optou por oferecer suporte ao uso de@Inject
sinônimos com sua própria@Autowired
anotação.Portanto, para responder sua pergunta,
@Autowired
é a anotação da própria Spring.@Inject
faz parte de uma nova tecnologia Java chamada CDI que define um padrão para injeção de dependência semelhante ao Spring. Em um aplicativo Spring, as duas anotações funcionam da mesma maneira que o Spring decidiu suportar algumas anotações do JSR-299, além das próprias.fonte
@Inject
é um JSR separado (JSR-330) do CDI (JSR-299).@Inject
anotação JSR, é melhor do que usar o@Autowired
que bloqueia sua base de código com DI de primavera.@Inject
sozinho não garante a independência da estrutura. Você também precisaria declarar beans injetáveis sem mecanismos dependentes da estrutura, como Spring,@Component
ouapplication.xml
, mas use@Named
e@Singleton
no nível de classe. Não faço ideia se algum projeto Spring realmente declara feijão como esse hoje - eu mesmo nunca ouvi falar de qualquer projecto que migraram da Primavera para JEE ...Aqui está um post que compara
@Resource
,@Inject
e@Autowired
, e parece fazer um trabalho bastante abrangente.No link:
Os testes 2 e 7 que o autor faz referência são 'injeção pelo nome do campo' e 'uma tentativa de resolver um bean usando um qualificador incorreto', respectivamente.
A conclusão deve fornecer todas as informações necessárias.
fonte
Para lidar com a situação em que não há fiação, os beans estão disponíveis com o
@Autowired
required
atributo definido comofalse
.Porém, ao usar
@Inject
, a interface do provedor trabalha com o bean, o que significa que o bean não é injetado diretamente, mas com o provedor.fonte
Como de mola 3.0, ofertas mola de suporte para JSR-330 anotações injecção dependência (
@Inject
,@Named
,@Singleton
).Há uma seção separada na documentação do Spring sobre eles, incluindo comparações com seus equivalentes do Spring.
fonte
A principal diferença (observada ao ler o Spring Docs ) entre
@Autowired
e@Inject
é que,@Autowired
possui o atributo 'required' enquanto o @Inject não possui o atributo 'required'.fonte
@Autowired(required=false)
Em termos simples, "Orequired
atributo indica que a propriedade não é necessária para fins de conexão automática, a propriedade será ignorada se não puder ser conectada automaticamente".Melhor usar @Inject o tempo todo. Porque é a abordagem de configuração java (fornecida pela sun) que torna nosso aplicativo independente do framework. Então, se você saltar também, suas aulas funcionarão.
Se você usar @Autowired, ele funcionará apenas com a primavera, porque @Autowired é uma anotação fornecida pela primavera.
fonte
@Autowired
anotação é definida na estrutura do Spring.@Inject
anotação é uma anotação padrão, definida no padrão "Injeção de Dependência para Java" (JSR-330) . O Spring (desde a versão 3.0) suporta o modelo generalizado de injeção de dependência, definido no padrão JSR-330. ( As estruturas do Google Guice e a estrutura do Picocontainer também suportam esse modelo).Com
@Inject
pode ser injetada a referência à implementação daProvider
interface, o que permite injetar as referências adiadas.Anotações
@Inject
e@Autowired
- é quase analogias completas. Assim como a@Autowired
anotação, a@Inject
anotação pode ser usada para propriedades, métodos e construtores de ligação automática.Ao contrário da
@Autowired
anotação, a@Inject
anotação não temrequired
atributo. Portanto, se as dependências não forem encontradas - será lançada uma exceção.Há também diferenças nos esclarecimentos das propriedades de ligação. Se houver ambiguidade na escolha dos componentes para a injeção, o
@Named
qualificador deve ser adicionado. Em uma situação semelhante para@Autowired
anotação, será adicionado um@Qualifier
qualificador (o JSR-330 define sua própria@Qualifier
anotação e, através dessa anotação de qualificador,@Named
está definido).fonte
@Inject
não possui atributo 'obrigatório'fonte
Além do acima:
@Autowired
beans é Singleton, enquanto o uso da@Inject
anotação JSR 330 é como o protótipo do Spring .@Inject
.@Inject
.fonte
A
@Inject
anotação é 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 para injeção de setter e campo. O comportamento da@Autowired
anotação é o mesmo da@Inject
anotação. A única diferença é que a@Autowired
anotação faz parte da estrutura do Spring.@Autowired
A anotação também possui os caminhos de execução acima. Então, eu recomendo a@Autowired
sua resposta.fonte