1

Без Spring'a

Есть обычный класс GoogdClient который реализует интерфейс ClientRepo

public class GoogdClient implements ClientRepo {
}

У класса есть метод, который был имплементирован из интерфейса. Он ищет по номеру Whatsapp, а если находит - возвращает клиента. Этот метод называется findByWhatsapp()

Чтобы внедрить этот метод в контроллер без Spring мне бы пришлось бы в контроллере создать Объект GoogdClient goodClient = new и вызвать у новосозданного объекта goodClient метод findByWhatsapp() Так?

Что делает Spring

Я просто в контроллер внедряю (injection) @Autiwired интерфейс, класс GoogdClient я вообще не создаю Spring мне из этого внедрения создаёт класс (Какой класс? Какой у него тип?) Потом создаёт объект этого класса, у которого я и вызываю метод findByWhatsapp()

Так?

Roman C
  • 9,043
  • 4
  • 20
  • 28
  • Класса GoogdClient в Spring у меня вообще не существует. - как объявлен интерфейс ClientRepo (в частности наследуется ли он от какого-то интерфейса и есть ли на нем аннотации)? Вы вероятно используете spring-data (прямо или через spring-boot) и вопрос об этом, т.е. о реализации репозитория которую использует spring? – Roman-Stop RU aggression in UA Aug 21 '21 at 13:36
  • 2
    Для общего понимания, не применительно к spring, есть вот такой ответ – tym32167 Aug 21 '21 at 14:03

2 Answers2

1

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

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.

Roman C
  • 9,043
  • 4
  • 20
  • 28
0

Spring сканирует классы и ищет подходящий для инъекции, в данном случае он находит класс GoogdClient, которые имплементирует ClientRepo и понимает, что он подходит. ClientRepo же помечен у вас как бин? Попробуйте создать другую имплементацию интерфейса ClientRepo и посмотрите, что произойдет при старте приложения

  • Нет. Класса GoogdClient в Spring у меня вообще не существует. Он есть в проекте без спринга. А имплементиркю я вообще интерфейс, что для меня дико, так как меня учили что НЕЛЬЗЯ создать объект интерфейса – Дядя Фёдор Aug 21 '21 at 13:04