HTML Diff
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>