Тема 34. Введение в Spring - BelyiZ/JavaCourses GitHub Wiki

Содержание:

  1. Модули Spring
  2. Преимущества Spring Framework
  3. Создание Spring-проекта
  4. Список литературы/курсов

Spring - это универсальный фреймворк с открытым исходным кодом для Java-платформы, обеспечивающая всестороннюю поддержку для простой и быстрой разработки приложений Java. По сути это облегченный фреймворк, который предлагает поддержку различных фреймворков, таких как Hibernate, Struts, Tapestry, JSF и т.д.

Spring может быть рассмотрен как модульный фреймворк, где каждый модуль может состоять из оболочки над набором других фреймворков или библиотек. Оболочки позволяют использовать похожие концепции при работе с разными библиотеками, а также быстро реализовывать взаимодействие между ними. Эти особенности дают возможность говорить о Spring уже как о единой экосистеме, состоящей из ядра (Spring Core) и различных модулей

Spring Framework представляет собой просто контейнер внедрения зависимостей (Dependency injection), с несколькими удобными слоями (например: доступ к базе данных, прокси, аспектно-ориентированное программирование, RPC, веб-инфраструктура MVC). Данные слои содержат в себе 20 модулей.

Модули Spring

Spring Framework (или Spring Core)

Базовый контейнер Spring Core дополнительно разделен на подкомпоненты, такие как модули Core, Bean, Context и Expression Language. Стоит отметить, что Core и Bean обеспечивают фундаментальную часть платформы, включая Inversion-of-Control (IoC) и Dependency injection (DI).

IoC - паттерн проектирования, согласно которому фреймворк может сам управлять созданием и жизненным циклом объектов. Также при использовании IoC на фреймворк ложится задача конфигурации управляемых объектов.

DI - паттерн при использовании которого, фреймворк сам определяет зависимости объектов между собой и обеспечивает передачу ссылки созданного объекта (injection) другому объекту, который его использует.

Без использования IoC мы обычно на старте выполнения программы вынуждены сами создавать объекты в нужном порядке, и передавать созданные экземпляры в другие объекты, которые от них зависят. Абстрактный пример:

A a = new A();
B b = new B();
b.setA(a);

C c = new C();
c.setA(a);
c.setB(b);

D d = new D();
E e = new E();
e.set(b, d);

При использовании IoC данный код нам не требуется, так как создание и передачу одного объекта другому выполняет фреймворк в соответствии с конфигурацией, которую мы опишем. Spring Framework по своей сути является контейнером внедрения зависимостей, который управляет написанными вами классами и их зависимостями.

Spring Boot

Это проект, построенный по принципу convention-over-configuration (соглашения по конфигурации), призванный автоматизировать процедуру настройки и ускоряют процесс создания и развертывания Spring-приложений

Spring Boot обладает большим функционалом, но его наиболее значимыми особенностями являются: управление зависимостями, автоматическая конфигурация и встроенные контейнеры сервлетов.

Управление зависимостями.

Чтобы ускорить процесс управления зависимостями, Spring Boot неявно упаковывает необходимые сторонние зависимости для каждого типа приложения на основе Spring и предоставляет их разработчику посредством так называемых starter-пакетов (spring-boot-starter-web, spring-boot-starter-data-jpa и т.д.) Starter-пакеты представляют собой набор удобных дескрипторов зависимостей, которые можно включить в свое приложение. Это позволит получить универсальное решение для всех, связанных со Spring технологий, избавляя программиста от лишнего поиска примеров кода и загрузки из них требуемых дескрипторов зависимостей.

Например, если необходимо начать использовать Spring Data JPA для доступа к базе данных, просто включите в свой проект зависимость spring-boot-starter-data-jpa и все будет готово ( не придется искать совместимые драйверы баз данных и библиотеки Hibernate) Если необходимо создать Spring web-приложение, возможно добавить зависимость spring-boot-starter-web, которая подтянет в проект все библиотеки, необходимые для разработки Spring MVC-приложений, таких как spring-webmvc, jackson-json, validation-api и Tomcat

Spring Boot собирает все общие зависимости и определяет их в одном месте, что позволяет разработчикам просто использовать их, вместо того, чтобы изобретать колесо каждый раз, когда создается новое приложение.

Следовательно, при использовании Spring Boot, файл pom.xml содержит намного меньше строк, чем при использовании его в Spring-приложениях.

Автоматическая конфигурация.

