Spring — один из самых популярных фреймворков для Java. Расскажем, как устроен Spring, чем он хорош и сколько зарабатывают разработчики, владеющие этим фреймворком.
В написании статьи принял участие Антон Ефимов, Senior Software engineer
Содержание
Что такое Spring и зачем он нужен
Сегодня Java — один из самых распространенных языков программирования в веб-разработке. Но изначально в нем было недостаточно возможностей для создания модульных приложений. Для решения этой проблемы был создан фреймворк Spring.
Spring — фреймворк с открытым исходным кодом, написанный на Java. Его можно использовать для разработки на всех этих языках.
Spring предоставляет огромный набор инструментов и библиотек, которые упрощают и ускоряют процесс разработки, позволяя сосредоточиться на бизнес-логике приложения.
Начинать изучение Spring и работу с фреймворком рекомендуется после освоения основ программирования на Java. Это можно сделать на подготовительных курсах Хекслета. В программу включено много теоретических и практических заданий, которые выполняются в браузерном тренажере. Вы изучите основные понятия программирования, научитесь мыслить как разработчики, исправлять ошибки в коде, а еще создадите свою первую программу.
Использование Spring Framework
Фреймворк Spring программисты создали для написания бэкенда в веб-разработке. Но используют его во многих проектах как для создания десктопных, так и мобильных приложений. Почти всегда это энтерпрайз, то есть, создание крупных корпоративных порталов.
С помощью Spring разработчики могут быстро создавать масштабируемые и надежные приложения, а также использовать преимущества таких технологий, как Spring Boot, Spring Data и Spring Security.
Ключевая особенность Spring — в разнообразии возможностей. Это не один фреймворк, а целый набор готовых решений. В его состав входят дополнительные модули и библиотеки, которые совместно работают и регулярно пополняются.
Также Spring помогает писать код в парадигме аспектно-ориентированного программирования, но об этом мы поговорим позже.
Как устроен фреймворк Spring
Разберем популярные модули и компоненты Spring Framework, которые особенно полюбились Java-разработчикам.
IoC — Inversion of Control
Это базовый модуль Spring Framework, который отвечает за управление зависимостями. С его помощью можно объединить модули проекта в единую архитектуру. Ключевая особенность IoC состоит в том, что мы только предоставляем нужные зависимости контейнеру, которые потом автоматически подставляются в нужные места.
Благодаря технологии Dependency lnjection зависимости хранятся не в объектах, а в отдельных контейнерах. Это позволяет с легкостью вносить изменения в проект: взаимодействие между компонентами не будет нарушено.
Аспектно-ориентированное программирование
Аспектно-ориентированное программирование (АОП) в Spring основано на концепции разделения бизнес-логики и аспектов, таких как безопасность, обработка ошибок. АОП позволяет добавлять эти аспекты в код без изменения его основной структуры, что потом упрощает внесение исправлений в приложение.
Spring поддерживает АОП через механизм AspectJ, который позволяет создавать аспекты, описывающие дополнительные функции, и применять их к требуемым классам или методам. Например, можно создать аспект, который будет обрабатывать исключения, возникающие в определенном методе, без необходимости изменять этот метод.
Для использования АОП в Spring необходимо определить аспекты и указать, к каким классам или методам они должны применяться. Это можно сделать с помощью аннотаций или конфигурационных файлов. Также можно выбрать, чтобы Spring добавлял аспекты во время компиляции приложения.
Доступ к данным
Этот модуль состоит из нескольких библиотек. Их использование дает возможность интегрировать код на Java с базами данных. С помощью фреймворка можно наладить взаимодействие, чтобы программа могла получить доступ к хранилищу информации, и он был безопасным.
Фреймворк работает на основе стандарта Java DataBase Connectivity. Эта технология помогает соединить базу данных через драйвер с использованием уникального URL.
Один из подходов, который используется для упрощения работы с реляционными базами данных в рамках объектно-ориентированного программирования, это ORM. В Spring также есть другие возможности, как например Data Access Object.
Транзакции
Транзакции — это последовательность операций, выраженная через несколько запросов, которые должны быть выполнены атомарно: то есть либо все, либо ни одна. Система собирает несколько запросов в один и отправляет их в базу данных.
У Spring Framework есть инструменты для безопасной работы с транзакциями. Этот модуль гарантирует сохранность данных и поддержку вложенных, локальных и глобальных транзакций.
MVC
Это шаблон для проектирования веб-приложений по системе Model — View — Controller. То есть при создании нового проекта его делят на:
- Модель — данные, которые использует приложение для своей функциональности.
- Отображение — пользовательский интерфейс.
- Контроллер — принципы изменения модели в зависимости от действий пользователя.
В Spring Framework этот шаблон добавили относительно поздно. Зато этот модуль приобрел много дополнительных функций. Например, возможность привязать функциональность к выбранному интерфейсу, разделение слоев и замену интерфейсов.
Аутентификация и авторизация
В Spring модуль аутентификации и авторизации включает в себя несколько компонентов, которые позволяют пользователям проходить аутентификацию и получать доступ к ресурсам в приложении. Вот основные компоненты:
-
AuthenticationManager — этот интерфейс позволяет управлять процессом аутентификации, включая проверку учетных данных пользователя и выдачу токена доступа.
-
UserDetailsService — этот интерфейс предоставляет информацию о пользователе: имя, пароль, роль. Spring поддерживает реализацию этого интерфейса через JDBC или Hibernate.
-
UsernamePasswordAuthenticationToken — этот класс представляет собой объект, который содержит имя пользователя и пароль для аутентификации.
-
DaoAuthenticationProvider — этот класс используется для аутентификации пользователя на основе его имени пользователя и пароля. Он использует UserDetailsService для получения информации о пользователе и сравнивает ее с введенными учетными данными.
Эти компоненты могут быть использованы для создания системы аутентификации и авторизации на основе ролей в Spring. Например, вы можете создать пользовательский интерфейс для входа, который использует AuthenticationManager для проверки учетных данных пользователя, а затем применяет роли к пользователю с помощью DaoAuthenticationProvider.
Spring Cloud
Этот модуль отвечает за взаимодействие кода с распределенными системами. Он поддерживает технологии, которые используют центры обработки данных и PaaS-платформы — веб-серверы с инфраструктурой для проектов.
В этом модуле представлены решения, которые позволяют сбалансировать нагрузку на сервер, проводить маршрутизацию и наладить обмен данными.
Roo
Этот модуль Spring Framework используют для создания бизнес-приложений. На его основе можно создать многофункциональный пользовательский интерфейс.
Roo предлагает разработчикам простой и оптимизированный код без системных библиотек и высокого потребления ресурсов.
Integration
Этот модуль отвечает за интеграцию с внешними системами, обмен сообщениями внутри приложения и обработку информации из всех источников. Также его можно применять как движок для создания микросервисов.
У этого модуля есть несколько готовых шаблонов, которые позволяют быстро наладить систему интеграции приложений. Он поддерживает связи с веб-сервисами архитектуры REST и SOAP.
Batch
Этот модуль представляет собой платформу, на основе которой создают пакетные приложения. Главное достоинство фреймворка — масштабируемость. Это делает его подходящим и для небольших, и для крупных приложений.
Но чаще модули применяют для приложений с многократно используемыми функциями. Batch позволяет им эффективно обрабатывать большие объемы информации и управлять ресурсами.
Spring Boot
Этот модуль отвечает за координацию работы всего Spring. В начале разработки фреймворк нужно конфигурировать, что занимает много времени. А Spring Boot позволяет автоматизировать процесс настройки.
С помощью модуля можно быстро создавать проекты с использованием стартовых пакетов и разворачивать приложения.
Одна из главных функций Spring Boot — управление зависимостями и загрузка дополнительных модулей. Также он может автоматически настроить базу данных для программы.
Сколько зарабатывают Spring-программисты
Spring — одна из самых популярных технологий для разработки корпоративных приложений по данным JetBrains.
Его аналоги используют гораздо реже. Фактически эта технология доминирует на рынке программирования на Java. По данным разработчиков JRebel, все альтернативы этого фреймворка вместе взятые имеют меньше пользователей.
Можно сделать вывод: если вы хотите заниматься коммерческой разработкой на Java и ищите свой стек технологий, Spring будет самым логичным выбором. С ним будет гораздо легче найти работу в этой сфере, чем с его аналогами.
На декабрь 2023 года на hh.ru Spring как требуемая технология указана в 2169 вакансиях. Для сравнения — Java указан в 6 429 вакансиях.
«Хабр.Карьера» собрала статистику по заработку программистов в 2023 в зависимости от стека технологий.
Разработчики со знанием Java Spring Framework зарабатывают в зависимости от квалификации:
- 99 000 рублей — джуны.
- 189 000 рублей — мидлы.
- 296 000 рублей — сеньоры.
- 336 000 рублей — тимлиды.
Средняя зарплата программиста с этим стеком — 218 000 рублей.
Есть отдельная статистика зарплат по Spring Boot. Со знанием этой технологии зарабатывают:
- 102 000 рублей — джуны.
- 193 000 рублей — мидлы.
- 295 000 рублей — сеньоры.
- 312 000 рублей — тимлиды.
В среднем бэкендеры со знанием Spring Boot зарабатывают 205 000 рублей.
Преимущества Spring
Универсальность и оптимизация работы
Spring — это масштабная инфраструктура с инструментами буквально на все случаи жизни. В его составе огромное количество модулей, позволяющих решать как стандартные, так и сложные специфические задачи.
Все фреймворки пишут как готовые решения для минимизации рутинных операций. Spring — не исключение. Он предоставляет разработчику целых набор готовых шаблонов и все они экономят время.
Большой выбор инструментов
Spring — один из самых разветвленных фреймворков. На его базе можно реализовать практически любое решения. В статье описаны самые популярные модули, но их гораздо больше.
Популярность
Spring широко востребован в среде Java-разработчиков. У этого фреймворка огромное комьюнити, исчерпывающая документация и регулярно выходящие дополнения. На нем написаны тысячи крупных проектов, которые требуют поддержки, что делает актуальным изучение Spring.
Бесплатность
Java называют языком программирования для крупных корпораций. У него есть платные и закрытые инструменты. А Spring распространяют бесплатно, что снижает порог входа и позволяет учить его новичкам.
Недостатки Spring
Сложность
Spring — огромная и нагруженная инфраструктура. Перед работой новичку придется внимательно прочесть документацию и разобраться в возможностях фреймворка.
Долгая настройка
Запуск и адаптация Spring к конкретному проекту потребует много времени. Частично это можно решить, используя Spring Boot.
Большой объем кода
Используя этот фреймворк, разработчики сталкиваются с необходимостью тщательной оптимизации. Это не проблема технологии как таковой, но на практике проекты на Spring могут содержать много лишнего кода и ненужных зависимостей.
Небольшой экскурс в историю: как появился Spring
Отсутствие модульности в языке Java не мешало первым программистам, пока не началась эпоха разработки веб-приложений. Для них нужен был дополнительный функционал, поэтому разработчики языка добавили JavaBeans. Это классы, позволяющие объединять несколько объектов в один для лучшей передачи данных.
JavaBeans стал популярным инструментом для оптимизации разработки. Но его возможностей также было недостаточно для создания сложных многопользовательских приложений.
Тогда JavaBeans «усилили» новой технологией Enterprise JavaBeans. Она позволяла улучшить процесс сохранения данных и упростила разработку сложных корпоративных приложений.
Но у Enterprise JavaBeans был серьезный недостаток: она делала код чрезмерно сложным. Так что разработчики продолжили искать новое решение, и оно нашлось в 2003 году.
Команда разработчиков Sprinkler — системы для управления контентом — планировала внедрить в Spring широкий функционал: обработку исключений, управление транзакциями, зависимости. Они столкнулись с необходимостью писать большое количество кода с нуля и решили сделать фреймворк на основе своих разработок.
В 2003 эта команда презентовала тестовую версию Spring Framework, а еще через год случился релиз полностью рабочего ПО. Этот фреймворк быстро занял доминирующее положение на рынке веб-разработки на Java.
Принципы Spring
В основе идеологии этого фреймворка лежит три принципа.
-
Универсальность. Если другие фреймворки обычно пишут под определенные решения, то Spring — это фактически платформа для «всего» в Java. На его фундаменте можно написать любые приложения, а его новые модули должны иметь универсальное применение.
-
Легкость. Этот фреймворк написан по принципу минимального воздействия. То есть каждый модуль включает в себя только необходимые функции и ничего лишнего. За счет этого готовые решения в Spring проще интегрировать с другими инструментами. А сам код отличает лаконичность.
-
Интегрированная инфраструктура. Сильная часть Spring — связи между компонентами. Все технологии в рамках этого инструмента обеспечены хорошим взаимодействием друг с другом. Это сделано за счет инверсии контроля — способа внедрения зависимостей.
Как начать пользоваться Spring Framework
На официальном сайте Spring есть руководство по подключению фреймворка. С его помощью вы сможете написать простейшую программу «Hello, World!» на Spring.
В начале знакомства с фреймворком можно использовать обучающие материалы, которые находятся в свободном доступе, в том числе на официальном сайте — там целая кладезь полезной информации. Есть также русскоязычные сообщества, специализированные сайты и форумы для общения с теми, кто разделяет ваши интересы. Например, Хекслет Комьюнити в Telegram.
Начинать изучение Spring и работу с фреймворком рекомендуется после освоения основ программирования на Java. Это можно сделать на подготовительных курсах Хекслета. В программу включено много теоретических и практических заданий, которые выполняются в браузерном тренажере. Вы изучите основные понятия программирования, научитесь мыслить как разработчики, исправлять ошибки в коде, а еще создадите свою первую программу.
<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 20:07:18 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="gtXvtnmwJh5nUR22ZJo1DTIEmG7M7sbSheBAPspaGeFtBCSBi86LftESOS5olcV68g21xMTZOHA4ANpqmF3-jw";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Что такое Spring Framework?</title>
<meta name="description" content="Узнайте, что такое Spring, чтобы научиться на нем программировать и стать востребованным разработчиком">
<link rel="canonical" href="https://ru.hexlet.io/blog/posts/spring-framework">
<meta property="og:title" content="Что такое Spring Framework?">
<meta property="og:description" content="Узнайте, что такое Spring, чтобы научиться на нем программировать и стать востребованным разработчиком">
<meta property="og:image" content="https://ru.hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA0NywicHVyIjoiYmxvYl9pZCJ9fQ==--ae7794451f0670bf8cb9719f7549157228d8697f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOlsxNDU2LDcyOF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--b2ecf6121248a24883cda19469732b47b57f4e80/spring%D1%84%D1%80%D0%B5%D0%B8%CC%86%D0%BC%D0%B2%D0%BE%D1%80%D0%BA-01.png">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="cd_F5Y5n5K6dekQBn24qhK43l4mgANPOlQCe5Zg6esGeDg7SfBlJzis5YJmTYdrzbj66I6g3LWwo4ASxyj2drw" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA0NywicHVyIjoiYmxvYl9pZCJ9fQ==--ae7794451f0670bf8cb9719f7549157228d8697f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOlsxNDU2LDcyOF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--b2ecf6121248a24883cda19469732b47b57f4e80/spring%D1%84%D1%80%D0%B5%D0%B8%CC%86%D0%BC%D0%B2%D0%BE%D1%80%D0%BA-01.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzY3NSwicHVyIjoiYmxvYl9pZCJ9fQ==--b3b44cb29727c1bcb0b9aee0c285371dc12aa50f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Code%20typing-pana.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzczNSwicHVyIjoiYmxvYl9pZCJ9fQ==--883f3fd4e1b571538035b5680c8d4a9eb504b1f6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Source%20code-amico.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzY3MSwicHVyIjoiYmxvYl9pZCJ9fQ==--ca5a6047d43e5c0f6d07b52e845817fa2c47ef02/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Code%20typing-bro.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzkyMywicHVyIjoiYmxvYl9pZCJ9fQ==--da8237868b3f1c36e3fe891b47b4869fa9f2e8ef/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Bug%20fixing-pana.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/blog/posts/show","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T20:07:17.990Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"zwvYVu2c-MCrq-N_lpVvynQu762vENl5VPYFASfDGUog2hNhH-JVoB3ox-eamp-9tCfCB6cnJ9vpFp9VdcT-JA","post":{"model_name":"BlogPost","category":{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},"creator":{"public_name":"Анастасия Уминская","id":694835,"is_tutor":false},"tags":[{"id":887,"slug":"java","name":"Java"}],"id":2593,"title":"Spring — что это за фреймворк и как он устроен","slug":"spring-framework","state":"published","summary":"Spring — один из самых популярных фреймворков для Java. Расскажем, как устроен Spring, чем он хорош и сколько зарабатывают разработчики, владеющие этим фреймворком.","votes_count":3,"created_at":"2023-12-28T11:09:33.833Z","published_at":"2023-12-28T13:55:23.094Z","body":"**Spring — один из самых популярных фреймворков для Java. Расскажем, как устроен Spring, чем он хорош и сколько зарабатывают разработчики, владеющие этим фреймворком.**\r\n\r\n\r\n> В написании статьи принял участие [Антон Ефимов](https://www.linkedin.com/in/efimovanton/), Senior Software engineer\r\n\r\n## Содержание\n\n## Что такое Spring и зачем он нужен\r\n\r\nСегодня [Java](https://ru.hexlet.io/blog/posts/yazyk-programmirovaniya-java-osobennosti-populyarnost-situatsiya-na-rynke-truda?promo_name=blog&promo_position=article-body&promo_type=link) — один из самых распространенных языков программирования в веб-разработке. Но изначально в нем было недостаточно возможностей для создания модульных приложений. Для решения этой проблемы был создан фреймворк Spring.\r\n\r\n**[Spring](https://spring.io/)** — фреймворк с открытым исходным кодом, написанный на Java. Его можно использовать для разработки на всех этих языках.\r\n\r\nSpring предоставляет огромный набор инструментов и библиотек, которые упрощают и ускоряют процесс разработки, позволяя сосредоточиться на бизнес-логике приложения.\r\n\r\n\r\n> Начинать изучение Spring и работу с фреймворком рекомендуется после освоения основ программирования на Java. Это можно сделать [на подготовительных курсах Хекслета](https://pre.hexlet.io/java?promo_name=base-java&promo_position=article-body&promo_type=link). В программу включено много теоретических и практических заданий, которые выполняются в браузерном тренажере. Вы изучите основные понятия программирования, научитесь мыслить как разработчики, исправлять ошибки в коде, а еще создадите свою первую программу.\r\n\r\n## Использование Spring Framework\r\n\r\nФреймворк Spring программисты создали для написания бэкенда в веб-разработке. Но используют его во многих проектах как для создания десктопных, так и мобильных приложений. Почти всегда это энтерпрайз, то есть, создание крупных корпоративных порталов.\r\n\r\nС помощью Spring разработчики могут быстро создавать масштабируемые и надежные приложения, а также использовать преимущества таких технологий, как Spring Boot, Spring Data и Spring Security.\r\n\r\nКлючевая особенность Spring — в разнообразии возможностей. Это не один фреймворк, а целый набор готовых решений. В его состав входят дополнительные модули и библиотеки, которые совместно работают и регулярно пополняются.\r\n\r\nТакже Spring помогает писать код в парадигме аспектно-ориентированного программирования, но об этом мы поговорим позже.\r\n\r\n::programs\r\n\r\n## Как устроен фреймворк Spring\r\n\r\nРазберем популярные модули и компоненты Spring Framework, которые особенно полюбились Java-разработчикам.\r\n\r\n### IoC — Inversion of Control\r\n\r\nЭто базовый модуль Spring Framework, который отвечает за управление зависимостями. С его помощью можно объединить модули проекта в единую архитектуру. Ключевая особенность IoC состоит в том, что мы только предоставляем нужные зависимости контейнеру, которые потом автоматически подставляются в нужные места.\r\n\r\nБлагодаря технологии Dependency lnjection зависимости хранятся не в объектах, а в отдельных контейнерах. Это позволяет с легкостью вносить изменения в проект: взаимодействие между компонентами не будет нарушено.\r\n\r\n### Аспектно-ориентированное программирование\r\n\r\nАспектно-ориентированное программирование (АОП) в Spring основано на концепции разделения бизнес-логики и аспектов, таких как безопасность, обработка ошибок. АОП позволяет добавлять эти аспекты в код без изменения его основной структуры, что потом упрощает внесение исправлений в приложение.\r\n\r\nSpring поддерживает АОП через механизм AspectJ, который позволяет создавать аспекты, описывающие дополнительные функции, и применять их к требуемым классам или методам. Например, можно создать аспект, который будет обрабатывать исключения, возникающие в определенном методе, без необходимости изменять этот метод.\r\n\r\nДля использования АОП в Spring необходимо определить аспекты и указать, к каким классам или методам они должны применяться. Это можно сделать с помощью аннотаций или конфигурационных файлов. Также можно выбрать, чтобы Spring добавлял аспекты во время компиляции приложения.\r\n\r\n### Доступ к данным\r\n\r\nЭтот модуль состоит из нескольких библиотек. Их использование дает возможность интегрировать код на Java с базами данных. С помощью фреймворка можно наладить взаимодействие, чтобы программа могла получить доступ к хранилищу информации, и он был безопасным.\r\n\r\nФреймворк работает на основе стандарта Java DataBase Connectivity. Эта технология помогает соединить базу данных через драйвер с использованием уникального URL.\r\n\r\nОдин из подходов, который используется для упрощения работы с реляционными базами данных в рамках объектно-ориентированного программирования, это ORM. В Spring также есть другие возможности, как например Data Access Object.\r\n\r\n### Транзакции\r\n\r\nТранзакции — это последовательность операций, выраженная через несколько запросов, которые должны быть выполнены атомарно: то есть либо все, либо ни одна. Система собирает несколько запросов в один и отправляет их в базу данных.\r\n\r\nУ Spring Framework есть инструменты для безопасной работы с транзакциями. Этот модуль гарантирует сохранность данных и поддержку вложенных, локальных и глобальных транзакций.\r\n\r\n### MVC\r\n\r\nЭто шаблон для проектирования веб-приложений по системе Model — View — Controller. То есть при создании нового проекта его делят на:\r\n\r\n- Модель — данные, которые использует приложение для своей функциональности.\r\n- Отображение — пользовательский интерфейс.\r\n- Контроллер — принципы изменения модели в зависимости от действий пользователя.\r\n\r\nВ Spring Framework этот шаблон добавили относительно поздно. Зато этот модуль приобрел много дополнительных функций. Например, возможность привязать функциональность к выбранному интерфейсу, разделение слоев и замену интерфейсов.\r\n\r\n::posts\r\n\r\n### Аутентификация и авторизация\r\n\r\nВ Spring модуль аутентификации и авторизации включает в себя несколько компонентов, которые позволяют пользователям проходить аутентификацию и получать доступ к ресурсам в приложении. Вот основные компоненты:\r\n\r\n- **AuthenticationManager** — этот интерфейс позволяет управлять процессом аутентификации, включая проверку учетных данных пользователя и выдачу токена доступа.\r\n- **UserDetailsService** — этот интерфейс предоставляет информацию о пользователе: имя, пароль, роль. Spring поддерживает реализацию этого интерфейса через JDBC или Hibernate.\r\n- **UsernamePasswordAuthenticationToken** — этот класс представляет собой объект, который содержит имя пользователя и пароль для аутентификации.\r\n- **DaoAuthenticationProvider** — этот класс используется для аутентификации пользователя на основе его имени пользователя и пароля. Он использует UserDetailsService для получения информации о пользователе и сравнивает ее с введенными учетными данными.\r\n\r\nЭти компоненты могут быть использованы для создания системы аутентификации и авторизации на основе ролей в Spring. Например, вы можете создать пользовательский интерфейс для входа, который использует AuthenticationManager для проверки учетных данных пользователя, а затем применяет роли к пользователю с помощью DaoAuthenticationProvider.\r\n\r\n### Spring Cloud\r\n\r\nЭтот модуль отвечает за взаимодействие кода с распределенными системами. Он поддерживает технологии, которые используют центры обработки данных и PaaS-платформы — веб-серверы с инфраструктурой для проектов.\r\n\r\nВ этом модуле представлены решения, которые позволяют сбалансировать нагрузку на сервер, проводить маршрутизацию и наладить обмен данными.\r\n\r\n\r\n\r\n### Roo\r\n\r\nЭтот модуль Spring Framework используют для создания бизнес-приложений. На его основе можно создать многофункциональный пользовательский интерфейс.\r\n\r\nRoo предлагает разработчикам простой и оптимизированный код без системных библиотек и высокого потребления ресурсов.\r\n\r\n### Integration\r\n\r\nЭтот модуль отвечает за интеграцию с внешними системами, обмен сообщениями внутри приложения и обработку информации из всех источников. Также его можно применять как движок для создания микросервисов.\r\n\r\nУ этого модуля есть несколько готовых шаблонов, которые позволяют быстро наладить систему интеграции приложений. Он поддерживает связи с веб-сервисами архитектуры REST и SOAP.\r\n\r\n### Batch\r\n\r\nЭтот модуль представляет собой платформу, на основе которой создают пакетные приложения. Главное достоинство фреймворка — масштабируемость. Это делает его подходящим и для небольших, и для крупных приложений.\r\n\r\nНо чаще модули применяют для приложений с многократно используемыми функциями. Batch позволяет им эффективно обрабатывать большие объемы информации и управлять ресурсами.\r\n\r\n### Spring Boot\r\n\r\nЭтот модуль отвечает за координацию работы всего Spring. В начале разработки фреймворк нужно конфигурировать, что занимает много времени. А [Spring Boot](https://spring.io/projects/spring-boot) позволяет автоматизировать процесс настройки.\r\n\r\nС помощью модуля можно быстро создавать проекты с использованием стартовых пакетов и разворачивать приложения.\r\n\r\nОдна из главных функций Spring Boot — управление зависимостями и загрузка дополнительных модулей. Также он может автоматически настроить базу данных для программы.\r\n\r\n## Сколько зарабатывают Spring-программисты\r\n\r\nSpring — одна из самых популярных технологий для разработки корпоративных приложений [по данным JetBrains](https://www.jetbrains.com/ru-ru/lp/devecosystem-2021/java/).\r\n\r\n\r\n\r\nЕго аналоги используют гораздо реже. Фактически эта технология доминирует на рынке программирования на Java. [По данным разработчиков JRebel](https://www.jrebel.com/blog/spring-boot-alternatives), все альтернативы этого фреймворка вместе взятые имеют меньше пользователей.\r\n\r\n\r\n\r\nМожно сделать вывод: если вы хотите заниматься коммерческой разработкой на Java и ищите свой стек технологий, Spring будет самым логичным выбором. С ним будет гораздо легче найти работу в этой сфере, чем с его аналогами.\r\n\r\nНа декабрь 2023 года на hh.ru Spring как требуемая технология указана в 2169 вакансиях. Для сравнения — Java указан в 6 429 вакансиях.\r\n\r\n[«Хабр.Карьера»](https://habr.com/ru/companies/habr_career/articles/746038/) собрала статистику по заработку программистов в 2023 в зависимости от стека технологий.\r\n\r\nРазработчики со знанием Java Spring Framework зарабатывают в зависимости от квалификации:\r\n\r\n- 99 000 рублей — джуны.\r\n- 189 000 рублей — мидлы.\r\n- 296 000 рублей — сеньоры.\r\n- 336 000 рублей — тимлиды.\r\n\r\nСредняя зарплата программиста с этим стеком — 218 000 рублей.\r\n\r\nЕсть отдельная статистика зарплат по Spring Boot. Со знанием этой технологии зарабатывают:\r\n\r\n- 102 000 рублей — джуны.\r\n- 193 000 рублей — мидлы.\r\n- 295 000 рублей — сеньоры.\r\n- 312 000 рублей — тимлиды.\r\n\r\nВ среднем бэкендеры со знанием Spring Boot зарабатывают 205 000 рублей.\r\n\r\n\r\n\r\n## Преимущества Spring\r\n\r\n### Универсальность и оптимизация работы\r\n\r\nSpring — это масштабная инфраструктура с инструментами буквально на все случаи жизни. В его составе огромное количество модулей, позволяющих решать как стандартные, так и сложные специфические задачи.\r\n\r\nВсе фреймворки пишут как готовые решения для минимизации рутинных операций. Spring — не исключение. Он предоставляет разработчику целых набор готовых шаблонов и все они экономят время.\r\n\r\n### Большой выбор инструментов\r\n\r\nSpring — один из самых разветвленных фреймворков. На его базе можно реализовать практически любое решения. В статье описаны самые популярные модули, но их гораздо больше.\r\n\r\n### Популярность\r\n\r\nSpring широко востребован в среде Java-разработчиков. У этого фреймворка огромное комьюнити, исчерпывающая документация и регулярно выходящие дополнения. На нем написаны тысячи крупных проектов, которые требуют поддержки, что делает актуальным изучение Spring.\r\n\r\n### Бесплатность\r\n\r\nJava называют языком программирования для крупных корпораций. У него есть платные и закрытые инструменты. А Spring распространяют бесплатно, что снижает порог входа и позволяет учить его новичкам.\r\n\r\n## Недостатки Spring\r\n\r\n### Сложность\r\n\r\nSpring — огромная и нагруженная инфраструктура. Перед работой новичку придется внимательно прочесть документацию и разобраться в возможностях фреймворка.\r\n\r\n### Долгая настройка\r\n\r\nЗапуск и адаптация Spring к конкретному проекту потребует много времени. Частично это можно решить, используя Spring Boot.\r\n\r\n### Большой объем кода\r\n\r\nИспользуя этот фреймворк, разработчики сталкиваются с необходимостью тщательной оптимизации. Это не проблема технологии как таковой, но на практике проекты на Spring могут содержать много лишнего кода и ненужных зависимостей.\r\n\r\n## Небольшой экскурс в историю: как появился Spring\r\n\r\nОтсутствие модульности в языке Java не мешало первым программистам, пока не началась эпоха разработки веб-приложений. Для них нужен был дополнительный функционал, поэтому разработчики языка добавили JavaBeans. Это классы, позволяющие объединять несколько объектов в один для лучшей передачи данных.\r\n\r\nJavaBeans стал популярным инструментом для оптимизации разработки. Но его возможностей также было недостаточно для создания сложных многопользовательских приложений.\r\n\r\nТогда JavaBeans «усилили» новой технологией Enterprise JavaBeans. Она позволяла улучшить процесс сохранения данных и упростила разработку сложных корпоративных приложений.\r\n\r\nНо у Enterprise JavaBeans был серьезный недостаток: она делала код чрезмерно сложным. Так что разработчики продолжили искать новое решение, и оно нашлось в 2003 году.\r\n\r\nКоманда разработчиков Sprinkler — системы для управления контентом — планировала внедрить в Spring широкий функционал: обработку исключений, управление транзакциями, зависимости. Они столкнулись с необходимостью писать большое количество кода с нуля и решили сделать фреймворк на основе своих разработок.\r\n\r\nВ 2003 эта команда презентовала тестовую версию Spring Framework, а еще через год случился релиз полностью рабочего ПО. Этот фреймворк быстро занял доминирующее положение на рынке веб-разработки на Java.\r\n\r\n\r\n\r\n## Принципы Spring\r\n\r\nВ основе идеологии этого фреймворка лежит три принципа.\r\n\r\n- **Универсальность**. Если другие фреймворки обычно пишут под определенные решения, то Spring — это фактически платформа для «всего» в Java. На его фундаменте можно написать любые приложения, а его новые модули должны иметь универсальное применение.\r\n- **Легкость**. Этот фреймворк написан по принципу минимального воздействия. То есть каждый модуль включает в себя только необходимые функции и ничего лишнего. За счет этого готовые решения в Spring проще интегрировать с другими инструментами. А сам код отличает лаконичность.\r\n- **Интегрированная инфраструктура**. Сильная часть Spring — связи между компонентами. Все технологии в рамках этого инструмента обеспечены хорошим взаимодействием друг с другом. Это сделано за счет инверсии контроля — способа внедрения зависимостей.\r\n\r\n\r\n\r\n## Как начать пользоваться Spring Framework\r\n\r\nНа официальном сайте Spring есть [руководство по подключению фреймворка](https://spring.io/quickstart/). С его помощью вы сможете написать простейшую программу «Hello, World!» на Spring.\r\n\r\nВ начале знакомства с фреймворком можно использовать обучающие материалы, которые находятся в свободном доступе, в том числе на официальном сайте — там целая кладезь полезной информации. Есть также русскоязычные сообщества, специализированные сайты и форумы для общения с теми, кто разделяет ваши интересы. Например, [Хекслет Комьюнити в Telegram](https://t.me/hexletcommunity).\r\n\r\n\r\n> Начинать изучение Spring и работу с фреймворком рекомендуется после освоения основ программирования на Java. Это можно сделать [на подготовительных курсах Хекслета](https://pre.hexlet.io/java?promo_name=base-java&promo_position=article-body&promo_type=link). В программу включено много теоретических и практических заданий, которые выполняются в браузерном тренажере. Вы изучите основные понятия программирования, научитесь мыслить как разработчики, исправлять ошибки в коде, а еще создадите свою первую программу.\r\n\r\n","reading_time":7,"url":"https://ru.hexlet.io/blog/posts/spring-framework","cover_thumb_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA0NywicHVyIjoiYmxvYl9pZCJ9fQ==--ae7794451f0670bf8cb9719f7549157228d8697f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbMTAwLDUwXSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--f0d4342fcdbdffa15c37fb02bfb423ac88d5c0c9/spring%D1%84%D1%80%D0%B5%D0%B8%CC%86%D0%BC%D0%B2%D0%BE%D1%80%D0%BA-01.png","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA0NywicHVyIjoiYmxvYl9pZCJ9fQ==--ae7794451f0670bf8cb9719f7549157228d8697f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/spring%D1%84%D1%80%D0%B5%D0%B8%CC%86%D0%BC%D0%B2%D0%BE%D1%80%D0%BA-01.png","cover_main_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA0NywicHVyIjoiYmxvYl9pZCJ9fQ==--ae7794451f0670bf8cb9719f7549157228d8697f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOlsxNDU2LDcyOF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--b2ecf6121248a24883cda19469732b47b57f4e80/spring%D1%84%D1%80%D0%B5%D0%B8%CC%86%D0%BC%D0%B2%D0%BE%D1%80%D0%BA-01.png","related_stacks_count":5},"relatedPosts":[{"model_name":"BlogPost","id":926,"title":"Библиотека React: особенности, перспективы, ситуация на рынке труда","slug":"biblioteka-react-review-article","summary":"В объявлениях о поиске программистов часто встречается требование уметь работать с React. Иногда работодатели ожидают знания React не только от фронтендеров, но и от бэкенд-разработчиков. Почему эта библиотека настолько популярная, стоит ли изучать её сегодня, каковы её перспективы по мнению опытных программистов? Ответы на эти и другие вопросы читайте в обзорной статье.","created_at":"2020-07-08T15:15:00.191Z","published_at":"2024-02-29T07:46:44.876Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTYyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--6bac7610f325471938a0e33f58eaa4c52527d66f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%87%D1%82%D0%BE%D1%82%D0%B0%D0%BA%D0%BE%D0%B5react-01.png"},{"model_name":"BlogPost","id":2592,"title":"Что такое Postman и как его использовать в тестировании API","slug":"postman","summary":"Postman — главный инструмент QA-инженера. С его помощью можно отправлять запросы к API, чтобы тестировать и документировать работу бэкенда сайта. Рассказываем, как правильно пользоваться Postman и из чего он состоит.","created_at":"2023-12-22T13:52:33.030Z","published_at":"2023-12-22T14:12:14.583Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA1MSwicHVyIjoiYmxvYl9pZCJ9fQ==--4fab4fd91df9064b754efcc81d232eddc09bed62/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/Postman-01.png"},{"model_name":"BlogPost","id":2589,"title":"Редактор кода Sublime Text — какие у него есть возможности и почему он популярен у разработчиков","slug":"sublime-text","summary":"Рассказываем, для чего программистам нужен редактор кода и разбираем один из самых популярных редакторов Sublime Text — его возможности, преимущества и недостатки.","created_at":"2023-12-08T12:24:31.045Z","published_at":"2023-12-08T12:25:51.554Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA2MywicHVyIjoiYmxvYl9pZCJ9fQ==--27f438ea9666f23794ea718ed7b407fde50044f8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80sublimatetext-01.png"}],"category":{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},"mainStackCategory":{"id":2,"name":"Курсы по веб-разработке","slug":"web_development","short_name":"Веб-разработка","order":190,"state":"published","category_slug":"courses_web_development"},"categories":[{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},{"id":3,"name":"Истории успеха","slug":"success","state":"published","created_at":"2016-07-30T12:57:18.308Z"},{"id":14,"name":"Дневник студента","slug":"student-diary","state":"published","created_at":"2019-02-25T13:27:09.471Z"},{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},{"id":12,"name":"Карьера","slug":"career","state":"published","created_at":"2017-07-21T15:42:21.481Z"}],"relatedLandings":[{"stack":{"id":132,"slug":"spring-boot","title":"Spring Boot","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":50,"duration_in_months":1},"id":224,"slug":"spring-boot","title":"Spring Boot","subtitle":"Навык создавать масштабируемые веб-приложения на Java с Spring Boot","subtitle_for_lists":"Навык работы с Spring Boot для масштабируемых веб-приложений","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"spring-boot","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzY3NSwicHVyIjoiYmxvYl9pZCJ9fQ==--b3b44cb29727c1bcb0b9aee0c285371dc12aa50f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Code%20typing-pana.png"},{"stack":{"id":3,"slug":"java","title":"Java-разработчик","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":30,"duration_in_months":10},"id":3,"slug":"java","title":"Java-разработчик","subtitle":"Изучите Java и фреймворк Spring Boot и REST API","subtitle_for_lists":"Изучите Java и фреймворк Spring Boot и REST API","locale":"ru","current":true,"duration_in_months_text":"10 месяцев","stack_slug":"java","price_text":"от 6 792 ₽","duration_text":"10 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzczNSwicHVyIjoiYmxvYl9pZCJ9fQ==--883f3fd4e1b571538035b5680c8d4a9eb504b1f6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Source%20code-amico.png"},{"stack":{"id":178,"slug":"fullstack-java","title":"Fullstack-разработчик на Java","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":null,"duration_in_months":16},"id":277,"slug":"fullstack-java","title":"Fullstack-разработчик на Java","subtitle":"","subtitle_for_lists":null,"locale":"ru","current":true,"duration_in_months_text":"16 месяцев","stack_slug":"fullstack-java","price_text":"от 7 934 ₽","duration_text":"16 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzY3MSwicHVyIjoiYmxvYl9pZCJ9fQ==--ca5a6047d43e5c0f6d07b52e845817fa2c47ef02/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Code%20typing-bro.png"},{"stack":{"id":36,"slug":"java-sicp","title":"СИКП на Java","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4100,"duration_in_months":1},"id":60,"slug":"java-sicp","title":"СИКП на Java","subtitle":"Навык понимать программы на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Изучите фундаментальные принципы программирования на Java","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"java-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"},{"stack":{"id":219,"slug":"qa-auto-engineer-java","title":"Автоматизатор тестирования на Java","audience":"for_programmers","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":110,"duration_in_months":6},"id":329,"slug":"qa-auto-engineer-java","title":"Автоматизатор тестирования на Java","subtitle":"Изучите Java и фреймворк для UI- и API-автотестов","subtitle_for_lists":"Изучите Java и фреймворк для UI- и API-автотестов","locale":"ru","current":true,"duration_in_months_text":"6 месяцев","stack_slug":"qa-auto-engineer-java","price_text":"от 4 281 ₽","duration_text":"6 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzkyMywicHVyIjoiYmxvYl9pZCJ9fQ==--da8237868b3f1c36e3fe891b47b4869fa9f2e8ef/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Bug%20fixing-pana.png"}]},"url":"/blog/posts/spring-framework","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","author":"Анастасия Уминская","name":"Spring — что это за фреймворк и как он устроен","datePublished":"2023-12-28T13:55:23.094Z","headline":"Spring — один из самых популярных фреймворков для Java. Расскажем, как устроен Spring, чем он хорош и сколько зарабатывают разработчики, владеющие этим фреймворком.","image":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA0NywicHVyIjoiYmxvYl9pZCJ9fQ==--ae7794451f0670bf8cb9719f7549157228d8697f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOlsxNDU2LDcyOF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--b2ecf6121248a24883cda19469732b47b57f4e80/spring%D1%84%D1%80%D0%B5%D0%B8%CC%86%D0%BC%D0%B2%D0%BE%D1%80%D0%BA-01.png","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":3}]}</script><div style="--container-size:var(--container-size-lg);margin-top:var(--mantine-spacing-xl);height:100%" class="m_7485cace mantine-Container-root" data-size="lg" data-strategy="block"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"position":1,"@type":"ListItem","item":{"@id":"/blog","name":"Блог Хекслета"}},{"position":2,"@type":"ListItem","item":{"@id":"/blog/categories/code","name":"Код"}},{"position":3,"@type":"ListItem","item":{"@id":"/blog/posts/spring-framework","name":"Spring — что это за фреймворк и как он устроен"}}]}</script><div style="margin-bottom:var(--mantine-spacing-xs)" class="m_8b3717df mantine-Breadcrumbs-root"><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/"><div style="color:inherit" class="m_4451eb3a mantine-Center-root"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-home-link "><path d="M20.085 11.085l-8.085 -8.085l-9 9h2v7a2 2 0 0 0 2 2h4.5"></path><path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 1.807 1.143"></path><path d="M20 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M20 16a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M15 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M21 16l-5 3l5 2"></path></svg></div></a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog">Блог Хекслета</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog/categories/code">Код</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root" data-size="sm">Spring — что это за фреймворк и как он устроен</p></div><style data-mantine-styles="inline">.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}@media(min-width: 36em){.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}}</style><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root __m__-_R_eub_"><style data-mantine-styles="inline">.__m__-_R_deub_{width:100%;}@media(min-width: 36em){.__m__-_R_deub_{width:70%;}}@media(min-width: 75em){.__m__-_R_deub_{width:75%;}}</style><div class="__m__-_R_deub_"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="1">Spring — что это за фреймворк и как он устроен</h1></div></div></div><div style="position:absolute;top:calc(18.75rem * var(--mantine-scale))" class=""></div><style data-mantine-styles="inline">.__m__-_R_2iub_{--grid-gutter:var(--mantine-spacing-xl);}</style><div class="m_410352e9 mantine-Grid-root __m__-_R_2iub_"><div class="m_dee7bd2f mantine-Grid-inner"><style data-mantine-styles="inline">.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}@media(min-width: 62em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:66.66666666666667%;--col-max-width:66.66666666666667%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_dmiub_"><div style="--stack-gap:var(--mantine-spacing-md);--stack-align:stretch;--stack-justify:flex-start;margin-bottom:var(--mantine-spacing-xl)" class="m_6d731127 mantine-Stack-root"><div class=""><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-xl)" class="m_4081bf90 mantine-Group-root"><button style="--badge-height:var(--badge-height-sm);--badge-padding-x:var(--badge-padding-x-sm);--badge-fz:var(--badge-fz-sm);--badge-bg:var(--mantine-color-default);--badge-color:var(--mantine-color-default-color);--badge-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);cursor:pointer;color:inherit" class="m_347db0ec mantine-Badge-root" data-variant="default" data-size="sm" type="button" aria-label="Java"><span class="m_5add502a mantine-Badge-label">Java</span></button></div><div style="--group-gap:calc(0.625rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-sm);color:var(--mantine-color-gray-text)" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-inline-end:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root">28 декабря 2023 г.</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-clock "><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path><path d="M12 7v5l3 3"></path></svg></div>7 минут</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div>3</div></div><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img style="--image-radius:var(--mantine-radius-md);--image-object-fit:cover;width:100%;height:100%" class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA0NywicHVyIjoiYmxvYl9pZCJ9fQ==--ae7794451f0670bf8cb9719f7549157228d8697f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOlsxNDU2LDcyOF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--b2ecf6121248a24883cda19469732b47b57f4e80/spring%D1%84%D1%80%D0%B5%D0%B8%CC%86%D0%BC%D0%B2%D0%BE%D1%80%D0%BA-01.png" alt="Spring — что это за фреймворк и как он устроен"/></div></div><div role="link" tabindex="0" style="cursor:pointer"><button style="display:block;width:100%" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Присоединяйтесь к нашему Telegram-сообществу"><div style="background-color:light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6))" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:auto;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-telegram "><path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4"></path></svg></div>Присоединяйтесь к нашему Telegram-сообществу</div></div></button></div><div style="margin-bottom:var(--mantine-spacing-xl)" class="m_d08caa0 mantine-Typography-root"><p><strong>Spring — один из самых популярных фреймворков для Java. Расскажем, как устроен Spring, чем он хорош и сколько зарабатывают разработчики, владеющие этим фреймворком.</strong></p>
<blockquote>
<p>В написании статьи принял участие <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.linkedin.com/in/efimovanton/" rel="noopener noreferrer" target="_blank">Антон Ефимов</a>, Senior Software engineer</p>
</blockquote>
<h2 id="heading-2-1">Содержание</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-2">Что такое Spring и зачем он нужен</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-3">Использование Spring Framework</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-4">Как устроен фреймворк Spring</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-16">Сколько зарабатывают Spring-программисты</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-17">Преимущества Spring</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-22">Недостатки Spring</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-26">Небольшой экскурс в историю: как появился Spring</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-27">Принципы Spring</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-28">Как начать пользоваться Spring Framework</a></li>
</ul>
<h2 id="heading-2-2">Что такое Spring и зачем он нужен</h2>
<p>Сегодня <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/yazyk-programmirovaniya-java-osobennosti-populyarnost-situatsiya-na-rynke-truda?promo_name=blog&promo_position=article-body&promo_type=link" rel="noopener noreferrer" target="_blank">Java</a> — один из самых распространенных языков программирования в веб-разработке. Но изначально в нем было недостаточно возможностей для создания модульных приложений. Для решения этой проблемы был создан фреймворк Spring.</p>
<p><strong><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://spring.io/" rel="noopener noreferrer" target="_blank">Spring</a></strong> — фреймворк с открытым исходным кодом, написанный на Java. Его можно использовать для разработки на всех этих языках.</p>
<p>Spring предоставляет огромный набор инструментов и библиотек, которые упрощают и ускоряют процесс разработки, позволяя сосредоточиться на бизнес-логике приложения.</p>
<blockquote>
<p>Начинать изучение Spring и работу с фреймворком рекомендуется после освоения основ программирования на Java. Это можно сделать <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://pre.hexlet.io/java?promo_name=base-java&promo_position=article-body&promo_type=link" rel="noopener noreferrer" target="_blank">на подготовительных курсах Хекслета</a>. В программу включено много теоретических и практических заданий, которые выполняются в браузерном тренажере. Вы изучите основные понятия программирования, научитесь мыслить как разработчики, исправлять ошибки в коде, а еще создадите свою первую программу.</p>
</blockquote>
<h2 id="heading-2-3">Использование Spring Framework</h2>
<p>Фреймворк Spring программисты создали для написания бэкенда в веб-разработке. Но используют его во многих проектах как для создания десктопных, так и мобильных приложений. Почти всегда это энтерпрайз, то есть, создание крупных корпоративных порталов.</p>
<p>С помощью Spring разработчики могут быстро создавать масштабируемые и надежные приложения, а также использовать преимущества таких технологий, как Spring Boot, Spring Data и Spring Security.</p>
<p>Ключевая особенность Spring — в разнообразии возможностей. Это не один фреймворк, а целый набор готовых решений. В его состав входят дополнительные модули и библиотеки, которые совместно работают и регулярно пополняются.</p>
<p>Также Spring помогает писать код в парадигме аспектно-ориентированного программирования, но об этом мы поговорим позже.</p>
<style data-mantine-styles="inline">.__m__-_R_tderddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_tderddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_tderddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/spring-boot?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Spring Boot</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Навык работы с Spring Boot для масштабируемых веб-приложений</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzY3NSwicHVyIjoiYmxvYl9pZCJ9fQ==--b3b44cb29727c1bcb0b9aee0c285371dc12aa50f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Code%20typing-pana.png" alt="Spring Boot" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/java?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">10 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Java-разработчик</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите Java и фреймворк Spring Boot и REST API</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzczNSwicHVyIjoiYmxvYl9pZCJ9fQ==--883f3fd4e1b571538035b5680c8d4a9eb504b1f6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Source%20code-amico.png" alt="Java-разработчик" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 6 792 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/fullstack-java?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">16 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Fullstack-разработчик на Java</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root"></p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzY3MSwicHVyIjoiYmxvYl9pZCJ9fQ==--ca5a6047d43e5c0f6d07b52e845817fa2c47ef02/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Code%20typing-bro.png" alt="Fullstack-разработчик на Java" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 7 934 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/java-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Java</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фундаментальные принципы программирования на Java</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png" alt="СИКП на Java" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/qa-auto-engineer-java?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">6 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Автоматизатор тестирования на Java</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите Java и фреймворк для UI- и API-автотестов</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzkyMywicHVyIjoiYmxvYl9pZCJ9fQ==--da8237868b3f1c36e3fe891b47b4869fa9f2e8ef/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Bug%20fixing-pana.png" alt="Автоматизатор тестирования на Java" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 4 281 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div>
<h2 id="heading-2-4">Как устроен фреймворк Spring</h2>
<p>Разберем популярные модули и компоненты Spring Framework, которые особенно полюбились Java-разработчикам.</p>
<h3 id="heading-3-5">IoC — Inversion of Control</h3>
<p>Это базовый модуль Spring Framework, который отвечает за управление зависимостями. С его помощью можно объединить модули проекта в единую архитектуру. Ключевая особенность IoC состоит в том, что мы только предоставляем нужные зависимости контейнеру, которые потом автоматически подставляются в нужные места.</p>
<p>Благодаря технологии Dependency lnjection зависимости хранятся не в объектах, а в отдельных контейнерах. Это позволяет с легкостью вносить изменения в проект: взаимодействие между компонентами не будет нарушено.</p>
<h3 id="heading-3-6">Аспектно-ориентированное программирование</h3>
<p>Аспектно-ориентированное программирование (АОП) в Spring основано на концепции разделения бизнес-логики и аспектов, таких как безопасность, обработка ошибок. АОП позволяет добавлять эти аспекты в код без изменения его основной структуры, что потом упрощает внесение исправлений в приложение.</p>
<p>Spring поддерживает АОП через механизм AspectJ, который позволяет создавать аспекты, описывающие дополнительные функции, и применять их к требуемым классам или методам. Например, можно создать аспект, который будет обрабатывать исключения, возникающие в определенном методе, без необходимости изменять этот метод.</p>
<p>Для использования АОП в Spring необходимо определить аспекты и указать, к каким классам или методам они должны применяться. Это можно сделать с помощью аннотаций или конфигурационных файлов. Также можно выбрать, чтобы Spring добавлял аспекты во время компиляции приложения.</p>
<h3 id="heading-3-7">Доступ к данным</h3>
<p>Этот модуль состоит из нескольких библиотек. Их использование дает возможность интегрировать код на Java с базами данных. С помощью фреймворка можно наладить взаимодействие, чтобы программа могла получить доступ к хранилищу информации, и он был безопасным.</p>
<p>Фреймворк работает на основе стандарта Java DataBase Connectivity. Эта технология помогает соединить базу данных через драйвер с использованием уникального URL.</p>
<p>Один из подходов, который используется для упрощения работы с реляционными базами данных в рамках объектно-ориентированного программирования, это ORM. В Spring также есть другие возможности, как например Data Access Object.</p>
<h3 id="heading-3-8">Транзакции</h3>
<p>Транзакции — это последовательность операций, выраженная через несколько запросов, которые должны быть выполнены атомарно: то есть либо все, либо ни одна. Система собирает несколько запросов в один и отправляет их в базу данных.</p>
<p>У Spring Framework есть инструменты для безопасной работы с транзакциями. Этот модуль гарантирует сохранность данных и поддержку вложенных, локальных и глобальных транзакций.</p>
<h3 id="heading-3-9">MVC</h3>
<p>Это шаблон для проектирования веб-приложений по системе Model — View — Controller. То есть при создании нового проекта его делят на:</p>
<ul>
<li>Модель — данные, которые использует приложение для своей функциональности.</li>
<li>Отображение — пользовательский интерфейс.</li>
<li>Контроллер — принципы изменения модели в зависимости от действий пользователя.</li>
</ul>
<p>В Spring Framework этот шаблон добавили относительно поздно. Зато этот модуль приобрел много дополнительных функций. Например, возможность привязать функциональность к выбранному интерфейсу, разделение слоев и замену интерфейсов.</p>
<style data-mantine-styles="inline">.__m__-_R_27derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:80%;}@media(min-width: 36em){.__m__-_R_27derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_27derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/biblioteka-react-review-article"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTYyOCwicHVyIjoiYmxvYl9pZCJ9fQ==--6bac7610f325471938a0e33f58eaa4c52527d66f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%87%D1%82%D0%BE%D1%82%D0%B0%D0%BA%D0%BE%D0%B5react-01.png" loading="lazy" alt="Библиотека React: особенности, перспективы, ситуация на рынке труда"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Библиотека React: особенности, перспективы, ситуация на рынке труда</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">В объявлениях о поиске программистов часто встречается требование уметь работать с React. Иногда ...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">29 февраля 2024 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/postman"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA1MSwicHVyIjoiYmxvYl9pZCJ9fQ==--4fab4fd91df9064b754efcc81d232eddc09bed62/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/Postman-01.png" loading="lazy" alt="Что такое Postman и как его использовать в тестировании API"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Что такое Postman и как его использовать в тестировании API</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Postman — главный инструмент QA-инженера. С его помощью можно отправлять запросы к API, чтобы тес...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">22 декабря 2023 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/sublime-text"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTA2MywicHVyIjoiYmxvYl9pZCJ9fQ==--27f438ea9666f23794ea718ed7b407fde50044f8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80sublimatetext-01.png" loading="lazy" alt="Редактор кода Sublime Text — какие у него есть возможности и почему он популярен у разработчиков"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Редактор кода Sublime Text — какие у него есть возможности и почему он популярен у разработчиков</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Рассказываем, для чего программистам нужен редактор кода и разбираем один из самых популярных ред...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">8 декабря 2023 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div></div></div></div>
<h3 id="heading-3-10">Аутентификация и авторизация</h3>
<p>В Spring модуль аутентификации и авторизации включает в себя несколько компонентов, которые позволяют пользователям проходить аутентификацию и получать доступ к ресурсам в приложении. Вот основные компоненты:</p>
<ul>
<li><strong>AuthenticationManager</strong> — этот интерфейс позволяет управлять процессом аутентификации, включая проверку учетных данных пользователя и выдачу токена доступа.</li>
<li><strong>UserDetailsService</strong> — этот интерфейс предоставляет информацию о пользователе: имя, пароль, роль. Spring поддерживает реализацию этого интерфейса через JDBC или Hibernate.</li>
<li><strong>UsernamePasswordAuthenticationToken</strong> — этот класс представляет собой объект, который содержит имя пользователя и пароль для аутентификации.</li>
<li><strong>DaoAuthenticationProvider</strong> — этот класс используется для аутентификации пользователя на основе его имени пользователя и пароля. Он использует UserDetailsService для получения информации о пользователе и сравнивает ее с введенными учетными данными.</li>
</ul>
<p>Эти компоненты могут быть использованы для создания системы аутентификации и авторизации на основе ролей в Spring. Например, вы можете создать пользовательский интерфейс для входа, который использует AuthenticationManager для проверки учетных данных пользователя, а затем применяет роли к пользователю с помощью DaoAuthenticationProvider.</p>
<h3 id="heading-3-11">Spring Cloud</h3>
<p>Этот модуль отвечает за взаимодействие кода с распределенными системами. Он поддерживает технологии, которые используют центры обработки данных и PaaS-платформы — веб-серверы с инфраструктурой для проектов.</p>
<p>В этом модуле представлены решения, которые позволяют сбалансировать нагрузку на сервер, проводить маршрутизацию и наладить обмен данными.</p>
<h3 id="heading-3-12">Roo</h3>
<p>Этот модуль Spring Framework используют для создания бизнес-приложений. На его основе можно создать многофункциональный пользовательский интерфейс.</p>
<p>Roo предлагает разработчикам простой и оптимизированный код без системных библиотек и высокого потребления ресурсов.</p>
<h3 id="heading-3-13">Integration</h3>
<p>Этот модуль отвечает за интеграцию с внешними системами, обмен сообщениями внутри приложения и обработку информации из всех источников. Также его можно применять как движок для создания микросервисов.</p>
<p>У этого модуля есть несколько готовых шаблонов, которые позволяют быстро наладить систему интеграции приложений. Он поддерживает связи с веб-сервисами архитектуры REST и SOAP.</p>
<h3 id="heading-3-14">Batch</h3>
<p>Этот модуль представляет собой платформу, на основе которой создают пакетные приложения. Главное достоинство фреймворка — масштабируемость. Это делает его подходящим и для небольших, и для крупных приложений.</p>
<p>Но чаще модули применяют для приложений с многократно используемыми функциями. Batch позволяет им эффективно обрабатывать большие объемы информации и управлять ресурсами.</p>
<h3 id="heading-3-15">Spring Boot</h3>
<p>Этот модуль отвечает за координацию работы всего Spring. В начале разработки фреймворк нужно конфигурировать, что занимает много времени. А <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://spring.io/projects/spring-boot" rel="noopener noreferrer" target="_blank">Spring Boot</a> позволяет автоматизировать процесс настройки.</p>
<p>С помощью модуля можно быстро создавать проекты с использованием стартовых пакетов и разворачивать приложения.</p>
<p>Одна из главных функций Spring Boot — управление зависимостями и загрузка дополнительных модулей. Также он может автоматически настроить базу данных для программы.</p>
<h2 id="heading-2-16">Сколько зарабатывают Spring-программисты</h2>
<p>Spring — одна из самых популярных технологий для разработки корпоративных приложений <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.jetbrains.com/ru-ru/lp/devecosystem-2021/java/" rel="noopener noreferrer" target="_blank">по данным JetBrains</a>.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/xZ6j7Lw.png" alt="" loading="lazy"/></p>
<p>Его аналоги используют гораздо реже. Фактически эта технология доминирует на рынке программирования на Java. <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://www.jrebel.com/blog/spring-boot-alternatives" rel="noopener noreferrer" target="_blank">По данным разработчиков JRebel</a>, все альтернативы этого фреймворка вместе взятые имеют меньше пользователей.</p>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://imgur.com/KBlVZZz.png" alt="" loading="lazy"/></p>
<p>Можно сделать вывод: если вы хотите заниматься коммерческой разработкой на Java и ищите свой стек технологий, Spring будет самым логичным выбором. С ним будет гораздо легче найти работу в этой сфере, чем с его аналогами.</p>
<p>На декабрь 2023 года на hh.ru Spring как требуемая технология указана в 2169 вакансиях. Для сравнения — Java указан в 6 429 вакансиях.</p>
<p><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://habr.com/ru/companies/habr_career/articles/746038/" rel="noopener noreferrer" target="_blank">«Хабр.Карьера»</a> собрала статистику по заработку программистов в 2023 в зависимости от стека технологий.</p>
<p>Разработчики со знанием Java Spring Framework зарабатывают в зависимости от квалификации:</p>
<ul>
<li>99 000 рублей — джуны.</li>
<li>189 000 рублей — мидлы.</li>
<li>296 000 рублей — сеньоры.</li>
<li>336 000 рублей — тимлиды.</li>
</ul>
<p>Средняя зарплата программиста с этим стеком — 218 000 рублей.</p>
<p>Есть отдельная статистика зарплат по Spring Boot. Со знанием этой технологии зарабатывают:</p>
<ul>
<li>102 000 рублей — джуны.</li>
<li>193 000 рублей — мидлы.</li>
<li>295 000 рублей — сеньоры.</li>
<li>312 000 рублей — тимлиды.</li>
</ul>
<p>В среднем бэкендеры со знанием Spring Boot зарабатывают 205 000 рублей.</p>
<h2 id="heading-2-17">Преимущества Spring</h2>
<h3 id="heading-3-18">Универсальность и оптимизация работы</h3>
<p>Spring — это масштабная инфраструктура с инструментами буквально на все случаи жизни. В его составе огромное количество модулей, позволяющих решать как стандартные, так и сложные специфические задачи.</p>
<p>Все фреймворки пишут как готовые решения для минимизации рутинных операций. Spring — не исключение. Он предоставляет разработчику целых набор готовых шаблонов и все они экономят время.</p>
<h3 id="heading-3-19">Большой выбор инструментов</h3>
<p>Spring — один из самых разветвленных фреймворков. На его базе можно реализовать практически любое решения. В статье описаны самые популярные модули, но их гораздо больше.</p>
<h3 id="heading-3-20">Популярность</h3>
<p>Spring широко востребован в среде Java-разработчиков. У этого фреймворка огромное комьюнити, исчерпывающая документация и регулярно выходящие дополнения. На нем написаны тысячи крупных проектов, которые требуют поддержки, что делает актуальным изучение Spring.</p>
<h3 id="heading-3-21">Бесплатность</h3>
<p>Java называют языком программирования для крупных корпораций. У него есть платные и закрытые инструменты. А Spring распространяют бесплатно, что снижает порог входа и позволяет учить его новичкам.</p>
<h2 id="heading-2-22">Недостатки Spring</h2>
<h3 id="heading-3-23">Сложность</h3>
<p>Spring — огромная и нагруженная инфраструктура. Перед работой новичку придется внимательно прочесть документацию и разобраться в возможностях фреймворка.</p>
<h3 id="heading-3-24">Долгая настройка</h3>
<p>Запуск и адаптация Spring к конкретному проекту потребует много времени. Частично это можно решить, используя Spring Boot.</p>
<h3 id="heading-3-25">Большой объем кода</h3>
<p>Используя этот фреймворк, разработчики сталкиваются с необходимостью тщательной оптимизации. Это не проблема технологии как таковой, но на практике проекты на Spring могут содержать много лишнего кода и ненужных зависимостей.</p>
<h2 id="heading-2-26">Небольшой экскурс в историю: как появился Spring</h2>
<p>Отсутствие модульности в языке Java не мешало первым программистам, пока не началась эпоха разработки веб-приложений. Для них нужен был дополнительный функционал, поэтому разработчики языка добавили JavaBeans. Это классы, позволяющие объединять несколько объектов в один для лучшей передачи данных.</p>
<p>JavaBeans стал популярным инструментом для оптимизации разработки. Но его возможностей также было недостаточно для создания сложных многопользовательских приложений.</p>
<p>Тогда JavaBeans «усилили» новой технологией Enterprise JavaBeans. Она позволяла улучшить процесс сохранения данных и упростила разработку сложных корпоративных приложений.</p>
<p>Но у Enterprise JavaBeans был серьезный недостаток: она делала код чрезмерно сложным. Так что разработчики продолжили искать новое решение, и оно нашлось в 2003 году.</p>
<p>Команда разработчиков Sprinkler — системы для управления контентом — планировала внедрить в Spring широкий функционал: обработку исключений, управление транзакциями, зависимости. Они столкнулись с необходимостью писать большое количество кода с нуля и решили сделать фреймворк на основе своих разработок.</p>
<p>В 2003 эта команда презентовала тестовую версию Spring Framework, а еще через год случился релиз полностью рабочего ПО. Этот фреймворк быстро занял доминирующее положение на рынке веб-разработки на Java.</p>
<h2 id="heading-2-27">Принципы Spring</h2>
<p>В основе идеологии этого фреймворка лежит три принципа.</p>
<ul>
<li><strong>Универсальность</strong>. Если другие фреймворки обычно пишут под определенные решения, то Spring — это фактически платформа для «всего» в Java. На его фундаменте можно написать любые приложения, а его новые модули должны иметь универсальное применение.</li>
<li><strong>Легкость</strong>. Этот фреймворк написан по принципу минимального воздействия. То есть каждый модуль включает в себя только необходимые функции и ничего лишнего. За счет этого готовые решения в Spring проще интегрировать с другими инструментами. А сам код отличает лаконичность.</li>
<li><strong>Интегрированная инфраструктура</strong>. Сильная часть Spring — связи между компонентами. Все технологии в рамках этого инструмента обеспечены хорошим взаимодействием друг с другом. Это сделано за счет инверсии контроля — способа внедрения зависимостей.</li>
</ul>
<h2 id="heading-2-28">Как начать пользоваться Spring Framework</h2>
<p>На официальном сайте Spring есть <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://spring.io/quickstart/" rel="noopener noreferrer" target="_blank">руководство по подключению фреймворка</a>. С его помощью вы сможете написать простейшую программу «Hello, World!» на Spring.</p>
<p>В начале знакомства с фреймворком можно использовать обучающие материалы, которые находятся в свободном доступе, в том числе на официальном сайте — там целая кладезь полезной информации. Есть также русскоязычные сообщества, специализированные сайты и форумы для общения с теми, кто разделяет ваши интересы. Например, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://t.me/hexletcommunity" rel="noopener noreferrer" target="_blank">Хекслет Комьюнити в Telegram</a>.</p>
<blockquote>
<p>Начинать изучение Spring и работу с фреймворком рекомендуется после освоения основ программирования на Java. Это можно сделать <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://pre.hexlet.io/java?promo_name=base-java&promo_position=article-body&promo_type=link" rel="noopener noreferrer" target="_blank">на подготовительных курсах Хекслета</a>. В программу включено много теоретических и практических заданий, которые выполняются в браузерном тренажере. Вы изучите основные понятия программирования, научитесь мыслить как разработчики, исправлять ошибки в коде, а еще создадите свою первую программу.</p>
</blockquote></div><div class=""><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-user "><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0"></path><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path></svg></div><p style="margin-inline-end:var(--mantine-spacing-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Анастасия Уминская</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 года назад</p></div><div style="align-items:center" class="m_8bffd616 mantine-Flex-root __m__-_R_5dirddmiub_"><a style="display:inline-flex" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/spring-framework/votes"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div></a><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">3</p></div></div></div><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding:var(--mantine-spacing-xl)" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Читайте также:</p><ul style="margin-inline-start:var(--mantine-spacing-lg)" class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/biblioteka-react-review-article">Библиотека React: особенности, перспективы, ситуация на рынке труда</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/postman">Что такое Postman и как его использовать в тестировании API</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/sublime-text">Редактор кода Sublime Text — какие у него есть возможности и почему он популярен у разработчиков</a></span></div></li></ul></div><div style="margin-block:var(--mantine-spacing-xl)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div></div><div></div></div><style data-mantine-styles="inline">.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}@media(min-width: 62em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:33.333333333333336%;--col-max-width:33.333333333333336%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_lmiub_ mantine-visible-from-md"><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-bottom:var(--mantine-spacing-xl);padding:var(--mantine-spacing-xl);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="margin-bottom:var(--mantine-spacing-md)" class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Категории</p></div><ul class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Мотивация">Мотивация</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Истории успеха">Истории успеха</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Дневник студента">Дневник студента</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Код">Код</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Карьера">Карьера</button></span></div></li></ul></div><div style="justify-content:end;margin-top:0rem;position:sticky;top:calc(5rem * var(--mantine-scale))" class="m_8bffd616 mantine-Flex-root __m__-_R_5dlmiub_"><div tabindex="0" style="cursor:pointer"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses_web_development?promo_name=program_category&promo_position=blog_post&promo_creative=card&promo_type=card"><div style="background-color:var(--mantine-color-default);border:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);padding-inline:var(--mantine-spacing-xl);padding-top:var(--mantine-spacing-xl);padding-bottom:var(--mantine-spacing-xs);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Курсы по веб-разработке</p></div><img class="m_9e117634 mantine-Image-root" src="/vite/assets/development-BVihs_d5.png"/><p style="margin-bottom:var(--mantine-spacing-xs);text-align:right" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></a></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>