@Qualifier și @Primary în Spring Boot în Spring Boot

core Spring Boot 3.x / Java 17+ Q&A / Distribuie cod

Ghid complet pentru rezolvarea ambiguității la injectarea de dependințe în Spring Boot când există multiple implementări pentru aceeași interfață.

Sintaxă
@Qualifier("beanName") / @Primary

În dezvoltarea aplicațiilor modulare cu Spring Boot, este o practică frecventă să definești o interfață comună (de exemplu, NotificationService) implementată de mai multe clase specifice: EmailNotificationService, SmsNotificationService sau PushNotificationService.

Dacă încerci să injectezi direct interfața fără instrucțiuni suplimentare, containerul Spring IoC va arunca celebra excepție NoUniqueBeanDefinitionException, semnalând că nu știe ce implementare concretă să aleagă. Adnotările @Primary și @Qualifier rezolvă această ambiguitate:

  • @Primary: Stabilește implementarea implicită (preferată) ce va fi injectată oriunde nu se specifică explicit o altă cerință.
  • @Qualifier("numeBean"): Permite specificarea exactă a bean-ului dorit la punctul de injectare (pe parametrul din constructor sau câmp).
Exemplu: Folosirea @Qualifier și @Primary la injectarea prin constructor
package ro.dexblog.demo.service;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;

public interface PaymentGateway {
    void processPayment(double amount);
}

@Service
@Primary // Gateway-ul implicit
public class StripePaymentGateway implements PaymentGateway {
    @Override
    public void processPayment(double amount) {
        System.out.println("Procesare plată cu Stripe: " + amount + " RON");
    }
}

@Service("paypalGateway")
public class PaypalPaymentGateway implements PaymentGateway {
    @Override
    public void processPayment(double amount) {
        System.out.println("Procesare plată cu PayPal: " + amount + " RON");
    }
}

@Service
public class CheckoutService {
    private final PaymentGateway defaultGateway;
    private final PaymentGateway specificGateway;

    // Stripe va fi injectat ca defaultGateway (@Primary)
    // Paypal va fi injectat pe specificGateway datorită adnotării @Qualifier
    public CheckoutService(PaymentGateway defaultGateway,
                           @Qualifier("paypalGateway") PaymentGateway specificGateway) {
        this.defaultGateway = defaultGateway;
        this.specificGateway = specificGateway;
    }
}

Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: @Qualifier și @Primary în Spring Boot

Ai o nelămurire despre utilizarea comenzii @Qualifier și @Primary în Spring Boot sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.