Î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;
}
}
Întrebări & Exemple de Cod:
@Qualifier și @Primary în Spring BootAi o nelămurire despre utilizarea comenzii
@Qualifier și @Primary în Spring Bootsau 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.