Второй превосходной возможностью Spring Boot является автоматическая конфигурация приложения. После выбора подходящего starter-пакета, Spring Boot попытается автоматически настроить Spring-приложение на основе добавленных вами jar-зависимостей.

Например, если добавить Spring-boot-starter-web, Spring Boot автоматически сконфигурирует такие зарегистрированные бины, как DispatcherServlet, ResourceHandlers, MessageSource. Если использовать spring-boot-starter-jdbc, Spring Boot автоматически регистрирует бины DataSource, EntityManagerFactory, TransactionManager и считывает информацию для подключения к базе данных из файла application.properties Если использовать базу данных, и не предоставляете никаких подробных сведений о подключении в ручном режиме, Spring Boot автоматически настроит базу в памяти, без какой-либо дополнительной конфигурации (при наличии H2 или HSQL библиотек). Автоматическая конфигурация может быть полностью переопределена в любой момент с помощью пользовательских настроек.

Встроенная поддержка сервера приложений — контейнера сервлетов.

Каждое Spring Boot web-приложение включает встроенный web-сервер. Посмотрите на список контейнеров сервлетов, которые поддерживаются "из коробки", возможно найти в Spring Boot Reference Documentation.

Таким образом нет необходимости беспокоиться о настройке контейнера сервлетов и развертывании приложения на нем. Теперь приложение может запускаться само, как исполняемый jar-файл с использованием встроенного сервера.

Если необходимо использовать отдельный HTTP-сервер, для этого достаточно исключить зависимости по умолчанию. Spring Boot предоставляет отдельные starter-пакеты для разных HTTP-серверов.

Создание автономных web-приложений со встроенными серверами не только удобно для разработки, но и является допустимым решением на практике. Возможность быстро упаковать весь сервис (например, аутентификацию пользователя) в автономном и полностью развертываемом артефакте, который также предоставляет API — делает установку и развертывание приложения значительно проще.

Spring MVC (часть Spring Framework)

Spring MVC — это веб-фреймворк Spring. Обеспечивает архитектуру паттерна Model — View — Controller (Модель — Отображение (далее — Вид) — Контроллер). Со Spring MVC интегрированы многие шаблонизаторы.

Он позволяет создавать веб-сайты или RESTful сервисы (например, JSON/XML) и хорошо интегрируется в экосистему Spring, например, он поддерживает контроллеры и REST контроллеры в ваших Spring Boot приложениях.

Вся логика работы Spring MVC построена вокруг DispatcherServlet, который принимает и обрабатывает все HTTP-запросы (из UI) и ответы на них. Рабочий процесс обработки запроса DispatcherServlet проиллюстрирован на диаграмме:

Все вышеупомянутые компоненты, а именно, HandlerMapping, Controller и ViewResolver, являются частями интерфейса WebApplicationContext extends ApplicationContext, с некоторыми дополнительными особенностями, необходимыми для создания web-приложений.

HTTP и REST API с использованием Spring.

Spring MVC позволяет разрабатывать не только классические веб-приложения, но и реализовывать REST API.

REST — это архитектурный стиль взаимодействия приложений в сети. Но в отличии от SOAP, у REST отсутствует какой-либо стандарт, а данные между клиентом и сервером могут предаваться в любом виде, будь то JSON, XML, YAML и т.д.

Spring Framework предоставляет богатый набор инструментов, упрощающий разработку REST API: инструменты для маршрутизации запросов, классы-кодеки для преобразования JSON/XML в объекты требуемых типов и т.д.

Подход Spring при построении RESTful web-сервиса заключается в обработке HTTP-запросов контроллером.

Далее мы рассмотрим подробнее.

Spring Data

Это удобный механизм для взаимодействия с сущностями базы данных, организации их в репозитории, извлечение данных, изменение, в каких то случаях для этого будет достаточно объявить интерфейс и метод в нем, без имплементации. Он обеспечивает доступ к данным: реляционные и нереляционные БД

В мире Java EE стандартом дефакто для работы с базами данных является JPA (Java Persistence API). Spring Data JPA, будучи частью Spring Data, реализует взаимодействие с реляционными СУБД, основываясь на JPA.

Главными компонентами для взаимодействий с БД в Spring Data являются репозитории. Каждый репозиторий работает со своим классом-сущностью.

Spring Cache

В Spring 3.1 представлена захватывающая технология кэширования на основе аннотаций, по сути, это не конкретное решение для реализации кэша (например, EHCache или OSCache), а абстракция использования кэша за счет использования существующего кода.

