Помогите понять 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 и посмотрите, что произойдет при старте приложения

→ Ссылка
Автор решения: Roman C

Все что вам нужно, чтобы внедрить зависимость в контроллер без спринга, это создать метод, который возвращает экземпляр класса

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.

→ Ссылка