Spring Boot
Теория: Инверсия зависимостей
Spring Boot — это проект, который построен поверх Spring Framework — платформы для создания корпоративных приложений, куда входят не только веб-сервисы. У Spring Framework много возможностей, но ядро во всем этом многообразии — это контейнер зависимостей.
В этом уроке мы изучим, как Spring собирает приложение воедино с помощью инверсии зависимостей.
Допустим, у нас есть репозиторий UserRepository для интеграции модели User с базой данных. В простейшем случае репозиторий выглядит так:
Теперь представим, что на основе этого интерфейса Spring генерирует класс с именем UserRepositoryImpl. Как использовать этот класс в своем коде — например, в методе создания пользователя?
Если работать в лоб, то получится такой код:
Этот код не сработает, потому что у репозитория нет доступа к соединению с базой данных — он не может сохранить данные. Правильный код должен выглядеть как-то так:
Придется дублировать этот код везде, потому что репозиторий нужен буквально в каждом контроллере. Но даже если мы вынесем его в метод, мы все равно наткнемся на проблему создания объектов на каждый запрос. С репозиторием это допустимо, но с базой данных соединяться на каждый запрос нельзя — это создаст большую нагрузку на систему.
Пример выше показывает, как возникают зависимости в коде. Так происходит, когда одни классы используют объекты других классов. Причем здесь мы рассмотрели учебный пример с всего одной зависимостью.
В реальных проектах зависимостей может быть значительно больше. Кроме того, они могут быть гораздо глубже — тогда класс может зависеть от класса, который зависит от другого класса, а тот в свою очередь еще от одного класса. Посмотрите, во что превратился бы код:
Spring Framework решает эту задачу автоматически с помощью инверсии зависимостей. Программист указывает, как одни классы зависят от других, а фреймворк сам собирает нужные объекты и передает их в код для использования. В таких ситуациях Spring:
- Находит все классы, помеченные его аннотациями
- Вычисляет, как классы зависят друг от друга
- Собирает нужные объекты
- Подставляет их при инициализации объектов этих классов
Эта схема работает только с классами, объекты которых Spring создает сам. Иначе ничего подставить не получится. Например, модели не попадают под эту схему:
То же самое относится к любым другим классам, объекты которых мы создаем самостоятельно.
Инъекции
Подстановка зависимых объектов в другие объекты называется инъекцией. Ниже мы рассмотрим, как это делается в Spring Boot.
Инъекция через конструктор
Классический способ выполнить подстановку зависимостей — это инъекция через конструктор. Изучим пример с контроллером:
Spring анализирует конструкторы своих компонентов. Если он видит там указанные зависимости, то использует эти конструкторы для создания объектов и внедрения зависимостей.
Инъекция с помощью аннотации @Autowired
Более простой и широко используемый способ инъекции — это аннотация @Autowired:
Это самый короткий и удобный способ указывать зависимости. В большинстве случаев этого подхода достаточно.