Технология кэширования в Spring также достаточно гибкая: она может не только использовать SpEL (Spring Expression Language) для определения ключа и различных условий кэширования, но также предоставляет готовые решения для временного хранения для кэширования, а также поддерживает основное профессиональное кэширование, такое как Интеграция с EHCache.

Таким образом по сути Spring Framework представляет собой просто контейнер внедрения зависимостей, с несколькими удобными слоями (например: доступ к базе данных, прокси, аспектно-ориентированное программирование, RPC, веб-инфраструктура MVC). Это все позволяет быстрее и удобнее создавать Java-приложения.

Преимущества Spring Framework

  • Безопасность : Простота внедрения модулей безопасности с функциями аутентификации и проверки.
  • Гибкие конфигурации : можно использовать аннотации на основе Java или конфигурацию XML.
  • Сильная поддержка экосистемы Java : Spring новаторски использует уже существующие технологии
  • Независимость от использующихся серверов приложений (Jboss, Tomcat).
  • Наличие множества готовых решений, позволяющих как можно быстрее решить технические задачи и перейти к реализации бизнес логики.

Приложение, разработанное с использованием Spring, является простым, поскольку код, зависящий от среды, перемещен в эту среду.

Создание Spring-проекта

Каждый раз, создавая очередное Java-приложение на основе Spring, необходимо повторять одни и те же шаги по его настройке

В зависимости от типа создаваемого приложения (Spring MVC, Spring JDBC, Spring ORM и т.д.) импортировать необходимые Spring-модули. Импортировать библиотеку web-контейнеров (в случае web-приложений). Импортировать необходимые сторонние библиотеки (например, Hibernate, Jackson), при этом необходимо искать версии, совместимые с указанной версией Spring. Конфигурировать компоненты Data Access Object (DAO), такие, как: источники данных, управление транзакциями и т.д. Конфигурировать компоненты web-слоя, такие, как: диспетчер ресурсов, view resolver. Определить класс, который загрузит все необходимые конфигурации.

  1. Запускаем Intellij IDEA Community Edition с начальным экраном Если при запуске среды сразу открывается проект, минуя такое окно, в верхнем меню выбираем File → Close Project.
  2. Устанавливаем нужные плагины. Нам понадобятся следующие:
    • Gradle
    • Spring Assistant
    • Lombok Plugin
  3. После установки всех плагинов перезапускаем среду разработки.
  4. Создаем новый проект
  5. Выбираем в левом меню Spring Assistant и нажимаем Next
  6. Заполняем данные о проекте:
    • Group id - обычно совпадает с базовым пакетом проекта, например, ru.java.course
    • Artifact id - название собранного файла, например, java-courses-spring
    • Version - первая версия проекта, можно оставить без изменений
    • Project type - Gradle Project
    • Language - Java
    • Packaging - Jar
    • Java version - ваша версия Java, например, 8
    • Project name - название проекта, можно сделать равным названию артефакта
    • Project description - произвольный текст с описанием проекта
    • Package name - базовый пакет Java-проекта, можно сделать равным ID группы

Нажимаем Next

  1. На следующем шаге выбираем модули Spring. Слева группы, посередине модули внутри выбранной группы, справа все что мы выбрали. В первых трех группах выбираем модули: Web, Freemarker, Lombok
  2. На следующем шаге все должно подставиться автоматически, но можно что-то подкорректировать
  3. Создаем проект. Какое-то время нужно будет подождать, пока произойдет инициализация и скачивание всех зависимостей. Наберитесь терпения. Если появляется вот такое окно: ставим галочку в поле Use auto-import и нажимаем OK
  4. Создаем файл как на скриншоте.
package ru.course.java.controllers;

import java.net.URI;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @GetMapping("/")
    public String helloWorld() {
        return "Hello World!";
    }
}

  1. Все, проект создан. Слева можно увидеть базовую структуру. Справа на вкладке Gradle список автоматизированных задач (если этой вкладке нет - перезапустите IDEA). Запускаем задачу application → bootRun. Заходим в браузер и переходим на страницу http://localhost:8080. Если в верхнем левом углу видим "Hello world" - значит все прошло успешно, поздравляю!

Список литературы/курсов

  1. https://spring.io/guides
  2. https://docs.spring.io/spring-framework/docs/current/reference/html/

Тема 33. Работа с потоками ForkJoinPool | Оглавление | Тема 35. HTTP и REST