
В книге рассмотрено актуальное состояние технологий 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
