Вот почему. На самом деле, это сложная часть Spring, понимание того, когда и как происходит внедрение зависимости.
Вот порядок внедрения зависимости:
- Инъекция с помощью конструктора класса
- Инъекция полей (аннотирована
@Autowired
) - Инъекция сеттеров (также аннотирована
@Autowired
)
Трюки здесь: Если класс, аннотированный @Component
, также имеет только один конструктор не по умолчанию, тогда этот конструктор автоматически называется . Когда вы вызываете сначала конструктор, а затем поле, ваш @Qualifier
даже не интерпретируется Spring, потому что он завершается с ошибкой во время вызова конструктора, поэтому возникает исключение.
Чтобы решить эту проблему, у вас есть два варианта:
- Либо удалите ваш конструктор из
BinarySearch
. Затем Spring вызовет конструктор по умолчанию new BinarySearch()
, а затем выполнит внедрение в ваше поле sortAlgorithm
, используя @Qualifier
.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class BinarySearch {
@Autowired
@Qualifier("quickSort")
private SortAlgorithm sortAlgorithm;
public int[] search(int[] numbers) {
sortAlgorithm.sort();
System.out.println("This is from BinarySearch");
return numbers;
}
}
Или удалите аннотацию вашего поля и добавьте
@Qualifier
в свой параметр конструктора:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class BinarySearch {
private SortAlgorithm sortAlgorithm;
public BinarySearch(@Qualifier("quickSort") SortAlgorithm sortAlgorithm) {
super();
this.sortAlgorithm = sortAlgorithm;
}
public int[] search(int[] numbers) {
sortAlgorithm.sort();
System.out.println("This is from BinarySearch");
return numbers;
}
}
Надеюсь, это поможет!