Differenze tra @Resource, @Autowired e @Inject in Spring Injection

0
4111

E’ una confusione molto comune tra gli sviluppatori che programmano con Spring su quale sia la vera differenza tra queste annotazioni utilizzati per l’inserimento di oggetti (Resource,Autowired eInject) .

Ci sono arrivate molte richieste, che ci chiedevano se potevano spiegare queste tre annotazioni. Infatti, questie tre annotazioni lavorano in modo molto simile nella maggior parte dei casi. Partiamo dai dettagli di base su queste tre annotazioni.

  1. Resource – Definito nel package javax.annotation
  2. Inject – Definito nel package javax.inject
  3. Autowired – Definito nel package org.springframework.bean.factory.

Ora faremo un esempio.

Andremo , a creare una semplice interfaccia Car che ha due classi di implementazione di Volkswagen e Toyota. Stiamo per iniettare questi tre tipi di annotazioni per di capire meglio la differenza.

Car.java

package quickgo.it.basic;
public interface Car {}

Volkswagen.java

package quickgo.it.basic;
import org.springframework.stereotype.Component;
@Component
public class Volkswagen implements Car {}

Toyota.java
package quickgo.it.basic;
import org.springframework.stereotype.Component;
@Component
public class Toyota implements Car {}

Iniettare Interface

@Resource
private Car auto;
@Autowired
private Car auto;
@Inject
private Car auto;

Eseguendo il codice sopra descritto verrà generata la seguente eccezione:

org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type [quickgo.it.basic.Car]is defined:
expected single matching bean but found 2:[volkswagen,toyota]

Tipo di campo

@Resource
private Volkswagen car;
@Autowired
private Volkswagen car;
@Inject
private Volkswagen car;

Il codice precedente funziona bene per tutte le definizioni. Tutti i tre tipi iniettano il tipo di bean “Volkswagen”.

Nome Qualifier

@Resource
@Qualifier( "Volkswagen" )
private Car car;
@Autowired
@Qualifier ( "Volkswagen" )
private Car car;
@Inject
@Qualifier ( "Volkswagen" )
private Car car;

Nel codice precedente,Resource funziona bene per iniettare il tipo di Volkswagen.

Ma, Autowired e Injects lanciano l’eccezione seguente.

org.springframework.beans.factory.NoSuchBeanDefinitionException:
No matching bean of type [quickgo.it.basics.Car] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true),
@org.springframework.beans.factory.annotation.Qualifier(value=nkl)}

La differenza principale è che, Autowired e Inject lavorano in maniera simile senza differenze. Queste due annotazioni utilizzando Autowired AnnotationBeanPostProcessor viene utilizzzato per iniettare le dipendenze. Ma, @Resource utilizza CommonAnnotationBeanPostProcessor per iniettare le dipendenze e c’è differenza nell’ordine di controllo.

Autowired E Inject

  1. Confronti per tipo
  2. Restrizione per Qualifica
  3. Confronti per nome

Resource

  1. Confronti per nome
  2. Confronti per tipo
  3. Restrizione per Qualifica (ignorata se viene trovata per nome)