Динеш Раджпут Spring. Все паттерны проектирования Серия «Библиотека программиста» Перевели с английского Е. Иконникова, И. Пальти Заведующая редакцией Ю. Сергиенко Руководитель проекта О. Сивченко Ведущий редактор Н. Гринчик Литературный редактор Н. Хлебина Художественный редактор С. Заматевская Корректоры Е. Павлович, Т. Радецкая Верстка Г. Блинов ББК 32.988.02-018 УДК 004.738.2 Раджпут Динеш Р15 Spring. Все паттерны проектирования. — СПб.: Питер, 2019. — 320 с.: ил. — (Се- рия «Библиотека программиста»). ISBN 978-5-4461-0935-7 В этой книге дается обзор фреймворка Spring 5 и паттернов проектирования для него. Объясняется принцип внедрения зависимостей (dependency injection), играющий ключевую роль при создании слабосвязанного кода во фреймворке Spring. Затем рассматриваются классические паттерны «Банды четырех» при проектировании приложений на Spring. В следующих частях книги автор рассматривает паттерны аспектно-ориентированного программирования (AOP), шаблоны JDBC, позволяющие аб- страгировать доступ к базе данных. В заключительных главах книги автор исследует работу с MVC, реактивные шаблоны проектирования и паттерны проектирования, применяемые при конкурентном и параллельном программировании в Spring. 16+ (В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.) ISBN 978-1788299459 англ. © Packt Publishing 2017. First published in the English language under the title «Spring 5 Design Patterns — (9781788299459)» ISBN 978-5-4461-0935-7 © Перевод на русский язык ООО Издательство «Питер», 2019 © Издание на русском языке, оформление ООО Издательство «Питер», 2019 © Серия «Библиотека программиста», 2019 Права на издание получены по соглашению с Packt Publishing. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как на- дежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги. Издательство не несет ответственности за доступность материалов, ссылки на которые вы можете найти в этой книге. На момент подготовки книги к изданию все ссылки на интернет- ресурсы были действующими. Изготовлено в России. Изготовитель: ООО «Прогресс книга». Место нахождения и фактический адрес: 194044, Россия, г. Санкт-Петербург, Б. Сампсониевский пр., д. 29А, пом. 52. Тел.: +78127037373. Дата изготовления: 12.2018. Наименование: книжная продукция. Срок годности: не ограничен. Налоговая льгота — общероссийский классификатор продукции ОК 034-2014, 58.11.12 — Книги печатные профессиональные, технические и научные. Импортер в Беларусь: ООО «ПИТЕР М», 220020, РБ, г. Минск, ул. Тимирязева, д. 121/3, к. 214, тел./факс: 208 80 01. Подписано в печать 07.12.18. Формат 70×100/16. Бумага офсетная. Усл. п. л. 25,800. Тираж 700. Заказ 0000. Отпечатано в ОАО «Первая Образцовая типография». Филиал «Чеховский Печатный Двор». 142300, Московская область, г. Чехов, ул. Полиграфистов, 1. Сайт: www.chpk.ru. E-mail: [email protected] Факс: 8(496) 726-54-10, телефон: (495) 988-63-87 Краткое содержание Об авторе ...................................................................................................................12 О рецензенте ..............................................................................................................13 Предисловие ...............................................................................................................14 Глава 1. Знакомство с Spring Framework 5.0 и паттернами проектирования ...............18 Глава 2. Обзор паттернов проектирования GoF: базовые паттерны проектирования ...45 Глава 3. Соображения по поводу структурных и поведенческих паттернов ...............68 Глава 4. Связывание компонентов с помощью паттерна внедрения зависимостей ...105 Глава 5. Жизненный цикл компонентов и используемые паттерны ..........................138 Глава 6. Аспектно-ориентированное программирование в Spring с помощью паттернов «Заместитель» и «Декоратор» .................................................................159 Глава 7. Доступ к базе данных с помощью фреймворка Spring и JDBC-реализаций паттерна «Шаблонный метод» ...................................................184 Глава 8. Доступ к базе данных с помощью паттернов ORM и транзакций ................206 Глава 9. Улучшение производительности приложения с помощью паттернов кэширования ............................................................................................................227 Глава 10. Реализация паттерна MVC в веб-приложениях с помощью фреймворка Spring ...................................................................................................245 Глава 11. Реализация реактивных паттернов проектирования ................................288 Глава 12. Реализация конкурентных паттернов .......................................................312 Оглавление Об авторе ...................................................................................................................12 О рецензенте ..............................................................................................................13 Предисловие ...............................................................................................................14 Темы, рассматриваемые в книге ..............................................................................14 Что нужно для чтения книги ....................................................................................16 Принятые обозначения ............................................................................................16 Скачивание кода примеров ......................................................................................17 Об ошибках .............................................................................................................17 Глава 1. Знакомство с Spring Framework 5.0 и паттернами проектирования ...............18 Знакомство с фреймворком Spring ...........................................................................18 Упрощение разработки приложений благодаря применению Spring и паттернов .....20 Использование широчайших возможностей паттерна POJO ..............................21 Внедрение зависимостей между POJO ..............................................................22 Использование паттерна внедрения зависимостей для зависимых компонентов ....................................................................................................25 Применение объектов для сквозных задач .......................................................29 Применение шаблонов для устранения стереотипного кода .............................33 Использование контейнеров Spring для управления компонентами с помощью паттерна «Фабрика» ..............................................................................36 Фабрики компонентов ......................................................................................36 Контексты приложений ....................................................................................37 Создание контейнера с контекстом приложения ...............................................37 Жизнь компонента в контейнере .............................................................................38 Модули фреймворка Spring ......................................................................................40 Core Container Spring ........................................................................................41 Модуль AOP ......................................................................................................42 Spring DAO — доступ к данным и интеграция ...................................................42 ORM .................................................................................................................42 Web MVC ..........................................................................................................42 Новые возможности Spring Framework 5.0 ...............................................................43 Резюме ....................................................................................................................44 Глава 2. Обзор паттернов проектирования GoF: базовые паттерны проектирования ...45 Возможности паттернов проектирования .................................................................46 Обзор часто используемых паттернов проектирования GoF .....................................47 Оглавление 7 Порождающие паттерны проектирования ................................................................48 Паттерн проектирования «Фабрика» ................................................................49 Паттерн проектирования «Абстрактная фабрика» ............................................52 Паттерн проектирования «Одиночка» ..............................................................58 Паттерн проектирования «Прототип» ...............................................................60 Паттерн проектирования «Строитель» .............................................................63 Резюме ....................................................................................................................66 Глава 3. Соображения по поводу структурных и поведенческих паттернов ...............68 Базовые паттерны проектирования .........................................................................68 Структурные паттерны проектирования ...........................................................69 Поведенческие паттерны проектирования ........................................................94 Паттерны проектирования J2EE .............................................................................103 Резюме ..................................................................................................................104 Глава 4. Связывание компонентов с помощью паттерна внедрения зависимостей ...105 Паттерн внедрения зависимостей ..........................................................................106 Решение проблем с помощью паттерна внедрения зависимостей ...................106 Виды внедрения зависимостей ..............................................................................111 Внедрение зависимостей через конструктор ...................................................111 Внедрение зависимости через сеттер .............................................................113 Сравнение внедрений через конструктор и сеттер, а также рекомендуемые практики ...............................................................................115 Описание конфигурации паттерна внедрения зависимостей с помощью Spring ......115 Использование паттерна внедрения зависимостей с Java-конфигурацией ..............117 Создание класса Java-конфигурации: AppConfig.java ......................................117 Объявления компонентов Spring в классе конфигурации ................................117 Внедрение компонентов Spring .......................................................................118 Оптимальный подход к настройке паттерна внедрения зависимостей с помощью Java ..............................................................................................119 Использование паттерна внедрения зависимостей с XML-конфигурацией ..............120 Создание файла XML-конфигурации ...............................................................120 Объявление компонентов Spring в XML-файле ................................................121 Внедрение компонентов Spring .......................................................................121 Использование паттерна внедрения зависимостей с конфигурацией на основе аннотаций .............................................................................................................124 Что такое стереотипные аннотации ................................................................124 Автосвязывание зависимостей и неоднозначности .........................................131 Рекомендуемые практики для конфигураций паттерна DI ......................................135 Резюме ..................................................................................................................137 Глава 5. Жизненный цикл компонентов и используемые паттерны ..........................138 Жизненный цикл компонента Spring и его фазы ....................................................139 Фаза инициализации ......................................................................................140 Фаза использования компонентов ..................................................................150 Фаза уничтожения компонента .......................................................................151 8 Оглавление Области видимости компонентов ...........................................................................153 Одиночная область видимости .......................................................................154 Прототипная область видимости компонента .................................................155 Сеансовая область видимости компонента .....................................................155 Запросная область видимости компонента .....................................................155 Другие области видимости в Spring ................................................................156 Резюме ..................................................................................................................158 Глава 6. Аспектно-ориентированное программирование в Spring с помощью паттернов «Заместитель» и «Декоратор» .................................................................159 Паттерн «Заместитель» в Spring ............................................................................160 Что такое сквозная функциональность ..................................................................162 Что такое аспектно-ориентированное программирование ......................................162 Проблемы, решаемые с помощью AOP ............................................................163 Как AOP решает проблемы .............................................................................166 Основные понятия и терминология AOP ................................................................167 Совет .............................................................................................................167 Точка соединения ..........................................................................................168 Срез ...............................................................................................................169 Аспект ............................................................................................................169 Вплетение ......................................................................................................169 Задание срезов ......................................................................................................170 Создание аспектов ................................................................................................172 Реализация советов ...............................................................................................174 Тип совета: до ................................................................................................174 Тип совета: после возврата ............................................................................175 Тип совета: после исключения .......................................................................176 Тип совета: после ..........................................................................................177 Тип совета: везде ...........................................................................................178 Описание аспектов с помощью XML-конфигурации ................................................180 AOP-прокси ............................................................................................................181 Резюме ..................................................................................................................183 Глава 7. Доступ к базе данных с помощью фреймворка Spring и JDBC-реализаций паттерна «Шаблонный метод» ...................................................184 Оптимальный подход к проектированию доступа к данным ...................................185 Задача управления ресурсами ........................................................................187 Реализация паттерна проектирования «Шаблонный метод» ...........................188 Настройка источника данных и паттерн «Пул объектов» .......................................192 Задание настроек источника данных с помощью JDBC-драйвера ....................193 Конфигурирование источника данных с помощью пула соединений ...............194 Реализация паттерна «Строитель» для создания встроенного источника данных ..196 Абстрагирование доступа к базе данных с помощью паттерна DAO .......................196 Реализация паттерна DAO с помощью фреймворка Spring .....................................197 Работа с JdbcTemplate ....................................................................................198 Когда использовать JdbcTemplate ...................................................................199 Оглавление 9 Рекомендуемые практики JDBC и настройки JdbcTemplate .....................................204 Резюме ..................................................................................................................205 Глава 8. Доступ к базе данных с помощью паттернов ORM и транзакций ................206 Фреймворки ORM и используемые в них паттерны.................................................207 Управление ресурсами и транзакциями ..........................................................209 Единообразная обработка и трансляция исключений .....................................209 Паттерн «Объект доступа к данным» .....................................................................210 Создание объектов DAO в Spring с помощью паттерна проектирования «Фабрика» .....................................................................................................211 Паттерн «Отображение данных» ....................................................................212 Паттерн «Модель предметной области» .........................................................213 Прокси для паттерна «Отложенная загрузка» ................................................214 Паттерн «Шаблонный метод» для поддержки Hibernate в Spring ....................214 Интеграция Hibernate со Spring ..............................................................................214 Задание настроек объекта SessionFactory фреймворка Hibernate в контейнере Spring .......................................................................................214 Реализация объектов DAO на основе простого API Hibernate ..........................216 Стратегии управления транзакциями в Spring ........................................................217 Декларативное задание границ и реализация транзакций ..............................219 Развертывание диспетчера транзакций ..........................................................220 Программное задание границ и реализация транзакций .................................223 Рекомендуемые практики для ORM Spring и модуля транзакций приложения ........225 Резюме ..................................................................................................................226 Глава 9. Улучшение производительности приложения с помощью паттернов кэширования ............................................................................................................227 Что такое кэш ........................................................................................................228 Абстракция кэша ...................................................................................................228 Включение возможности кэширования посредством паттерна «Заместитель» .......229 Включение прокси для кэширования с помощью аннотаций ...........................230 Включение прокси для кэширования с помощью пространства имен XML .......231 Декларативное кэширование с помощью аннотаций ..............................................232 Аннотация @Cacheable ...................................................................................232 Аннотация @CachePut ....................................................................................233 Аннотация @CacheEvict ..................................................................................235 Аннотация @Caching ......................................................................................236 Аннотация @CacheConfig ................................................................................236 Декларативное кэширование с помощью XML ........................................................237 Настройка хранилища кэша ...................................................................................240 Сторонние диспетчеры кэша ..................................................................................240 EhCache ..........................................................................................................240 XML-конфигурация .........................................................................................241 Создание пользовательских аннотаций кэширования ............................................242 Лучшие рекомендуемые практики для веб-приложений .........................................242 Резюме ..................................................................................................................244 10 Оглавление Глава 10. Реализация паттерна MVC в веб-приложениях с помощью фреймворка Spring ...................................................................................................245 Реализация паттерна MVC в веб-приложении ........................................................246 Архитектура «Модель 2» паттерна MVC в Spring ....................................................247 Паттерн проектирования «Единая точка входа» .............................................248 Включение возможностей MVC Spring ....................................................................257 Реализация контроллеров ..............................................................................259 Отображение запросов с помощью аннотации @RequestMapping ...................260 Передача данных модели представлению ..............................................................264 Принятие параметров запроса........................................................................265 Обработка форм веб-страницы .......................................................................268 Реализация контроллера обработки форм ......................................................270 Привязка данных с помощью паттерна проектирования «Команда» ......................272 Проверка корректности входных параметров форм ...............................................275 Реализация компонента «Представление» в паттерне MVC....................................277 Описание арбитра представлений в MVC Spring .............................................278 Паттерн «Вспомогательный компонент представления» .................................281 Паттерн «Составное представление» и использование арбитра представлений фреймворка Apache Tiles ........................................................283 Рекомендуемые практики проектирования веб-приложений ..................................285 Резюме ..................................................................................................................286 Глава 11. Реализация реактивных паттернов проектирования ................................288 Изменение требований к приложениям с течением времени..................................288 Паттерн «Реактивность» ........................................................................................290 Отличительные признаки паттерна «Реактивность» .......................................290 Блокирующие вызовы ............................................................................................296 Неблокирующие вызовы ........................................................................................296 Контроль обратного потока данных .......................................................................297 Реализация реактивности с помощью фреймворка Spring 5.0 ................................298 Реактивный веб-модуль Spring ...............................................................................299 Реализация реактивного веб-приложения на стороне сервера .......................300 Модель программирования на основе аннотаций ...........................................301 Функциональная модель программирования ..................................................303 Реализация реактивного приложения на стороне клиента ..............................308 Преобразование типов тела запроса и ответа .......................................................310 Резюме ..................................................................................................................311 Глава 12. Реализация конкурентных паттернов .......................................................312 Паттерн «Активный объект» ..................................................................................313 Паттерн проектирования «Монитор» .....................................................................314 Паттерны «Полусинхронность» и «Полуасинхронность» ........................................315 Паттерн «Ведущий/ведомые» ................................................................................316 Паттерн «Реактор» ................................................................................................317 Паттерн «Локальная память потока выполнения» .................................................319 Резюме ..................................................................................................................320