Spring boot для чего
Spring Boot vs Spring MVC vs Spring — Как они сравниваются?
Spring Boot vs Spring MVC vs Spring — Как они сравниваются?
Spring, Spring Boot, Spring MVC, везде есть слово “spring”! Давайте пройдемся где и когда вы можете применять каждый из этих инструментов
В этой статье, вы увидите обзоры: Spring, Spring MVC, и Spring Boot, узнаете какие проблемы они решают, и где они лучше всего применимы. Самый важный в факт что вы узнаете, является тем что Spring, Spring MVC, и Spring Boot не конкурируют за одно и то же место. Они решают разные проблемы, и они решают их очень хорошо.
Что за основная проблема, которую этот Spring Framework решает?
Долго и упорно подумайте. Какова проблема, решаемая Spring Framework?
Почему это важно? Потому что, когда DI или IOC правильно используются, мы можем разрабатывать слабо связанные приложения. А слабо связанные приложения могут быть легко протестированы юнит-тестами.
Давайте рассмотрим простой пример.
Пример без внедрения зависимостей
Рассмотрим пример ниже: WelcomeController зависит от WelcomeService, чтобы получить приветственное сообщение. Что он делает, чтобы получить экземпляр WelcomeService?
Эта строка создает экземпляр данного сервиса. А это значит что они сильно связаны. Например, если я создаю мок для WelcomeService в юнит-тесте для WelcomeController, как мне заставить WelcomeController использовать мок? Не легко!
Простой пример с внедрением зависимостей
Мир выглядит намного проще с внедрением зависимостей. Вы позволяете Spring Framework делать тяжелую работу. Мы просто используем две простые аннотации: Component и Autowired.
В юнит-тесте, я могу попросить Spring framework подключить мок для WelcomeService к WelcomeController. (Spring Boot делает вещи проще делая это с аннотацией @MockBean. Но это уже совсем другая история!)
Что еще решает Spring Framework?
Проблема 1: Дублирование/Загрязнение кода
Останавливается ли Spring Framework с внедрением зависимостей? Нет. Он строится на основной концепции внедрения зависимостей с несколькими модулями Spring
Приносят ли эти модули новую функциональность? Нет. Мы можем делать все это на J2EE или Java EE. Так, что они приносят? Они приносят простые абстракции. Целью этих абстракций является:
Проблема 2: хорошее интегрирование с другими фреймворками
Отличная вещь насчет Spring Framework, это то, что он не пытается решать проблемы которые уже решены. Все что он делает, это предоставляет отличную интеграцию с другими фреймворками, которые в свою очередь предоставляют отличные решения.
Почему нам нужен Spring Boot?
У приложений, основанных на Spring, много конфигураций.
Когда мы используем Spring MVC, нам необходимо сконфигурировать: component scan, dispatcher servlet, view resolver, web jars(для доставки статического контента) среди других вещей.
Код ниже показывает типичную конфигурацию dispatcher servlet в web приложении.
Когда мы используем Hibernate/JPA, нам надо сконфигурировать источник данных, фабрику менеджера сущностей, менеджер транзакций, и другие штуки.
Проблема 1: Spring Boot авто конфигурация: Можем ли мы думать иначе?
Spring Boot приносит новый мыслительный процесс вокруг всего этого.
Проблема 2: Spring Boot Starter Projects: Построен вокруг хорошо известных паттернов
Давайте скажем что хотим разработать веб приложение.
Прежде всего нам потребуется определить фреймворки, которые хотим использовать, какие версии использовать и как их вместе подсоединить.
У всех веб приложений аналогичные потребности. Ниже перечислены зависимости которые используются в Spring MVC. Они включают в себя Spring MVC, Jackson Databind, Hibernate-Validator и Log4j.
Если вы хотите разрабатывать веб приложение или приложение для RESTful сервисов, ваш выбор — Spring Boot Start Web. Давайте быстро создадим проект с Spring Boot Starter Web используя Spring Initializr.
Зависимости для Spring Boot Starter Web
Следующий скриншот показывает разные зависимости, которые были добавлены в наше приложение.
Зависимости могут быть классифицированы на:
Параметры проекта Spring Boot Starter
Как мы видим из Spring Boot Starter Web, стартовые проекты помогают нам быстро начать разработку определенных типов приложений.
Другие цели Spring Boot
Также есть несколько стартеров для технических вещей:
Стоит ли использовать Spring Boot в вашем следующем проекте?
Большинство моих профессиональных Java проектов за последнее десятилетие были основаны на Spring или JEE. Обе платформы развиваются достаточно уверенно, однако все ещё страдают от различных проблем.
Spring и JEE по-прежнему остаются золотыми стандартами для масштабных Java-проектов и больших команд разработчиков, трудящихся над сложными enterprise-решениями. Однако, неизбежным следствием зрелости Java-сообщества стала частичная потеря прежнего энтузиазма и инновационности, что существенно ударило по авторитету обоих.
JEE изменилась довольно резко на протяжении многих лет, но до сих пор осуждается разработчиками за подходы и решения, которые были обозначены создателями платформы как deprecated ещё начиная с версии EJB 2.x. Многие люди до сих пор называют JEE как “J2EE”, хотя изменение названия состоялось 8 лет назад!
Spring тоже заметно усовершенствовался, однако далеко не всеми пользователями это воспринимается. Невзирая на возможность создания при помощи Spring 3.x и выше современных приложений с прозрачной, неоторванной от кода конфигурацией, большинство проектов продолжают с избытком пестреть XML-файлами и устаревшими архитектурными решениями. Проблема в том, что много разработчиков по тем или иным причинам не меняют отработанного на предыдущих версиях подхода.
По указанным причинам открылась дорога другим языкам и фреймворкам. Java был, вероятно, самым популярным языком для личных проектов, более десятка лет тому назад, но молодые разработчики сегодня, кажется, стали обращать больше внимания на Python, Scala и т.д. Наиболее влиятельные веб-фреймворки предыдущего десятилетия Rails, и основанная на Ruby Sinatra породили ряд микро-фреймворков на протяжении последних пяти лет.
Groovy и Grails, в мире Java, стали первым серьёзным ответом Ruby и Rails. Их теперь можно встретить в наборе инструментов даже самых консервативных команд enterprise-разработки. Однако, новые фреймворки на основе JVM идут гораздо дальше. Вместо просто обёртывания API JEE и Spring в легкую для использования интерфейс-оболочку Play фреймворк начал, так сказать с чистого листа, отбрасывая даже, казалось бы фундаментальную модель Java-сервлета.
Spring уже не рассматривается как современный инновационный инструмент. Разработчики еще используют его, особенно для старых приложений, но в основном, потому что они должны, а не потому, что они этого сами хотят. Я не могу вспомнить, когда последний раз я говорил с разработчиком, использовавшем Spring в личном проекте, в то время как Play или совершенно другая платформа встречаются повсеместно.
Это позор, ведь Spring – невероятно мощный инструмент, если получится правильно его настроить. Spring Data JPA предоставляет простое управление реляционными базами данных без написания классов DAO, также Spring Data JPA позволяет получить тот же функционал по отношению к NoSQL хранилищам данных, если получится правильно его настроить. Кроме того, с помощью Spring вы имеете возможность осуществлять enterprise-интеграцию, доступ к API самых популярных социальных сервисов для ваших веб- или android-приложений, позаботится о безопасности вашего приложения посредством Spring Security, но, опять же, если у вас получится правильно все сконфигурировать.
Построение приложения на основе Spring может быть очень болезненным процессом. Отчасти это из-за большого количества существующих альтернатив при выборе технологий. Например, стоит ли осваивать и использовать Spring Data JPA, если вы уже потратили время на изучение JdbcTemplate и Hibernate/JPA? Какая разница между Spring Data REST и Spring HATEOAS?
Другим осложняющим фактором является то, что Spring редко признает что-либо deprecated, и не предоставляет достаточной информации для принятия обоснованного решения по выбору технологий, устранения разнообразных конфликтов и решения других часто возникающих проблем. Если вы будете искать в Интернете пример устранения какой-то неполадки, ссылки на устаревшие подходы и решения будут в топе результатов поиска. По большей части именно из-за этого XML-конфигурация остается такой распространённой, невзирая на простоту имплементации и поддержки конфигурации на основе аннотаций. Вместо использования чистой системы шаблонов такой как Thymeleaf или Velocity, в большинстве приложений по-прежнему применяется JSP с JSTL.
Жажда к ликвидации указанных проблем никогда не угасала у создателей Spring. Вдохновившись инструментом командной строки Rails, они презентовали Spring Roo – систему быстрой разработки, которая кроме того позволяет создавать элементы, такие как веб-контроллеры или JPA сущности посредством командной строки. Тем не менее, для нетривиального использования, освоить Spring Roo почти так же сложно, как собирать приложения вручную. Многих разработчиков отталкивало обилие аннотаций и AspectJ-файлов, которые Roo повсеместно добавляет в проект для обеспечения своей “магии”. Хотя и заявляется, что Roo можно легко и безболезненно удалить из проекта, если понадобится, реальность оказывается более суровой, чем теория. И даже если у вас все получилось, конвертация AspectJ в Java напрочь лишает вас возможности пользоваться магическим инструментом командной строки.
Spring Boot – следующая генерация средств упрощения процесса конфигурации Spring приложений. Он не является средством автоматической генерации кода, а представляет собой плагин для системы автоматизации сборки проектов (поддерживает Maven и Gradle).
Плагин предоставляет возможности для тестирования и разворачивания Spring приложения. Команда mvn spring-boot:run обеспечивает запуск вашего приложения на порту 8080. Это чем-то напоминает довольно популярный плагин Maven Jetty. Кроме того, Spring Boot позволяет упаковывать приложение в отдельный jar-файл, с внедренным полноценным контейнером Tomcat. Этот подход позаимствован у модели развертывания приложений фреймворка Play (вместе с тем вы также можете создавать традиционные war-файлы).
Основная выгода Spring Boot – конфигурирование ресурсов исходя из содержания classpath. Например, если pom.xml файл вашего Maven проекта содержит JPA зависимости и драйвер PostgreSQL, Spring Boot настроит persistence-модуль для PostgreSQL. Если вы добавили веб-зависимость, вы получите сконфигурированный по умолчанию Spring MVC. Если вам нужна персистентность и ничего кроме этого, Spring Boot сконфигурирует Hibernate как JPA провайдер с базой данных HSQLDB. Если вы создаете веб-приложение, но не указываете ничего дополнительно, Spring Boot сконфигурирует view resolver для системы шаблонов Thymeleaf.
Говоря о конфигурации по умолчанию, Spring Boot достаточно интуитивен в этом плане. Вы можете не всегда быть согласны с его выбором настроек, но, по крайней мере, он предоставит вам работающий модуль. Это очень полезный подход, особенно для начинающих разработчиков, которые могут начать работу с настройками по умолчанию, а потом, по мере изучения существующих альтернатив, вносить изменения в конфигурацию. Согласитесь, это намного лучше чем получить кучу сложных вопросов, без решения которых просто невозможно стартовать. Вдобавок на официальной странице проекта есть ряд полноценных туториалов, позволяющих быстро понять и практически реализовать все основные виды проектов на уровне “Hello world”.
Построение инфраструктуры приложения, фактически заключается в добавлении нужных модулей в pom.xml:
а также написании main Java-класс следующим образом:
Для большинства случаев изменения настроек по умолчанию, достаточно изменить POM-файл. Так, в примере выше продемонстрированно добавление зависимости для базы данных H2. Spring Boot, видя такое изменение, конфигурирует persistence-модуль JPA для базы данных Н2 вместо, предлагаемой по умолчанию HSQLDB. Если вам хочется использовать Jetty как встроенный контейнер, вместо предлагаемого по умолчанию Tomcat, просто добавьте соответствующую зависимость.
В данный момент Spring Boot находится на этапе становления, и, безусловно, до выхода на стабильный уровень ему предстоит пережить немало метаморфоз. Возможно, его еще рано использовать для построения серьезных систем, однако он вполне подходит для выполнения разного рода персональных, тренировочных и тестовых проектов, при реализации которых очень важно избавится от нежелательного объема непродуктивной, рутинной работы, никоим образом не связанной с созданием полезной функциональности.
В контексте потенциальных перспектив перерастания Spring Boot в будущем в серьезный инструмент для Spring разработки, особенно обнадёживает присутствие приемлемой технической документации (правда, только на английском языке и все ещё достаточно скудной, в сравнении с 800 страничной “энциклопедией” Spring Framework).
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Spring Boot
Содержание
Описание
Spring Boot позволяет легко создавать автономные производственные приложения Spring, которые можно запускать. Разработчики Spring Boot объективно оценивают платформу Spring и сторонние библиотеки, чтобы было возможно начать работу с минимальными усилиями. Большинству приложений Spring Boot требуется очень небольшая конфигурация Spring.
Особенности
Ниже перечислены особенности Spring Boot [Источник 1] :
Системные требования
Spring Boot 2.1.5.RELEASE требует Java 8 и совместим c Java до версии 11 включительно, также требуется Spring Framework 5.1.7.RELEASE или выше. Поддерживаются следующие инструменты сборки:
Инструмент сборки | Версия |
---|---|
Maven | 3.3+ |
Gradle | 4.4+ |
Контейнеры сервлетов
Spring Boot поддерживает следующие встроенные контейнеры сервлетов:
Сервлет | Версия |
---|---|
Tomcat 9.0 | 4.0 |
Jetty 9.4 | 3.1 |
Undertow 2.0 | 4.0 |
Приложения Spring Boot также могут быть развёрнуты в любом контейнере, совместимом с Servlet 3.1+.
Установка Spring Boot
Spring Boot можно использовать с «классическими» инструментами разработки Java или установить в качестве инструмента командной строки. В любом случае, вам нужен Java SDK v1.8 или выше. Прежде чем начать, необходимо проверить текущую версию Java с помощью следующей команды:
Если вы новичок в Java-разработке или хотите поэкспериментировать с Spring Boot, для начала попробуйте Spring Boot CLI (интерфейс командной строки).
Инструкция по установке для Java-разработчиков
Можно использовать Spring Boot так же, как и любую стандартную библиотеку Java. Для этого необходимо включить соответствующие файлы spring-boot-*.jar в classpath. Spring Boot не требует каких-либо специальных инструментов интеграции, поэтому можно использовать любую IDE или текстовый редактор. Кроме того, в приложении Spring Boot нет ничего особенного, поэтому его можно запускать и отлаживать, как и любую другую программу, написанную на Java.
Хотя возможно копировать Jar-файлы Spring Boot вручную, рекомендуется использовать инструмент сборки, который поддерживает управление зависимостями (например, Maven или Gradle).
Установка с помощью Maven
Установка с помощью Gradle
Gradle Wrapper обеспечивает хороший способ «получения» Gradle, когда нужно создать проект. Это небольшой скрипт и библиотека, которые располагаются вместе с кодом для начальной загрузки процесса сборки.
Установка Spring Boot CLI
Для работы со Spring Boot не обязательно использовать CLI, но это самый быстрый способ получить приложение Spring с нуля.
Пример разработки приложения Spring Boot
Для создания проекта используется Maven. Перед тем, как начать, необходимо открыть терминал и выполнить следующие команды, чтобы убедиться, что установлены подходящие версии Java и Maven:
Создание POM
Добавление зависимостей classpath
Команда mvn dependency:tree печатает древовидное представление зависимостей вашего проекта. Как видно, spring-boot-starter-parent сам по себе не предоставляет никаких зависимостей. Чтобы добавить необходимые зависимости, надо отредактировать pom.xml и добавить зависимость spring-boot-starter-web непосредственно под разделом parent :
Пример кода
Хотя здесь немного кода, довольно многое происходит. Важные части будут рассмотрены в следующих подразделах.
Аннотации @RestController и @RequestMapping
Аннотация @EnableAutoConfiguration
Автоконфигурация разработана так, чтобы хорошо работать со «Стартерами», но эти две концепции не связаны напрямую. Разработчик может свободно выбирать зависимости jar за пределами стартеров. Spring Boot по-прежнему делает все возможное для автоматической настройки приложения.
Метод main
Запуск примера
Создание исполняемого jar-файла
Java не предоставляет стандартного способа загрузки вложенных файлов jar (файлов jar, которые сами содержатся внутри jar). Это может быть проблематично, если разработчик хочет распространять автономное приложение.
Чтобы решить эту проблему, многие разработчики используют «uber» jars. Uber jar упаковывает все классы из всех зависимостей приложения в один архив. Проблема с этим подходом состоит в том, что становится трудно увидеть, какие библиотеки находятся в приложении. Это также может быть проблематично, если одно и то же имя файла (но с разным содержанием) используется в нескольких jar.
Spring Boot использует другой подход и позволяет вкладывать jar напрямую.
После сохранения pom.xml и выполнения mvn package будет выведено следующее:
Системы сборки
Настоятельно рекомендуется выбрать систему сборки, которая поддерживает управление зависимостями и может использовать артефакты, опубликованные в репозитории «Maven Central». Рекомендуется выбрать Maven или Gradle. Так же можно настроить Spring Boot работать с другими системами сборки (например, Apache Ant), но они не особенно хорошо поддерживаются.
Starters
Стартеры содержат множество зависимостей, которые необходимы для быстрого запуска и работы проекта с согласованным, поддерживаемым набором управляемых транзитивных зависимостей.
Spring Boot предоставляет следующие стартеры в группе org.springframework.boot :
Название | Описание |
---|---|
spring-boot-starter | Основной стартер, включающий поддержку автоматической настройки, регистрации и YAML |
spring-boot-starter-activemq | Стартер для обмена сообщениями JMS с использованием Apache ActiveMQ |
spring-boot-starter-amqp | Стартер для использования Spring AMQP и Rabbit MQ |
spring-boot-starter-aop | Стартер для аспектно-ориентированного программирования с Spring AOP и AspectJ |
spring-boot-starter-artemis | Стартер для обмена сообщениями JMS с использованием Apache Artemis |
spring-boot-starter-batch | Стартер для использования Spring Batch |
spring-boot-starter-cache | Стартер для использования поддержки кэширования Spring Framework |
spring-boot-starter-cloud-connectors | Стартер для использования Spring Cloud Connectors, который упрощает подключение к сервисам в облачных платформах, таких как Cloud Foundry и Heroku |
spring-boot-starter-data-cassandra | Стартер для использования распределенной базы данных Apache Cassandra и Spring Data Cassandra |
spring-boot-starter-data-cassandra-reactive | Стартер для использования распределенной базы данных Apache Cassandra и Spring Data Cassandra Reactive |
spring-boot-starter-data-couchbase | Стартер для использования документно-ориентированной базы данных Couchbase и Spring Data Couchbase |
spring-boot-starter-data-couchbase-reactive | Стартер для использования документно-ориентированной базы данных Couchbase и Spring Data Couchbase Reactive |
spring-boot-starter-data-elasticsearch | Стартер для использования поискового и аналитического движка Elastic Elasticsearch и Spring Data Elasticsearch |
spring-boot-starter-data-jdbc | Стартер для использования Spring Data JDBC |
spring-boot-starter-data-jpa | Стартер для использования Spring Data JPA с Hibernate |
spring-boot-starter-data-ldap | Стартер для использования Spring Data LDAP |
spring-boot-starter-data-mongodb | Стартер для использования документно-ориентированной базы данных MongoDB и Spring Data MongoDB |
spring-boot-starter-data-mongodb-reactive | Стартер для использования документно-ориентированной базы данных MongoDB и Spring Data MongoDB Reactive |
spring-boot-starter-data-neo4j | Стартер для использования графической базы данных Neo4j и Spring Data Neo4j |
spring-boot-starter-data-redis | Стартер для использования хранилища данных значения ключа Redis с Spring Data Redis и клиентом Lettuce |
spring-boot-starter-data-redis-reactive | Стартер для использования хранилища данных значения ключа Redis с реактивным Spring Data Redis и клиентом Lettuce |
spring-boot-starter-data-rest | Стартер для демонстрации репозиториев Spring Data через REST с использованием Spring Data REST |
spring-boot-starter-data-solr | Стартер для использования поисковой платформы Apache Solr с Spring Data Solr |
spring-boot-starter-freemarker | Стартер для создания веб-приложений MVC с использованием представлений FreeMarker |
spring-boot-starter-groovy-templates | Стартер для создания веб-приложений MVC с использованием представлений Groovy Templates |
spring-boot-starter-hateoas | Стартер для создания веб-приложения RESTful на основе гипермедиа с использованием Spring MVC и Spring HATEOAS |
spring-boot-starter-integration | Стартер для использования Spring Integration |
spring-boot-starter-jdbc | Стартер для использования JDBC с пулом соединений HikariCP |
spring-boot-starter-jersey | Стартер для создания веб-приложений RESTful с использованием JAX-RS и Jersey. Альтернатива spring-boot-starter-web |
spring-boot-starter-jooq | Стартер для использования jOOQ для доступа к базам данных SQL. Альтернатива spring-boot-starter-data-jpa или spring-boot-starter-jdbc |
spring-boot-starter-json | Стартер для чтения и записи JSON |
spring-boot-starter-jta-atomikos | Стартер для использования транзакций JTA Atomikos |
spring-boot-starter-jta-bitronix | Стартер для транзакций JTA с использованием Bitronix |
spring-boot-starter-mail | Стартер для использования поддержки электронной почты Java Mail и Spring Framework |
spring-boot-starter-mustache | Стартер для создания веб-приложений с использованием Mustache views |
spring-boot-starter-oauth2-client | Стартер для использования клиентских функций Spring Security OAuth2 / OpenID Connect |
spring-boot-starter-oauth2-resource-server | Стартер для использования функций сервера ресурсов Spring Security OAuth2 |
spring-boot-starter-quartz | Стартер для использования планировщика Quartz |
spring-boot-starter-security | Стартер для использования Spring Security |
spring-boot-starter-test | Стартер для тестирования приложений Spring Boot с библиотеками, включая JUnit, Hamcrest и Mockito |
spring-boot-starter-thymeleaf | Стартер для создания веб-приложений MVC с использованием представлений Thymeleaf |
spring-boot-starter-validation | Стартер для использования Java Bean Validation с Hibernate Validator |
spring-boot-starter-web | Стартер для создания веб, в том числе RESTful, приложений, использующих Spring MVC. Использование Tomcat в качестве встроенного контейнера сервлетов по умолчанию |
spring-boot-starter-web-services | Стартер для использования Spring Web Services |
spring-boot-starter-webflux | Стартер для создания приложений WebFlux с использованием поддержки React Web в Spring Framework |
spring-boot-starter-websocket | Стартер для создания приложений WebSocket с использованием поддержки Spring Framework WebSocket |
Spring Boot также включает в себя следующие средства запуска, которые можно использовать, если необходимо исключить или поменять конкретные технические аспекты: