Опубликовано

Представляем “Spring и Spring Boot. Разработка облачных приложений на Java”

Spring и Spring Boot. Разработка облачных приложений на Java

В книге рассмотрено актуальное состояние  технологий Spring и Spring Boot, помогающих шире раскрыть возможности языка Java и аспектно-ориентированного программирования. Пошагово объяснено, как самостоятельно написать и развернуть облачный проект под управлением Spring. Рассказано о координации микросервисов на Java с применением Spring и модуля Spring Core способах внедрения зависимостей, аннотировании кода. На примере сквозного веб-приложения описаны важнейшие приемы работы с данными в стиле REST, тестирование данных, обеспечение согласованности, безопасности и долговременного хранения данных в приложении.

Для Java-программистов    

  • Аспектно-ориентированное программирование
  • Хранение и обновление настроек приложения
  • Модуль Spring Core
  • Фреймворк Spring Security
  • Внедрение зависимостей и упаковка приложений в Java
  • Создание приложений в стиле REST
  • Тестирование Spring-приложений

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

Основное назначение описываемых технологий  — обслуживание микросервисов на Java и координация их взаимодействий.

Все примеры в книге рассмотрены на материале сквозного проекта, представляющего собой простую игру и иллюстрирующего основные приёмы взаимодействия с сервером, обновления данных и поддержания их актуальности.

Книгу “Spring и Spring Boot. Разработка облачных приложений на Java“.

Введение………………………………………………………………………………………………… 11

Глава 1. Теория……………………………………………………………………………………… 13

1.1. Краткая история Spring………………………………………………………………………………………………………. 13

1.2. Альтернативные фреймворки…………………………………………………………………………………………….. 14

1.3. Внедрение зависимостей……………………………………………………………………………………………………. 14

1.4. Инверсия управления………………………………………………………………………………………………………….. 19

1.5. Антипаттерны внедрения зависимостей…………………………………………………………………………… 22

1.6. Многоуровневая архитектура…………………………………………………………………………………………… 25

1.7. Аспектно-ориентированное программирование……………………………………………………………… 29

1.8. Резюме………………………………………………………………………………………………………………………………….. 31

Глава 2. Микросервисы…………………………………………………………………………. 33

2.1. Для чего нужны микросервисы?………………………………………………………………………………………… 33

2.2. Основные компоненты микросервисной архитектуры……………………………………………………. 34

2.3. Spring Cloud………………………………………………………………………………………………………………………….. 36

2.4. Kubernetes…………………………………………………………………………………………………………………………….. 37

2.5. Резюме………………………………………………………………………………………………………………………………….. 40

Глава 3. Примеры приложения………………………………………………………………. 41

3.1. Пример приложения на Spring Framework………………………………………………………………………… 41

3.1.1. Настройка пула соединений для Eclipse………………………………………………………………. 44

3.1.2. Настройка пула соединений для IntelliJ IDEA…………………………………………………….. 49

3.1.3. Запуск клиентской части проекта…………………………………………………………………………. 54

3.2. Пример приложения на Spring Boot…………………………………………………………………………………… 56

3.3. Резюме………………………………………………………………………………………………………………………………….. 56

Глава 4. Первые шаги……………………………………………………………………………. 59

4.1. Spring и контейнер бинов……………………………………………………………………………………………………. 59

4.2. Простой сервис на Spring Framework………………………………………………………………………………… 61

4.2.1. Скачайте исходные коды………………………………………………………………………………………. 61

4.2.2. Пояснения к исходному коду…………………………………………………………………………………. 61

4.2.3. Запуск………………………………………………………………………………………………………………………. 64

4.3. Простой сервис на Spring Boot…………………………………………………………………………………………… 64

4.3.1. Скачайте исходные коды………………………………………………………………………………………. 64

4.3.2. Spring Initializr………………………………………………………………………………………………………….. 64

4.3.3. Пояснения к исходному коду…………………………………………………………………………………. 66

4.3.4. Запуск………………………………………………………………………………………………………………………. 68

4.4. Различия между Spring Boot и Spring Framework……………………………………………………………… 68

4.5. Резюме………………………………………………………………………………………………………………………………….. 69

Глава 5. Модуль Spring Core………………………………………………………………….. 71

5.1. XML-конфигурация (для Spring Framework)……………………………………………………………………… 71

5.1.1. Листенер ContextLoadListener……………………………………………………………………………….. 71

5.1.2. Разделение по файлам и контекстам…………………………………………………………………….. 72

5.1.3. Пространства имен…………………………………………………………………………………………………. 73

