Привет!
В данный момент самое популярное направление развития для девелопера со знанием Java — веб-разработка. Само собой, для этой специальности есть список обязательных к изучению технологий. Одна из главных — Spring.
Вы можете возразить: вместо него можно изучить Java EE. Это, конечно, верно, но сейчас в подавляющем большинстве новых проектов используется именно Spring, что сделало его фактически дефолтной, обязательной технологией для Java веб-разработчика. И если вы хотите идти нога в ногу с потребностями рынка, вам придется его изучить.
Сегодня я хотел бы поговорить о Spring, а именно — немного расширить ваше виденье о нем: рассказать об истории его создания, ключевых отличиях от Java EE стека и сделать небольшой обзор ключевых компонентов Spring стека.
Давайте же приступим!
1. Как и когда появился Spring и во что развился со временем
Вcе началось в октябре 2002 года, когда Род Джонсон написал книгу “Expert One-onOne J2EE Design and Development”:
В этой книге, опубликованной издательством Wrox, автор описывает состояние разработки корпоративных приложений Java в то время и указывает на ряд недостатков Java EE и компонентной среды EJB (Enterprise Java Bean).
Одновременно с этим, Род Джонсон предлагает более простое решение, основанное на обычных Java-классах (POJO — простые старые Java-объекты) и внедрении зависимостей. В книге он объясняет, как можно создать высококачественное масштабируемое приложение для онлайн-бронирования мест без использования EJB.
Т.е. он наглядно продемонстрировал, как устранить сложности разработки приложений и сделать возможным использование простых компонентов JavaBean, чтобы добиться всего, что ранее было возможным только с использованием EJB.
Однако область применения Spring не ограничивается разработкой программных компонентов, выполняющихся на стороне сервера. Любое Java-приложение может использовать преимущества фреймворка в плане простоты, тестируемости и слабой связанности.
Приведенный им дизайн разработки J2EE мгновенно стал хитом. Большая часть кода приложения, бесплатно предоставленного как часть книги, можно было многократно использовать, и вскоре ряд разработчиков начали использовать его в своих проектах.
У Wrox была веб-страница для книги с исходным кодом и исправлениями. Также предоставили и онлайн-форум для книги.
В феврале 2003 года разработчики Юрген Хеллер и Янн Карофф убедили Рода Джонсона создать проект с открытым исходным кодом на основе кода приведенной инфраструктуры. С того момента Род, Юрген и Янн начали своё сотрудничество над созданием чего-то совершенно нового. Собственно, именно Янн Карофф и придумал название «Spring» для нового фреймворка.
Тут имелось ввиду, что Spring — как весна: новый старт после «зимы» традиционного J2EE.
В июне 2003 года Spring 0.9 выпустили под лицензией Apache 2.0.
В марте 2004 года выходит Spring 1.0. Интересно, что даже до выпуска Spring 1.0, предыдущую версию 0.9 очень тепло восприняли, и она получила широкое распространение.
В августе 2004 года Род Джонсон, Юрген Хеллер, Кейт Дональд и Колин Сампалеану стали соучредителями interface21 — компании, которая занимается консультированием, обучением и поддержкой по Spring.
Октябрь 2006 года: выходит версия Spring 2.0, которая упростила файлы конфигурации XML.
В Spring 2.5, появившейся в ноябре 2007 года, были представлены конфигурации аннотаций.
Spring 3.2, вышедшая в декабре 2012 года, представила конфигурацию Java, поддерживала Java 7, Hibernate 4, Servlet 3.0, а также требовала как минимум Java 1.5.
Янн Карофф покинул команду в самом начале. Род Джонсон покинул “весеннюю” команду в 2012 году. Юрген Хеллер по-прежнему является активным членом команды разработчиков Spring.
В Spring 4.0, вышедшая в 2014 году, добавили поддержку Java 8.
Также в 2014 году миру представили Spring Boot.
Spring 5.0 вышла в 2017 году. Как и Spring Boot 2.x, который поддерживает Spring 5.
Собственно, таким образом наш любимый фреймворк и стал таким, каким мы знаем его сейчас.
2. Spring vs Java EE
Проведём небольшое сравнение двух ключевых стеков Java веб-разработчика: Spring и Java EE.
Java EE
Преимущества
Недостатки
Приложения, написанные на Java EE, считаются более надежными, безопасными и масштабируемыми
Java EE — утвержденный промышленностью стандарт API
Преимущественно основан на аннотациях и CDI (context and dependency injection), как впрочем и Spring
Реализация на основе EJB контейнеров и POJO
Сложные приложения с большим количеством транзакций очень хорошо обрабатываются JEE
Успешен в использовании для масштабируемого монолитного приложения
У Java EE есть свой ООП язык, содержащий определенный стиль и синтаксис
Очень сложная среда разработки приложений, которую сложно понять новичкам (и старичкам порой тоже)
Окончательная стоимость проекта, включая разработку, развертывание и разработку приложений, может оказаться непомерно высокой
Java EE, имеющий лицензию Oracle, предназначен для организаций и компаний, которым требуется широкая адаптируемая распространяемая среда для создания массовых приложений.
Как и Spring, Java EE включает дополнительные библиотеки для доступа к базе данных (JDBC, JPA), вызова удаленной техники (RMI), информирования (JMS), веб-администрирования, обработки XML и характеризует стандартные API-интерфейсы для корпоративных JavaBeans, портлетов, сервлетов, страниц сервера Java и т. д.
Фундаментальная цель Java EE состоит в том, чтобы распутать основные проблемы, с которыми сталкиваются разработчики в отношении построения текущих приложений с помощью различных API.
В это же время разработка на Java EE обладает высоким уровнем сложности, что задирает непомерно высокую планку не только для новичков. Да и опытным специалистам бывает сложно понять уже написанный функционал, поэтому разработка на Java EE более долгая и, соответственно, более дорогостоящая.
Про Java EE в двух словах можно сказать так:
Сложно, но гибко.
Ну а теперь давайте поговорим немного о Spring-е.
Spring
Преимущества
Недостатки
Позволяет эффективно организовывать взаимодействия объектов
Более прост, нежели Java EE
Реализован на основе IOC и AOP, что обеспечивает слабую связанность приложений
Работает на основе конфигурации XML, Groovy или аннотаций
Позволяет использовать простые старые объекты Java — POJO, разработчикам не нужен корпоративный контейнер, такой как сервер приложений
Обеспечивает разработчикам Java высокий уровень модульности
Предоставляет реализацию библиотек Java EE, но на свой лад, благодаря чему использование их станет в разы проще
Лицензия с открытым исходным кодом
Spring Boot сильно упрощает первичную настройку приложения
Код приложения Spring, как правило, прост для тестирования
Относительно сложно развивать Spring, поскольку в нем отсутствует четкая направленность
Для начинающего разработчика Java изучение среды Spring может быть сложной задачей (но все равно проще, чем Java EE)
Spring медленнее, чем Java EE
Spring — это система с открытым исходным кодом для Java для крупного бизнеса.
Структура Spring нацелена на то, чтобы предоставить максимально простую реализацию идей J2EE и использовать отличную практику программирования за счет расширения возможностей модели программирования на основе POJO.
Т.е. Java EE — скорее официальный стандарт, в то время как Spring — это скорее фреймворк, реализующий по-своему данный стандарт.
Итоги сравнения
В моём понимании Java EE и Spring — это как JDBC и Hibernate, где JDBC — более быстрая технология, но в то же время с большим количеством лишнего кода. А Hibernate уже использует JDBC, но при этом упрощая и сокращая разработку в разы (хоть и накладывая некоторые ограничения).
Нельзя однозначно сказать, кто из них лучше.
Также это чем-то напоминает вопрос: что лучше — ArrayList или LinkedList.
Ведь ответ будет всё тем же — смотря в какой ситуации.
У каждого из них есть свои сильные и слабые стороны, и выбирать из них нужно тщательно, взвесив свою ситуацию и поняв, кто из них сейчас принесет наибольшую пользу.
3. Компоненты Spring
Ну а сейчас давайте немного поговорим о фреймворках, из которых состоит Spring.
Spring framework
Это основной модуль, который предоставляет комплексную модель программирования и конфигурации для современных корпоративных приложений на основе Java — на любой платформе развертывания.
Он содержит множество основных (базовых) технологий Spring:
JDBC, ORM — технологии взаимодействия с базами данных;
Test — функционал для прозрачного, несложного тестирования данных Spring контейнера;
SpEL — Spring Expression Language — язык выражений Spring;
и т.д.
Spring Boot
Упрощает создание приложений на основе Spring, сокращая до минимума первичную настройку приложения и автоконфигурирует элементы приложения на Spring.
Пример запуска Spring boot за 5 минут
Spring Data
Значительно упрощает использование технологий доступа к данным, реляционных и нереляционных баз данных (убирает повторяющийся код и упрощает взаимодействие с данными). В этой статье — неплохой туториал по подключению Spring Data.
Spring Cloud
Используется в микросервисной архитектуре, упрощая взаимодействие микросервисов между собой и автоматизируя развертывание приложений на облачных платформах типа AWS, Azure и т.д.
Развёрнутый туториал по Spring Cloud смотрите здесь, но предупрежу, что данная тема не из легких и ориентирована на специалистов уровня, близкого к синьору.
Spring Security
Предоставляет мощный и настраиваемый инструмент проверки подлинности (аутентификации) и контроля доступа (авторизации) в приложение.
Несложный пример подключения Spring Security к своему приложению вы можете найти в этом посте.
Spring GraphQL
Данный модуль обеспечивает поддержку приложений Spring, построенных на GraphQL Java.
GraphQL — это язык запросов для API, позволяющий клиентам запрашивать ограниченное множество данных, в которых они нуждаются, что в свою очередь позволяет собирать данные в ограниченном количестве запросов. Если вы уже знакомы с JPA, возможно уже встречали EntityGraph, со схожей (или той же) концепцией.
Подробнее о GraphQL можно почитать вот тут.
Spring Session
Данная часть фреймворка Spring предоставляет API и реализации для управления информацией о сеансе пользователя (данные сеанса пользователя сохраняются в постоянном хранилище вроде Redis, MongoDb, HazelCast и т. д).
С примером использования Spring Session можно ознакомиться вот тут.
Spring Integration
Данный модуль предназначен для упрощенного обмена сообщениями в приложениях на основе Spring и поддержки интеграции с внешними системами через декларативные адаптеры.
Эти адаптеры обеспечивают более высокий уровень абстракции по сравнению с поддержкой Spring для удаленного взаимодействия, обмена сообщениями и планирования.
Подробная статья.
Spring REST
Предоставляет богатый набор инструментов, упрощающий разработку REST API: инструменты для маршрутизации запросов, для преобразования JSON/XML в объекты требуемых типов и т.д.
Пример RESTful сервиса на Spring можно найти в этом материале.
Spring Web Flow
Spring Web Flow основан на Spring MVC и позволяет реализовать «потоки» веб-приложения. Такие потоки инкапсулируют последовательность шагов, которые направляют пользователя через выполнение некоторой бизнес-задачи.
Они охватывают несколько HTTP-запросов, имеют состояние, работают с транзакционными данными, могут использоваться повторно и могут быть динамическим и долговременным по своей природе.
Пример подключения Spring Web Flow можно рассмотреть в этом гайде на английском.
Spring WebServices
Данный модуль призван облегчить разработку сервисов SOAP на основе контрактов, позволяя создавать гибкие веб-сервисы, используя один из многих способов манипулирования полезными нагрузками XML.
SOAP — Simple Object Access Protocol — Простой протокол доступа к объектам.
Модуль предоставляет некоторые API-интерфейсы для упрощения создания REST контроллеров, которые следуют принципу HATEOAS при работе со Spring и особенно Spring MVC.
HATEOAS — Hypermedia As The Engine Of Application State — Гипермедиа как двигатель состояния приложения.
Использование данной библиотеки Spring вы можете увидеть здесь.
Spring Batch
Данный модуль предоставляет функционал для пакетных обработок данных (когда данные обрабатываются большими кусками — пакетами), жизненно важных для повседневной работы корпоративных систем.
В Spring Batch предоставлены функции многократного использования, которые необходимы для обработки больших объемов записей, включая ведение журнала / трассировку, управление транзакциями, статистику обработки заданий, перезапуск заданий, пропуск и управление ресурсами.
Интересный обзор по Spring Batch вы можете найти по этой ссылке.
Spring AMQP
Модуль применяет основные концепции Spring к разработке решений обмена сообщениями на основе AMQP. Он предоставляет шаблон (template) как высокоуровневую абстракцию для отправки и получения сообщений. Также обеспечивается поддержка POJO, управляемых сообщениями, с контейнером слушателя (listener container).
AMQP — Advanced Message Queueing Protocol — Расширенный протокол очереди сообщений.
Проект содержит две части: spring-amqp — это базовая абстракция, а spring-rabbit — это реализация для RabbitMQ.
Пример с подключением RabbitMQ с использованием Spring
Spring for Apache Kafka
Данный проект применяет основные концепции Spring к разработке решений для обмена сообщениями на основе Kafka.
Предоставляется шаблон (template) как высокоуровневая абстракция для отправки сообщений. Также обеспечивается поддержка объектов POJO, управляемых сообщениями, с необходимыми аннотациями и контейнером слушателя (listener container).
Тут явно просматривается схожесть со Spring AMQP, но даный модуль адаптирован конкретно под Kafka.
Пример подключения Spring Kafka можно подсмотреть вот тут.
Spring CredHub
Предоставляет поддержку на стороне клиента для хранения, получения и удаления учетных данных с сервера CredHub, работающего на платформе Cloud Foundry.
CredHub — предоставляет API для безопасного хранения, создания, извлечения и удаления учетных данных различных типов.
Spring CredHub предоставляет привязку Java для CredHub API, что упрощает интеграцию приложений Spring с CredHub.
Spring FLO
Это библиотека JavaScript, которая предлагает простой встраиваемый визуальный конструктор HTML5 для конвейеров и простых графиков для мониторинга потоковой и пакетной передачи данных.
Демо данной технологии — в видео по ссылке.
Spring LDAP
Данная библиотека упрощает операции по протоколу LDAP и основана на шаблоне Spring JdbcTemplate. Фреймворк позволяет осуществлять поиск и закрытие контекста, просмотр результатов, кодирование/декодирование значений, фильтры и многое другое (построенная на тех же принципах, что и Spring Jdbc)
Пример реализации Spring LDAP можно найти здесь.
Spring Roo
Данный модуль предоставляет собой инструмент RAD, который может создавать и управлять вашим приложением на основе Spring.
Его цель — повысить производительность разработчиков Java. Он не может написать бизнес-логику вашего приложения, но может обрабатывать конфигурационные и инфраструктурные вещи.
Библиотека позволяет легко создавать полнофункциональное приложение оболочки (также известное как командная строка), полагаясь на jar-файлы Spring Shell и добавляя свои собственные команды (которые поступают как методы в Spring beans).
Создание приложения командной строки может быть полезно, например, для взаимодействия с REST API вашего проекта или для работы с локальным содержимым файла.
Подробнее читайте тут и тут.
Spring Statemachine
Данный модуль позволяет разработчикам приложений использовать концепции конечного автомата с приложениями Spring.
Детальный пример использования данной функциональности можно найти вот тут и вот тут.
Spring Vault
Spring Vault предоставляет знакомые абстракции Spring и поддержку на стороне клиента для доступа, хранения и отзыва секретов. Он предлагает как низкоуровневые, так и высокоуровневые абстракции для взаимодействия с Vault, освобождая пользователя от проблем с инфраструктурой.
Пример имплементации Spring Vault“И все это мне нужно учить?” — изумленно спросите вы.
Не пугайтесь! Это не так! Точнее, не совсем так.
Это был полный перечень доступных технологий в Spring. Список же технологий, которые необходимо знать новичку гораздо скромнее:
Spring Core
Spring Boot
Spring Web (MVC и REST)
Spring Data (Spring ORM, Spring JDBC, Spring JPA)
Spring Test
Также есть еще технологии, которые часто встречаются на проектах, но из-за их сложности ими, как правило, занимаются более опытные разработчики, а не зеленые новички.
Тем не менее, новичкам также полезно хотя бы в общих чертах разбираться в:
Spring Security
Spring AOP
Spring Cloud
Остальные же технологии используются гораздо реже, поэтому изучать их всерьез нужно лишь для работы на конкретном проекте.
К слову, с полным чеклистом того, что должен знать Java-разработчик, вы сможете ознакомиться в другой моей статье.
На этом у меня сегодня все, всем до скорого!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