Помогите понять dependency injection
Без Spring'a
Есть обычный класс GoogdClient который реализует интерфейс ClientRepo
public class GoogdClient implements ClientRepo {
}
У класса есть метод, который был имплементирован из интерфейса. Он ищет по номеру Whatsapp, а если находит - возвращает клиента. Этот метод называется findByWhatsapp()
Чтобы внедрить этот метод в контроллер без Spring мне бы пришлось бы в контроллере создать Объект GoogdClient goodClient = new и вызвать у новосозданного объекта goodClient метод findByWhatsapp() Так?
Что делает Spring
Я просто в контроллер внедряю (injection)
@Autiwired интерфейс, класс GoogdClient я вообще не создаю
Spring мне из этого внедрения создаёт класс (Какой класс? Какой у него тип?)
Потом создаёт объект этого класса, у которого я и вызываю метод findByWhatsapp()
Так?
Ответы (2 шт):
Spring сканирует классы и ищет подходящий для инъекции, в данном случае он находит класс GoogdClient, которые имплементирует ClientRepo и понимает, что он подходит. ClientRepo же помечен у вас как бин? Попробуйте создать другую имплементацию интерфейса ClientRepo и посмотрите, что произойдет при старте приложения
Все что вам нужно, чтобы внедрить зависимость в контроллер без спринга, это создать метод, который возвращает экземпляр класса
public class Spring {
public static ClientRepo getClientRepo() {
return new GoogdClient();
}
}
Поскольку Spring возвращает интерфейс, то можно не думая о том как имплементирован метод getClientRepo() использовать
Spring.getClientRepo();
который и вернёт экземпляр GoodClient.
Спринг делает почти тоже самое, только используя @Configuration:
@Configuration
public class Spring {
@Bean
public ClientRepo getClientRepo() {
return new GoogdClient();
}
}
после этого на все переменные с типом ClientRepo можно ставить @Autowired.