5.1.4. Объявление бинов…………………………………………………………………………………………………… 74

5.1.5. Загрузка «пропертей» и профили………………………………………………………………………….. 75

5.1.6. Сканирование бинов………………………………………………………………………………………………. 77

5.1.7. Импортирование файлов конфигураций………………………………………………………………. 79

5.1.8. Коллекции……………………………………………………………………………………………………………….. 80

5.2. Java-конфигурация (для Spring Boot)………………………………………………………………………………… 83

5.2.1. Аннотация @SpringBootApplication…………………………………………………………………….. 83

5.2.2. Аннотации @Configuration и @Bean……………………………………………………………………. 84

5.2.3. Профили…………………………………………………………………………………………………………………… 85

5.3. Бины Spring………………………………………………………………………………………………………………………….. 89

5.3.1. Объявление……………………………………………………………………………………………………………… 89

5.3.2. Жизненный цикл……………………………………………………………………………………………………… 90

5.4. Резюме………………………………………………………………………………………………………………………………….. 93

Глава 6. Аспектно-ориентированное программирование……………………….. 95

6.1. Прокси JDK и CGLIB…………………………………………………………………………………………………………… 95

6.2. Аспекты Spring…………………………………………………………………………………………………………………….. 96

6.2.1. Аннотация @Transactional……………………………………………………………………………………. 96

6.2.2. Подключение зависимостей…………………………………………………………………………………… 96

6.2.3. XML-конфигурация АОП……………………………………………………………………………………….. 97

6.2.4. Java-конфигурация АОП………………………………………………………………………………………. 103

6.3. Библиотека AspectJ…………………………………………………………………………………………………………… 106

6.4. Резюме………………………………………………………………………………………………………………………………… 107

Глава 7. Работа с базами данных…………………………………………………………. 109

7.1. Слой постоянства……………………………………………………………………………………………………………… 109

7.2. Библиотека Liquibase……………………………………………………………………………………………………….. 112

7.2.1. Подключение зависимостей………………………………………………………………………………… 112

7.2.2. Настройка для Spring Framework………………………………………………………………………… 112

7.2.3. Настройка для Spring Boot…………………………………………………………………………………… 114

7.3. Spring JDBC………………………………………………………………………………………………………………………… 115

7.3.1. Подключение зависимостей………………………………………………………………………………… 115

7.3.2. Абстракция JdbcTemplate…………………………………………………………………………………….. 116

7.3.3. JdbcClient……………………………………………………………………………………………………………….. 119

7.3.4. Обработка исключений……………………………………………………………………………………….. 120

7.4. Спецификация JPA…………………………………………………………………………………………………………….. 122

7.4.1. Введение………………………………………………………………………………………………………………… 122

7.4.2. Подключение зависимостей………………………………………………………………………………… 123

7.4.3. Настройка для Spring Framework………………………………………………………………………… 123

7.4.4. Настройка для Spring Boot…………………………………………………………………………………… 126

7.4.5. Сущность JPA……………………………………………………………………………………………………….. 126

7.4.6. Выборка сущности JPA………………………………………………………………………………………… 130

7.4.7. Более сложная сущность JPA………………………………………………………………………………. 131

7.4.8. Стратегия именования…………………………………………………………………………………………. 135

7.4.9. Связи 1:М и М:1……………………………………………………………………………………………………. 137

7.4.10. Сущность Pet………………………………………………………………………………………………………. 148

7.4.11. Генерация первичного ключа……………………………………………………………………………. 152

7.4.12. Оптимистичная блокировка………………………………………………………………………………. 153

7.4.13. Связь М:М…………………………………………………………………………………………………………… 154

7.4.14. Методы hashCode и equals………………………………………………………………………………… 155

7.5. Шаблон Data Access Object……………………………………………………………………………………………… 156

7.5.1. DAO на аннотациях JPA………………………………………………………………………………………. 156

7.5.2. Выборка сущности……………………………………………………………………………………………….. 157

7.5.3. Получение ссылки на сущность без обращения к БД……………………………………….. 158

7.5.4. Сохранение сущности………………………………………………………………………………………….. 160

7.5.5. Состояния сущностей Hibernate………………………………………………………………………….. 160

7.5.6. Удаление сущности……………………………………………………………………………………………… 162

7.5.7. Именованные запросы…………………………………………………………………………………………. 163

7.5.8. Графы сущностей…………………………………………………………………………………………………. 165

7.5.9. Criteria API…………………………………………………………………………………………………………….. 168

7.5.10. Нативные запросы……………………………………………………………………………………………… 172

7.6. Hibernate…………………………………………………………………………………………………………………………….. 174

