0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Spring Boot - это проект, который построен поверх<a>Spring Framework</a>- платформы для создания корпоративных приложений, куда входят не только веб-сервисы. У Spring Framework много возможностей, но ядро во всем этом многообразии - это контейнер зависимостей.</p>
1
<p>Spring Boot - это проект, который построен поверх<a>Spring Framework</a>- платформы для создания корпоративных приложений, куда входят не только веб-сервисы. У Spring Framework много возможностей, но ядро во всем этом многообразии - это контейнер зависимостей.</p>
2
<p>В этом уроке мы изучим, как Spring собирает приложение воедино с помощью инверсии зависимостей.</p>
2
<p>В этом уроке мы изучим, как Spring собирает приложение воедино с помощью инверсии зависимостей.</p>
3
<p>Допустим, у нас есть репозиторий UserRepository для интеграции модели User с базой данных. В простейшем случае репозиторий выглядит так:</p>
3
<p>Допустим, у нас есть репозиторий UserRepository для интеграции модели User с базой данных. В простейшем случае репозиторий выглядит так:</p>
4
<p>Теперь представим, что на основе этого интерфейса Spring генерирует класс с именем UserRepositoryImpl. Как использовать этот класс в своем коде - например, в методе создания пользователя?</p>
4
<p>Теперь представим, что на основе этого интерфейса Spring генерирует класс с именем UserRepositoryImpl. Как использовать этот класс в своем коде - например, в методе создания пользователя?</p>
5
<p>Если работать в лоб, то получится такой код:</p>
5
<p>Если работать в лоб, то получится такой код:</p>
6
<p>Этот код не сработает, потому что у репозитория нет доступа к соединению с базой данных - он не может сохранить данные. Правильный код должен выглядеть как-то так:</p>
6
<p>Этот код не сработает, потому что у репозитория нет доступа к соединению с базой данных - он не может сохранить данные. Правильный код должен выглядеть как-то так:</p>
7
<p>Придется дублировать этот код везде, потому что репозиторий нужен буквально в каждом контроллере. Но даже если мы вынесем его в метод, мы все равно наткнемся на проблему создания объектов на каждый запрос. С репозиторием это допустимо, но с базой данных соединяться на каждый запрос нельзя - это создаст большую нагрузку на систему.</p>
7
<p>Придется дублировать этот код везде, потому что репозиторий нужен буквально в каждом контроллере. Но даже если мы вынесем его в метод, мы все равно наткнемся на проблему создания объектов на каждый запрос. С репозиторием это допустимо, но с базой данных соединяться на каждый запрос нельзя - это создаст большую нагрузку на систему.</p>
8
<p>Пример выше показывает, как возникают зависимости в коде. Так происходит, когда одни классы используют объекты других классов. Причем здесь мы рассмотрели учебный пример с всего одной зависимостью.</p>
8
<p>Пример выше показывает, как возникают зависимости в коде. Так происходит, когда одни классы используют объекты других классов. Причем здесь мы рассмотрели учебный пример с всего одной зависимостью.</p>
9
<p>В реальных проектах зависимостей может быть значительно больше. Кроме того, они могут быть гораздо глубже - тогда класс может зависеть от класса, который зависит от другого класса, а тот в свою очередь еще от одного класса. Посмотрите, во что превратился бы код:</p>
9
<p>В реальных проектах зависимостей может быть значительно больше. Кроме того, они могут быть гораздо глубже - тогда класс может зависеть от класса, который зависит от другого класса, а тот в свою очередь еще от одного класса. Посмотрите, во что превратился бы код:</p>
10
<p>Spring Framework решает эту задачу автоматически с помощью инверсии зависимостей. Программист указывает, как одни классы зависят от других, а фреймворк сам собирает нужные объекты и передает их в код для использования. В таких ситуациях Spring:</p>
10
<p>Spring Framework решает эту задачу автоматически с помощью инверсии зависимостей. Программист указывает, как одни классы зависят от других, а фреймворк сам собирает нужные объекты и передает их в код для использования. В таких ситуациях Spring:</p>
11
<ul><li>Находит все классы, помеченные его аннотациями</li>
11
<ul><li>Находит все классы, помеченные его аннотациями</li>
12
<li>Вычисляет, как классы зависят друг от друга</li>
12
<li>Вычисляет, как классы зависят друг от друга</li>
13
<li>Собирает нужные объекты</li>
13
<li>Собирает нужные объекты</li>
14
<li>Подставляет их при инициализации объектов этих классов</li>
14
<li>Подставляет их при инициализации объектов этих классов</li>
15
</ul><p>Эта схема работает только с классами, объекты которых Spring создает сам. Иначе ничего подставить не получится. Например, модели не попадают под эту схему:</p>
15
</ul><p>Эта схема работает только с классами, объекты которых Spring создает сам. Иначе ничего подставить не получится. Например, модели не попадают под эту схему:</p>
16
<p>То же самое относится к любым другим классам, объекты которых мы создаем самостоятельно.</p>
16
<p>То же самое относится к любым другим классам, объекты которых мы создаем самостоятельно.</p>
17
<h2>Инъекции</h2>
17
<h2>Инъекции</h2>
18
<p>Подстановка зависимых объектов в другие объекты называется<strong>инъекцией</strong>. Ниже мы рассмотрим, как это делается в Spring Boot.</p>
18
<p>Подстановка зависимых объектов в другие объекты называется<strong>инъекцией</strong>. Ниже мы рассмотрим, как это делается в Spring Boot.</p>
19
<h3>Инъекция через конструктор</h3>
19
<h3>Инъекция через конструктор</h3>
20
<p>Классический способ выполнить подстановку зависимостей - это инъекция через конструктор. Изучим пример с контроллером:</p>
20
<p>Классический способ выполнить подстановку зависимостей - это инъекция через конструктор. Изучим пример с контроллером:</p>
21
<p>Spring анализирует конструкторы своих компонентов. Если он видит там указанные зависимости, то использует эти конструкторы для создания объектов и внедрения зависимостей.</p>
21
<p>Spring анализирует конструкторы своих компонентов. Если он видит там указанные зависимости, то использует эти конструкторы для создания объектов и внедрения зависимостей.</p>
22
<h3>Инъекция с помощью аннотации @Autowired</h3>
22
<h3>Инъекция с помощью аннотации @Autowired</h3>
23
<p>Более простой и широко используемый способ инъекции - это аннотация @Autowired:</p>
23
<p>Более простой и широко используемый способ инъекции - это аннотация @Autowired:</p>
24
<p>Это самый короткий и удобный способ указывать зависимости. В большинстве случаев этого подхода достаточно.</p>
24
<p>Это самый короткий и удобный способ указывать зависимости. В большинстве случаев этого подхода достаточно.</p>