Detaillierte Erklärung des Unterschieds zwischen @Autowired und @Resource

1. @Autowired-Konfiguration
Zunächst wird die Konfiguration der @Autowired-Annotation vorgestellt, mit der die Abhängigkeit der Autowired-Bean realisiert werden kann. Beispielsweise instanziiert und injiziert die folgende OrderService-Klasse ihr abhängiges OrderRepository-Objekt über die @Autowired-Annotation:
@Service
public class OrderService {     @Autowired     private OrderRepository orderRepository;     // ... } Es ist zu beachten, dass @ Autowired standardmäßig ausgeführt wird Abhängigkeitsinjektion nach Typ. Wenn sich im Container mehrere Beans desselben Typs befinden, wird eine Ausnahme ausgelöst. Wenn Sie zu diesem Zeitpunkt eine bestimmte Bean angeben müssen, können Sie dies mit der Annotation @Qualifier erreichen.
    


    



@Service
public class OrderService {     @Autowired     @Qualifier("orderRepositoryImpl")     private OrderRepository orderRepository;     // ... } Darüber hinaus können Sie die Annotation @Autowired auch für Konstruktoren, Setter-Methoden und andere benutzerdefinierte Methoden zur Abhängigkeitsinjektion verwenden. @Service public class OrderService {     private OrderRepository orderRepository;     @Autowired     public OrderService(OrderRepository orderRepository) {         this.orderRepository = orderRepository;     }     /**      * Setter-Injection.      */     @Autowired     public void setOrderRepository(OrderRepository orderRepository ) {
    



    





    

    




    





        this.orderRepository = orderRepository;
    }
    
    /**
     * Benutzerdefinierte Methodeninjektion.
     */
    @Autowired
    public void injectOrderRepository(OrderRepository orderRepository) {         this.orderRepository = orderRepository;     }     // ... } 2. @Resource-Konfiguration Als nächstes stellen Sie @Resource vor Durch die Konfiguration von Anmerkungen kann auch die Abhängigkeit der automatischen Zusammenstellung von Beans realisiert werden. Im Vergleich zu @Autowired werden Namen für die Abhängigkeitsinjektion verwendet.


    



Beispielsweise instanziiert die folgende OrderService-Klasse ihr abhängiges OrderRepository-Objekt und fügt es über die @Resource-Annotation ein:


@Service
public class OrderService {     @Resource(name = "orderRepositoryImpl")     private OrderRepository orderRepository;     // ... } Es ist zu beachten, dass der Bean-Name standardmäßig mit dem Eigenschaftsnamen übereinstimmt. Wenn Sie einen Namen angeben müssen, können Sie ihn mit dem Namensattribut festlegen.
    


    


Gleichzeitig unterstützt @Resource auch das Typattribut, das je nach Typ eine Abhängigkeitsinjektion durchführen kann. Zum Beispiel der folgende Code:


@Service
public class OrderService {     @Resource(type = OrderRepository.class)     private OrderRepository orderRepository;     // ... } 3. Vergleich der Unterschiede Zusammenfassend lässt sich sagen, dass der Unterschied zwischen den beiden hauptsächlich in der Art der Abhängigkeitsinjektion liegt.
    


    



Für @Autowired erfolgt die Abhängigkeitsinjektion je nach Typ. Wenn mehrere Beans desselben Typs vorhanden sind, müssen Sie @Qualifier verwenden, um sie zu unterscheiden. Und @Resource führt eine Abhängigkeitsinjektion entsprechend dem Namen oder Typ durch und konfiguriert sie über das Namens- oder Typattribut.

Im Einsatz können beide die Abhängigkeit von Autowiring-Beans erkennen, die Nutzungsszenarien unterscheiden sich jedoch geringfügig. Wenn wir nur nach Typ injizieren müssen, ist @Autowired im Allgemeinen vorzuziehen. Wenn Sie nach Name oder Typ injizieren müssen, wird @Resource bevorzugt.

Es ist zu beachten, dass @Autowired und @Qualifier ab Spring 5.1 über eine neue Funktion verfügen – Standardanmerkungswerte. Das heißt, beim Injizieren entsprechend dem Typ kann der spezifische Bean-Name über den Standardwert der @Qualifier-Annotation angegeben werden. Auf diese Weise werden die Vorteile von @Resource bis zu einem gewissen Grad geschwächt.
@Service
public class OrderService {     @Autowired     @Qualifier("orderRepositoryImpl")     private OrderRepository orderRepository;     // ... } Daher sollten Sie bei der Verwendung die entsprechende Annotation entsprechend der spezifischen Situation auswählen, um die Abhängigkeitsinjektion zu implementieren.
    



    


Ich denke du magst

Origin blog.csdn.net/weixin_65837469/article/details/130606424
Empfohlen
Rangfolge