7.7. Spring Data…………………………………………………………………………………………………………………………. 175

7.8. Модуль Spring Data JPA……………………………………………………………………………………………………. 176

7.8.1. Подключение зависимостей………………………………………………………………………………… 176

7.8.2. Интерфейс Repository…………………………………………………………………………………………… 177

7.8.3. Интерфейс CrudRepository…………………………………………………………………………………… 177

7.8.4. Интерфейс JpaRepository……………………………………………………………………………………… 177

7.8.5. Методы репозиториев………………………………………………………………………………………….. 178

7.8.6. Аннотация @Transactional………………………………………………………………………………….. 180

7.8.7. Сортировка……………………………………………………………………………………………………………. 180

7.8.8. Репозиторий UserDao…………………………………………………………………………………………… 181

7.8.9. Постраничная разбивка……………………………………………………………………………………….. 182

7.8.10. Именованные запросы……………………………………………………………………………………….. 183

7.8.11. JPQL-запросы……………………………………………………………………………………………………… 185

7.8.12. Подсчет количества……………………………………………………………………………………………. 185

7.8.13. Механизм Criteria API………………………………………………………………………………………… 185

7.8.14. Графы сущностей……………………………………………………………………………………………….. 187

7.9. Управление транзакциями……………………………………………………………………………………………….. 187

7.10. Резюме……………………………………………………………………………………………………………………………… 190

Глава 8. Хранение настроек приложения……………………………………………… 191

8.1. Файлы «пропертей»………………………………………………………………………………………………………….. 191

8.2. Задание профиля и «пропертей» в Apache 8.3. Tomcat…………………………………………………. 193

8.4. Файлы «пропертей» в Spring Boot……………………………………………………………………………………. 194

8.5. Аннотация @ConfigurationProperties…………………………………………………………………………….. 195

8.6. Проект Spring Cloud Config………………………………………………………………………………………………. 197

8.7. Резюме………………………………………………………………………………………………………………………………… 200

Глава 9. Логирование…………………………………………………………………………… 201

9.1. Хаос с библиотеками логирования…………………………………………………………………………………. 201

9.2. Logback………………………………………………………………………………………………………………………………. 202

9.3. Стек ELK……………………………………………………………………………………………………………………………. 206

9.4. Резюме………………………………………………………………………………………………………………………………… 210

Глава 10. Локализация…………………………………………………………………………. 211

10.1. Интернациональные приложения…………………………………………………………………………………. 211

10.2. Интерфейс MessageSource……………………………………………………………………………………………… 212

10.3. Резюме……………………………………………………………………………………………………………………………… 216

Глава 11. Разработка веб-приложения………………………………………………….. 217

11.1. Фреймворк Spring MVC…………………………………………………………………………………………………… 217

11.1.1. Настройка для Spring Framework………………………………………………………………………. 217

11.1.2. Настройка для Spring Boot………………………………………………………………………………… 219

11.1.3. Контроллеры………………………………………………………………………………………………………. 219

11.1.4. Обработка HTTP GET………………………………………………………………………………………… 220

11.1.5. Обработка HTTP POST………………………………………………………………………………………. 222

11.1.6. Архитектурный стиль REST………………………………………………………………………………. 223

11.1.7. Обработка HTTP DELETE…………………………………………………………………………………. 224

11.1.8. Сокращенные аннотации…………………………………………………………………………………… 225

11.1.9. Обработка исключений……………………………………………………………………………………… 225

11.2. Спецификация Jakarta Validation…………………………………………………………………………………… 228

11.2.1. Подключение зависимостей………………………………………………………………………………. 228

11.2.2. Аннотация @Valid……………………………………………………………………………………………… 229

11.2.3. Аннотация @NotNull………………………………………………………………………………………….. 230

11.2.4. Аннотация @Size………………………………………………………………………………………………… 231

11.2.5. Аннотации @Min и @Max…………………………………………………………………………………. 231

11.3. Технология Jakarta Pages……………………………………………………………………………………………….. 232

11.3.1. Введение……………………………………………………………………………………………………………… 232

11.3.2. Примеры в Apache Tomcat………………………………………………………………………………… 232

11.3.3. Настройка для Spring Framework………………………………………………………………………. 232

11.3.4. Синтаксис JSP……………………………………………………………………………………………………… 235

11.3.5. Синтаксис JSPX…………………………………………………………………………………………………… 235

11.3.6. Пользовательские теги……………………………………………………………………………………….. 236

11.3.7. Главная страница сайта……………………………………………………………………………………. 238

11.3.8. Локализованные сообщения……………………………………………………………………………… 240

