Şöyle düşünelim eğer ki bizim birden fazla öğretmenimiz varsa ve bunlardan hangisini Spring seçecek ?


PhysicsTeacher.java

@Component
public class PhysicsTeacher implements Teacher {
    @Override
    public String getName() {
        return "Minter Phsiycs";
    }
}


EnglishTeacher.java

@Component
public class EnglishTeacher implements Teacher{
    @Override
    public String getName() {
        return "Minter English";
    }
}


MathTeacher.java

@Component
public class MathTeacher implements Teacher{
    @Override
    public String getName() {
        return "Minter Math";
    }
}


Şimdi Constructor Injection kullanacağız artık peki Spring burada hangisini seçecek ?


@RestController
public class QualifierRestController {
 
    private final Teacher teacher;
 
    @Autowired
    public QualifierRestController(Teacher teacher) {
        this.teacher = teacher;
    }
    
    @RequestMapping(path="/qualifier",method=RequestMethod.GET)
    public String getTeacherName(){
        return this.teacher.getName();
    }
}


Bunu çalıştırdığımıda Spring bize hata verir çünkü 3 tane bizim Teacher'imiz var ve hangisini seçeceğine kendisi de karar veremez. Bu yüzden bizim specific olarak birini belirtmemiz lazım işte bu yüzde @Qualifier annotationunu kullanırız.

public QualifierRestController(@Qualifier("physicsTeacher") Teacher teacher)

Eğer ki constructoru bu şekilde değiştirirsek artık bir hata ile karşılaşmayız çünkü Fizik öğretmeni için gerekli bir beanı inject eder.

Burada belirttiğimiz "physicsTeacher" kısmı bean id değeridir. Bean ID ise bir sınıfın baş harfinin küçük olduğu kısımdır. camelCase kullanırız sadece baş harfi küçüktür. Diğer öğretmenler için ise:

  1. mathTeacher
  2. englishTeacher şeklinde kullanımı olur.