spring Два класса имплементируют один интерфейс, как нам указать интерфейсу какой метод какого класса ему вызывать?

Рейтинг: -1Ответов: 1Опубликовано: 20.04.2023

У меня есть два класса dao(daoA и daoB), и есть интерфейс dao, от которого имплементируются эти два класса. При вызове метода интерфейса через поле в другом классе (внедрили интерфейс через autowired в поле), как spring поймёт какой конкретно метод какого класса ему вызывать? и Как нам указать интерфейсу какой метод конкретного класса ему нужно вызвать?

Ответы

▲ 2Принят

как spring поймёт какой конкретно метод какого класса ему вызывать?

Вопрос немного странный, если соответствующее поле определено как интерфейс, то будет вызываться метод, определённый в соответствующей реализации, которая будет подключена при помощи @Autowired.

Однако когда Spring обнаружит при сканировании несколько реализаций одного и того же интерфейса, возникнет неоднозначность, для разрешения которой следует использовать аннотацию @Qualifier при авто-подключении:

public interface Dao {
    void foo();
}

@Component("small")
public class SmallDao implements Dao {
    @Override public void foo() { System.out.println("small"); }
}

@Component("big")
public class BigDao implements Dao {
    @Override public void foo() { System.out.println("big"); }
}

Тогда для @Autowired следует указать квалификатор:

@Service
public class SmallFoo {
    @Autowired
    @Qualifier("small")
    private Dao dao;

    public void serviceMethod() {
        dao.foo();
    }
}

@Service
public class BigFoo {
    @Autowired
    @Qualifier("big")
    private Dao dao;

    public void bigBoom() {
        dao.foo();
    }
}

Также Spring может разрешить конфликт по имени поля без использования аннотации @Qualifier:

@Service
public class SmallFoo {
    @Autowired
    private Dao smallDao; // SmallDao auto-wired
}

@Service
public class BigFoo {
    @Autowired
    private Dao bigDao; // BigDao auto-wired
}