11.3.9. Выражения Jakarta Expression Language………………………………………………………….. 240

11.3.10. Тег jsp:directive.page………………………………………………………………………………………… 241

11.3.11. Тег jsp:output…………………………………………………………………………………………………….. 241

11.3.12. Основное содержимое файла home.jspx………………………………………………………… 242

11.3.13. Тег spring:htmlEscape……………………………………………………………………………………….. 243

11.3.14. Тег spring:url…………………………………………………………………………………………………….. 243

11.3.15. Контроллер HomeController……………………………………………………………………………. 243

11.3.16. Тег mvc:view-controller…………………………………………………………………………………….. 244

11.3.17. Атрибуты модели……………………………………………………………………………………………… 244

11.3.18. Тег c:forEach……………………………………………………………………………………………………… 247

11.3.19. Тег c:out…………………………………………………………………………………………………………….. 248

11.3.20. Тег spring:escapeBody………………………………………………………………………………………. 248

11.3.21. Формы……………………………………………………………………………………………………………….. 248

11.3.22. Интеграция с Jakarta Validation………………………………………………………………………. 250

11.3.23. Тег c:if………………………………………………………………………………………………………………… 252

11.3.24. Тег fmt:formatDate…………………………………………………………………………………………….. 253

11.3.25. Темы оформления…………………………………………………………………………………………….. 254

11.3.26. Интернационализация……………………………………………………………………………………… 256

11.4. Шаблонизатор Thymeleaf……………………………………………………………………………………………… 256

11.4.1. Thymleaf как современная замена Jakarta Pages…………………………………………….. 256

11.4.2. Настройка для Spring Boot………………………………………………………………………………… 257

11.4.3. Контроллер…………………………………………………………………………………………………………. 257

11.4.4. Префикс th…………………………………………………………………………………………………………… 258

11.4.5. Контекстно-относительные ссылки………………………………………………………………….. 259

11.4.6. Фрагменты…………………………………………………………………………………………………………… 259

11.4.7. Элемент th:block…………………………………………………………………………………………………. 260

11.4.8. Локализованные сообщения……………………………………………………………………………… 261

11.4.9. Фрагмент header…………………………………………………………………………………………………. 261

11.4.10. Фрагмент menu………………………………………………………………………………………………….. 262

11.4.11. Фрагмент footer………………………………………………………………………………………………… 263

11.4.12. Атрибут th:each………………………………………………………………………………………………… 263

11.4.13. Формы……………………………………………………………………………………………………………….. 266

11.4.14. Интеграция с Jakarta Validation………………………………………………………………………. 268

11.4.15. Атрибут th:if……………………………………………………………………………………………………… 268

11.5. Модуль Spring WebFlux………………………………………………………………………………………………….. 269

11.6. Резюме……………………………………………………………………………………………………………………………… 272

Глава 12. Фреймворк Spring Security…………………………………………………….. 273

12.1. Архитектура Spring Security…………………………………………………………………………………………… 273

12.2. Подключение к проекту………………………………………………………………………………………………….. 275

12.3. Конфигурация…………………………………………………………………………………………………………………. 276

12.4. Интерфейсы UserDetails и UserDetailsService………………………………………………………………. 279

12.5. Интерфейсы AuthentiationManager и Authentication Provider……………………………………. 284

12.6. SecurityContextRepository………………………………………………………………………………………………. 287

12.7. Раздел сайта SecurityFilterChain…………………………………………………………………………………… 289

12.7.1. Зоны доступа………………………………………………………………………………………………………. 289

12.7.2. Тег security:http и метод securityMatcher………………………………………………………….. 289

12.7.3. Тег security:intercept-url и метод authorizeHttpRequests…………………………………. 290

12.7.4. Защита от CSRF………………………………………………………………………………………………….. 292

12.7.5. Форма входа……………………………………………………………………………………………………….. 294

12.7.6. Кнопка выхода……………………………………………………………………………………………………. 296

12.7.7. Листинги……………………………………………………………………………………………………………… 297

12.8. SecurityFilterChain зоны API клиента…………………………………………………………………………… 298

12.8.1. Тег security:http и метод securityMatcher………………………………………………………….. 298

12.8.2. Интерфейс AuthenticationEntryPoint………………………………………………………………… 299

12.8.3. Тег security:intercept-url и метод authorizeHttpRequests…………………………………. 301

12.8.4. Механизм CORS…………………………………………………………………………………………………. 302

12.8.5. Защита от CSRF………………………………………………………………………………………………….. 304

12.8.6. Листинги……………………………………………………………………………………………………………… 305

