Разработка enterprise-приложения на основе spring framework
TRANSCRIPT
9 апреля 2015 года
Разработка Enterprise-приложения
на основе Spring Framework:
собираем конструктор
Вячеслав Муравлев
Ведущий Java-разработчик
Наша компания занимается:
проектированием, разработкой, внедрением,
сопровождением, развитием…
…заказных информационных систем
на полном жизненном цикле
t8/67
О себе
Окончил ВМК МГУ в 2000 году
8 лет работал в inhouse-разработке
крупного банка (Java)
В CUSTIS пришел в 2012 году:
ведущий Java-гитарист разработчик
14/67
План семинара
Поговорим немного о Spring
Сделаем небольшой гешефт
по онлайн-продаже книг
Посмотрим на возможности Spring
из коробки для решения типовых задач
15/67
Почему Spring?
Богатая история (более 11 лет)
Традиция
На фоне J2EE выглядел просто отпадно!
Много идей было перенесено в JEE (ver. >= 5)
Мощный, много возможностей (фактически,
альтернатива JEE)
Основан на правильных идеях (IoC)
Хорошая инструментальная поддержка (в IDE)
Широкое сообщество, много литературы
и материалов
Изящный
17/67
Краткое введение в Spring
Основной принцип – Inversion of Control (IoC)
Альтернативное название – Dependency Injection
Компоненты приложения:
Java Bean
Доступны только через интерфейсы
Spring выступает как контейнер
для компонентов
Предоставляет возможности для гибкой
настройки компонентов и их взаимосвязей
18/67
Spring – это не только ценный мех
в виде DI-контейнера
…но и богатый набор инструментов
для работы практически со всеми аспектами жизни
Enterprise-приложения:
работа с данными (JDBC, JPA)
поддержка создания веб-приложений
работа с транзакциями
асинхронное взаимодействие
авторизация и аутентификация
batch и scheduling
aspect-oriented programming
23/67
Магазин ACME Bookstore
Трехзвенное приложение:
СУБД PostgreSQL
Веб-сервер (возьмем Jetty)
Веб-клиент
Выбор книг из списка и оформление заказа
Административная часть:
Просмотр статистики
Загрузка списка книг
25/67
Инфраструктура проекта
Используем Maven3
IntelliJ IDEA 14 Ultimate
PostgreSQL 9.4
БД подготовлена заранее
Jetty 9.2.7
26/67
Создаем проект
Создаем сам проект в IDEA
Прописываем зависимости от Spring
Устанавливаем уровень языка 1.7
28/67
Создаем новый модуль
Для создания сущностей и основных
интерфейсов создадим модуль
bookstore-domain
Подключим Hibernate и Spring ORM
Настроим контекст Spring
Напишем тест
Настроим подключение к СУБД
Настроим JPA mapping
29/67
Шаблон «Репозиторий»
Экранирует бизнес-логику от технологии
работы с данными
Ограничивает и структурирует доступ
к данным
31/67
Используем волшебство Spring Data
Подключаем Spring Data
Создаем интерфейс репозитория и тест
Подключаем поддержку транзакций
Создаем custom-метод на основе запроса к БД
32/67
Наращиваем «мясо» –
создаем бизнес-логику
Создаем интерфейс бизнес-сервиса
и реализацию
Пишем тест
Подключаем в реализацию репозитории
из Spring Сontext
Подключаем реализацию как Spring Bean
33/67
«Мы это будем загружать из…»
В «кровавом» Enterprise никто не хочет
вести справочники вручную
Справочники грузят:
из СУБД других систем
файлов разнообразных форматов
очередей сообщений…
Возникают типовые задачи:
загрузка обновлений
журналирование работы
распараллеливание…
35/67
Spring batch macht frei
Разработан совместно с Accenture
Инфраструктура для запуска
и мониторинга пакетных задач
Сведение к минимуму boilerplate-кода
От разработчика нужна только логика
чтения, трансформации и записи данных
36/67
Загрузка списка книг
Список находится в файле CSV
Подключаем Spring Batch
Создаем компоненты для чтения и записи
Настраиваем инфраструктуру и job
Запускаем и загружаем список книг
41/67
Подключаем Spring MVC
Создаем новый модуль bookstore-web
Подключаем Spring MVC зависимости
Настраиваем DispatcherServlet
для приложения
Для красоты приправим Twitter Boostrap
И запустим все это на Jetty
47/67
Отображаем список книг
Создаем контроллер
Реализуем логику загрузки книг
(с фильтром по жанру)
Создаем JSP-страницу со списком
Настраиваем ViewResolver
48/67
Формируем корзину с книгами
Создаем компонент для корзины
Добавляем в контроллер метод
для внесения книги в корзину
Создаем метод для отображения корзины
Создаем страницу для отображения
корзины
49/67
Оформляем заказ на книги
Подключаем к контроллеру сервис заказов
Реализуем логику формирования заказа
Реализуем логику загрузки всех заказов
Создаем страницу со списком заказов
50/67
Spring Scheduling & Task Execution
Может использовать стандартные JDK Timers
и Quartz Scheduler
Гибкая настройка политики выполнения задач:
асинхронное
синхронное
с пулом thread’ов…
Запуск задач:
по расписанию (cron и периодически)
по триггерам
52/67
Мониторинг заказов
Будем собирать общую статистику
по заказам
Сборка статистики будет происходить
по расписанию
Просмотр статистики через веб-интерфейс
54/67
Сбор статистики
Создаем DashboardService
Используем JdbcTemplate
для сбора и обновления статистики
Создаем в веб-приложении
DashboardController с вызовом сервиса
Создаем страницу для просмотра
статистики
55/67
Spring AOP
Pure Java, runtime weaving
Аспекты настраиваются как обычные
Spring beans
По умолчанию используются JDK Proxies
(только интерфейсы)
Можно подключить CGLIB proxies
для классов
Поддержка транзакций в Spring
реализована с помощью AOP
57/67
Создадим аспект профилирования
Будем измерять время выполнения
метода
Подключим аспект к сбору статистики
Подключаем AOP-зависимости
Создаем ProfileDashboardActionsAspect
Настраиваем аспект в контексте domain-
context
58/67
Почему Spring Security
Независимость от конкретного контейнера
Большой выбор протоколов аутентификации
Гибкий механизм авторизации
Типовые решения из коробки
60/67
Подключаем Spring Security
Добавляем зависимости spring-security
В domain-context настраиваем
authentication-manager
Создаем новую сущность User
и репозиторий для нее
62/67
Дорабатываем веб-приложение
Cоздаем отдельный контекст
Настраиваем две политики:
зарегистрированные пользователи
администраторы системы
Настраиваем web.xml
Создаем страницу входа в систему
Создаем новый AdministrationController
Реализуем логику входа
Доработаем PurchaseController
для отображения текущего пользователя63/67
Дорабатываем бизнес-сервис
Дорабатываем формирование заказа –
используем текущего пользователя
Дорабатываем отображение заказа –
фильтруем по текущему пользователю
64/67
Резюме
Spring Framework – это отличное средство
для избавления от boilerplate-кода
Он содержит в себе решения
для повседневных задач разработчика
Enterprise-приложений
Решения очень гибко настраиваются
Прежде чем писать свой инструментарий –
внимательно смотрим в Spring!!!
65/67
Что почитать
Сайт Spring Framework
“Pro Spring” Clarence Ho, Bob Harrop
“Spring Recipes” Gary Mak, Josh Long,
and Daniel Rubio (сборник how-to)
Stackoverflow.com – вопросы и ответы
66/67