В основном это предназначено для решения двусмысленности при выполнении автоматического сканирования и использования @Autowired
. Я дал подробный ответ, объясняющий о @Autowired
в this answer, который также объясняет необходимость названия bean-компонентов.
Предположим, у нас есть 2 классов, реализующих CustomerRepository
:
@Repository
public class MyCustomerRepositoryImpl implements CustomerRepository {
}
@Repository
public class OtherCustomerRepositoryImpl implements CustomerRepository {
}
Давайте теперь предположим, что мы имеем класс, который использует @Autowired
впрыснуть CustomerRepository
:
public class SomeClass {
@Autowired
private CustomerRepository customerRepository;
}
При выполнении автоматического сканирования, вам нужно иметь возможность различать их. В противном случае Spring выкинет исключение, сказав, что он не может определить, какой из компонентов следует вводить.
Так что мы можем теперь добавить логическое имя для каждой реализации:
@Repository("myRepository")
public class MyCustomerRepositoryImpl implements CustomerRepository {
}
@Repository("otherRepository")
public class OtherCustomerRepositoryImpl implements CustomerRepository {
}
И теперь вы можете помочь Spring решить неоднозначность следующим образом:
public class SomeClass {
@Autowired
@Qualifier("myRepository")
private CustomerRepository customerRepository;
}