12.8.7. Аутентификация из контроллера………………………………………………………………………. 306

12.9. Авторизация на основе методов……………………………………………………………………………………. 308

12.10. Библиотека Spring Security JSP Taglib………………………………………………………………………….. 310

12.11. Интеграция с Thymeleaf……………………………………………………………………………………………….. 311

12.12. Резюме……………………………………………………………………………………………………………………………. 313

Глава 13. Документирование REST-сервисов……………………………………….. 315

13.1. Введение………………………………………………………………………………………………………………………….. 315

13.2. Подключение зависимостей…………………………………………………………………………………………… 315

13.3. Просмотр сгенерированной документации………………………………………………………………….. 316

13.4. Документирование API…………………………………………………………………………………………………… 317

13.5. Резюме……………………………………………………………………………………………………………………………… 321

Глава 14. Тесты……………………………………………………………………………………. 323

14.1. Виды тестов…………………………………………………………………………………………………………………….. 323

14.2. Фреймворк JUnit………………………………………………………………………………………………………………. 323

14.2.1. Подключение зависимостей………………………………………………………………………………. 323

14.2.2. Простейший тест………………………………………………………………………………………………… 324

14.2.3. Запуск тестов………………………………………………………………………………………………………. 327

14.2.4. Параметризованные тесты………………………………………………………………………………… 329

14.3. Фреймворк TestNG………………………………………………………………………………………………………….. 331

14.3.1. Подключение зависимостей………………………………………………………………………………. 331

14.3.2. Простейший тест………………………………………………………………………………………………… 331

14.3.3. Запуск тестов………………………………………………………………………………………………………. 333

14.3.4. Параметризованные тесты………………………………………………………………………………… 334

14.4. Фреймворк Mockito…………………………………………………………………………………………………………. 335

14.4.1. Введение……………………………………………………………………………………………………………… 335

14.4.2. Зависимости Mockito + JUnit……………………………………………………………………………… 336

14.4.3. Примеры в тестовом приложении……………………………………………………………………… 337

14.4.4. Интеграция с тестом JUnit………………………………………………………………………………….. 337

14.4.5. Mock-объекты…………………………………………………………………………………………………….. 337

14.4.6. Настройка возвращаемых значений………………………………………………………………… 338

14.4.7. Дополнительные примеры…………………………………………………………………………………. 340

14.4.8. Подсчет вызова методов……………………………………………………………………………………. 342

14.4.9. Перехват параметров…………………………………………………………………………………………. 343

14.4.10. Зависимости Mockito + TestNG……………………………………………………………………….. 345

14.4.11. Интеграция с тестом TestNG……………………………………………………………………………. 346

14.5. Фреймворк Spring…………………………………………………………………………………………………………….. 348

14.5.1. Введение……………………………………………………………………………………………………………… 348

14.5.2. Подключение зависимостей………………………………………………………………………………. 349

14.5.3. Интеграция JUnit и Spring…………………………………………………………………………………… 349

14.5.4. Библиотека Testcontainers…………………………………………………………………………………. 350

14.5.5. Класс SingleConnectionDataSource………………………………………………………………….. 352

14.5.6. Класс ClockConfig……………………………………………………………………………………………… 354

14.5.7. Класс BaseDaoImplTest………………………………………………………………………………………. 355

14.5.8. Аннотация @DataJpaTest………………………………………………………………………………….. 356

14.5.9. Класс BookcaseDaoImplTest………………………………………………………………………………. 357

14.5.10. Аннотация @Sql……………………………………………………………………………………………….. 358

14.5.11. Библиотека assertj…………………………………………………………………………………………….. 359

14.5.12. Фреймворк MockMvc……………………………………………………………………………………….. 360

14.5.13. Аннотация @SpringBootTest……………………………………………………………………………. 360

14.5.14. Настройка MockMvc для Spring Framework……………………………………………………. 362

14.5.15. Простой тест MockMvc…………………………………………………………………………………….. 363

14.5.16. Аннотация @MockBean……………………………………………………………………………………. 364

14.5.17. Интеграция MockMvc и Spring Security……………………………………………………………. 365

14.6. Резюме……………………………………………………………………………………………………………………………… 368

Глава 15. Клиентское приложение……………………………………………………….. 369

15.1. Проект Spring Mobile……………………………………………………………………………………………………….. 369

15.2. Приложение Progressive Web Application………………………………………………………………………. 369

15.3. Работающая игра……………………………………………………………………………………………………………. 371

Заключение………………………………………………………………………………………….. 377

Предметный указатель…………………………………………………………………………. 379