Паттерны проектирования, используемые в Spring Framework
Привет, хабровчане! Длинные выходные завершились, а это значит, что пришло время поделиться новым полезным переводом. Сегодня поговорим о паттернах проектирования, используемых в Spring Framework. Как вы догадались, данный материал приурочен к старту набора новой группы по курсу «Разработчик на Spring Framework», который стартует 28 мая. Начнем.
В этой статье сделаем обзор нескольких паттернов проектирования, которые широко используются в Spring Framework. Паттерны проектирования описывают приёмы программирования в объектно-ориентированной разработке программного обеспечения.
Вот некоторые известные паттерны, используемые в Spring Framework:
- Proxy (Заместитель)
- Singleton (Одиночка)
- Factory (Фабрика)
- Template (Шаблон)
- Model View Controller (Модель-Представление-Контроллер)
- Front Controller (Контроллер запросов)
- View Helper (Вспомогательный компонент представления)
- Dependency injection и Inversion of control (IoC) (Внедрение зависимостей и инверсия управления)
- Service Locator (Локатор служб)
- Observer-Observable (Наблюдатель)
- Context Object (Контекстный объект)
Proxy (Заместитель)
Паттерн Proxy широко используется в AOP и remoting.
Эта фабрика создаёт AOP-прокси на основе Spring-бина.
Прокси предоставляет заместителя для другого объекта, чтобы контролировать доступ к нему.
Прочитать больше про Proxy вы можете здесь.
Singleton (Одиночка)
Паттерн Singleton гарантирует, что в памяти будет существовать только один экземпляр объекта, который будет предоставлять сервисы.
В Spring область видимости бина (scope) по умолчанию равна singleton и IoC-контейнер создаёт ровно один экземпляр объекта на Spring IoC-контейнер.
Spring-контейнер будет хранить этот единственный экземпляр в кэше синглтон-бинов, и все последующие запросы и ссылки для этого бина получат кэшированный объект.
Рекомендуется использовать область видимости singleton для бинов без состояния.
Область видимости бина можно определить как singleton или как prototype (создаётся новый экземпляр при каждом запросе бина).
Пример конфигурации в xml-файле:
Почитать больше про Singleton вы можете здесь.
Factory (Фабрика)
Этот паттерн позволяет инициализировать объект через публичный статический метод, называемый фабричным методом.
Spring использует паттерн Factory для создания объекта бина с использованием следующих двух подходов.
- BeanFactory
Простой контейнер, который обеспечивает базовую поддержку DI (Dependency Injection, инъекция зависимостей). Для работы с этим контейнером используется интерфейс org.springframework.beans.factory.BeanFactory . - ApplicationContext
Другой контейнер, присутствующий в Spring, который добавляет специфичные enterprise-функции. Эти функции включают в себя возможность чтения параметров из property-файлов и публикацию событий приложения для слушателей событий.
Для работы с этим контейнером используется интерфейс org.springframework.context.ApplicationContext .
Ниже приведены наиболее часто используемые реализации ApplicationContext .
- FileSystemXmlApplicationContext — в конструкторе необходимо указать полный путь к XML-файлу с конфигурацией бинов.
- ClassPathXmlApplicationContext — необходимо поместить XML-файл с конфигурацией бинов в CLASSPATH.
- XmlWebApplicationContext — загружает XML-файл с метаданными бинов в веб-приложении.
package com.eduonix.springframework.applicationcontext; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class App < public static void main(String[] args) < ApplicationContext context = new FileSystemXmlApplicationContext( "C:/work/IOC Containers/springframework.applicationcontext/src/main/resources/bean-factory-config.xml"); HelloApplicationContext obj = (HelloApplicationContext) context.getBean("helloApplicationContext"); obj.getMsg(); >>
Чтобы лучше понять это, давайте рассмотрим реальный пример. Сначала конфигурацию:
public class Welcomer < private String message; public Welcomer(String message) < this.message = message; >public static Welcomer createWelcomer(MessageLocator messagesLocator) < Calendar cal = Calendar.getInstance(); String msgKey = "welcome.pm"; if (cal.get(Calendar.AM_PM) == Calendar.AM) < msgKey = "welcome.am"; >return new Welcomer(messagesLocator.getMessageByKey(msgKey)); > >
Почитать больше про Factory вы можете здесь.
Template (Шаблон)
Этот паттерн широко используется для работы с повторяющимся бойлерплейт кодом (таким как, закрытие соединений и т. п.).
Например, JdbcTemplate, JmsTemplate, JpaTemplate (Примечание переводчика: JpaTemplate объявлен устаревшим с Spring 3.1).
Почитать больше про Template вы можете здесь.
Model View Controller (Модель-Представление-Контроллер)
Преимущество Spring MVC в том, что ваши контроллеры являются POJO, а не сервлетами. Это облегчает тестирование контроллеров. Стоит отметить, что от контроллеров требуется только вернуть логическое имя представления, а выбор представления остаётся за ViewResolver . Это облегчает повторное использование контроллеров при различных вариантах представления.
Почитать больше про Model View Controller вы можете здесь.
Front Controller (Контроллер запросов)
Spring предоставляет DispatcherServlet, чтобы гарантировать, что входящий запрос будет отправлен вашим контроллерам.
Паттерн Front Controller используется для обеспечения централизованного механизма обработки запросов, так что все запросы обрабатываются одним обработчиком. Этот обработчик может выполнить аутентификацию, авторизацию, регистрацию или отслеживание запроса, а затем передать запрос соответствующему контроллеру.
Почитать больше про Front Controller вы можете здесь.
View Helper (Вспомогательный компонент представления)
В Spring есть несколько пользовательских JSP-тегов и макросов Velocity, помогающие отделить код от представления.
View Helper отделяет статическое содержимое в представлении, такое как JSP, от обработки бизнес-логики.
Фреймворки, такие как Spring и Struts, предоставляют собственные библиотеки тегов для инкапсуляции логики обработки в хелперах вместо размещения логики в представлении, таком как JSP-файлы.
Почитать больше про View Helper вы можете здесь.
Dependency injection и inversion of control (IOC) (Внедрение зависимостей и инверсия управления)
IoC-контейнер в Spring, отвечает за создание объекта, связывание объектов вместе, конфигурирование объектов и обработку всего их жизненного цикла от создания до полного уничтожения.
В контейнере Spring используется инъекция зависимостей (Dependency Injection, DI) для управления компонентами приложения. Эти компоненты называются «Spring-бины» (Spring Beans).
Почитать больше про Dependency Injection вы можете здесь.
Service Locator (Локатор служб)
ServiceLocatorFactoryBean сохраняет информацию обо всех бинах в контексте. Когда клиентский код запрашивает сервис (бин) по имени, он просто находит этот компонент в контексте и возвращает его. Клиентскому коду не нужно писать код, связанный со Spring, чтобы найти бин.
Паттерн Service Locator используется, когда мы хотим найти различные сервисы, используя JNDI. Учитывая высокую стоимость поиска сервисов в JNDI, Service Locator использует кеширование. При запросе сервиса первый раз Service Locator ищет его в JNDI и кэширует объект. Дальнейший поиск этого же сервиса через Service Locator выполняется в кэше, что значительно улучшает производительность приложения.
Почитать больше про Service Locator вы можете здесь.
Observer-Observable (Наблюдатель)
Используется в механизме событий ApplicationContext .
Определяет зависимость «один-ко-многим» между объектами, чтобы при изменении состояния одного объекта все его подписчики уведомлялись и обновлялись автоматически.
Почитать больше про Observer вы можете здесь.
Context Object (Контекстный объект)
Паттерн Context Object, инкапсулирует системные данные в объекте-контексте для совместного использования другими частями приложения без привязки приложения к конкретному протоколу.
ApplicationContext является центральным интерфейсом в приложении Spring для предоставления информации о конфигурации приложения.
Почитать больше про Context Object вы можете здесь.
Ссылки
Вот такой вышел материал. Ждем ваши комментарии и приглашаем на бесплатный вебинар, в рамках которого разработаем полноценное классическое Web-приложение с UI, аутентификацией и авторизацией. Также изучим особенности Web-приложений и попробуем решить некоторые задачи Enterprise который. Вебинар пройдет уже сегодня.
- spring framework
- паттерны проектирования
- Блог компании OTUS
- Программирование
- Java
Книга «Spring. Все паттерны проектирования»
Привет, Хаброжители! Мы издали книгу в которой дается обзор фреймворка Spring 5 и паттернов проектирования для него. Объясняется принцип внедрения зависимостей (dependency injection), играющий ключевую роль при создании слабосвязанного кода во фреймворке Spring. Затем рассматриваются классические паттерны «Банды четырех» при проектировании приложений на Spring. В следующих частях книги автор рассматривает паттерны аспектно-ориентированного программирования (AOP), шаблоны JDBC, позволяющие абстрагировать доступ к базе данных. В заключительных главах книги автор исследует работу с MVC, реактивные шаблоны проектирования и паттерны проектирования, применяемые при конкурентном и параллельном программировании в Spring.
Предлагаем ознакомиться с отрывком «Паттерн «Объект доступа к данным»»
«Объект доступа к данным» (Data Access Object, DAO) — чрезвычайно популярный паттерн проектирования для уровня сохранения в приложениях J2EE. Он отделяет уровень бизнес-логики от уровня сохранения. Паттерн DAO основан на объектно-ориентированных принципах инкапсуляции и абстракции. Контекст использования паттерна DAO — доступ к данным и их сохранение в зависимости от конкретной реализации и типа хранилища, например объектно-ориентированной базы данных, неструктурированных файлов, реляционных баз данных и т. д. На основе паттерна DAO можно создать интерфейс DAO и реализовать его, чтобы абстрагировать и инкапсулировать все обращения к источнику данных. Подобная реализация DAO управляет такими ресурсами базы данных, как соединения с источником данных.
Интерфейсы DAO очень легко адаптируются ко всем нижележащим механизмам источников данных, их не нужно заменять при изменениях в технологиях сохранения на более низких уровнях. Этот паттерн позволяет внедрять различные технологии доступа к данным, никак не затрагивая бизнес-логику корпоративного приложения. Рассмотрим рис. 8.1, чтобы лучше понять принципы паттерна DAO.
Как можно видеть на схеме, в паттерне участвуют следующие объекты.
BusinessObject — объект, работающий на бизнес-уровне, — клиент для уровня доступа к данным. Ему нужны данные, чтобы моделировать бизнес-процессы, а также подготавливать Java-объекты для вспомогательных функций или контроллеров приложения.
DataAccessObject — основной объект паттерна DAO. Скрывает от BusinessObject всю низкоуровневую реализацию работы нижележащей базы данных.
DataSource — тоже объект, содержащий всю низкоуровневую информацию о том, что именно представляет собой нижележащая база данных: RDBMS, неструктурированные файлы или XML.
TransferObject — объект, используемый как носитель информации. Применяется объектом DataAccessObject для возврата данных объекту BusinessObject.
Рассмотрим следующий пример паттерна DAO, в котором AccountDao представляет собой интерфейс объекта DataAccessObject, а AccountDaoImpl — класс, реализующий интерфейс AccountDao:
public interface AccountDao < Integer totalAccountsByBranch(String branchName); >public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao < @Override public Integer totalAccountsByBranch(String branchName) < String sql = "SELECT count(*) FROM Account WHERE branchName = "+branchName; return this.getJdbcTemplate().queryForObject(sql, Integer.class); >>
Создание объектов DAO в Spring с помощью паттерна проектирования «Фабрика»
Как вы знаете, во фреймворке Spring задействуется множество паттернов проектирования. Паттерн «Фабрика» представляет собой порождающий паттерн проектирования и используется для создания объекта без раскрытия клиенту нижележащей логики, а также назначения вызывающей стороне нового объекта с помощью общего интерфейса или абстрактного класса. Благодаря паттернам проектирования «Фабричный метод» и «Абстрактная фабрика» можно достичь очень высокой гибкости паттерна DAO.
Выясним, где в нашем примере мы реализуем стратегию, в которой фабрика производит объекты DAO для реализации общей базы данных (рис. 8.2).
Вы можете увидеть на предыдущей схеме, что AccountDaoFactory производит объект AccountDao, то есть является для него фабрикой. Нижележащую базу данных можно заменить в любой момент, при этом бизнес-код менять не нужно — фабрика берет эту работу на себя. Spring поддерживает хранение всех DAO в фабрике компонентов, а также в фабрике DAO.
Паттерн «Отображение данных»
Фреймворк ORM обеспечивает отображение между объектами и реляционными базами данных, ведь объекты и таблицы реляционных баз данных по-разному хранят данные приложения. Кроме того, в объектах и таблицах есть различные механизмы структурирования данных. При использовании в приложении Spring любого ORM-решения, например Hibernate, JPA или JDO, нет нужды волноваться о механизме отображения между объектами и реляционными базами данных.
Рассмотрим рис. 8.3, чтобы лучше разобраться с паттерном «Отображение данных» (Data Mapper).
На схеме происходит отображение объекта Account в реляционную базу данных посредством интерфейса AccountMapper. AccountMapper играет в приложении роль посредника между Java-объектом и нижележащей базой данных. Рассмотрим еще один паттерн, используемый на уровне доступа к данным.
Паттерн «Модель предметной области»
Модель предметной области — объект, у которого есть и данные, и поведение, где поведение определяет бизнес-логику корпоративного приложения, а данные представляют собой информацию о результатах бизнеса. Модель предметной области объединяет данные и технологический процесс. В корпоративном приложении модель данных располагается ниже бизнес-уровня и определяет бизнес-логику, возвращая результаты бизнес-поведения. Рассмотрим следующую схему для большей ясности (рис. 8.4).
Как можно видеть на схеме, в приложении заданы две модели предметной области в соответствии с бизнес-требованиями. Бизнес-алгоритм перевода денег с одного счета на другой описан в классе TransferService. Классы TransferService и AccountService относятся к паттерну «Модель предметной области» в корпоративном приложении.
Прокси для паттерна «Отложенная загрузка»
«Отложенная загрузка» — паттерн проектирования, используемый некоторыми из ORM-решений, например Hibernate, в корпоративных приложениях, чтобы отложить инициализацию объекта до момента обращения к нему другого объекта, то есть момента, когда он понадобится. Цель этого паттерна проектирования состоит в оптимизации памяти в приложении. Паттерн проектирования «Отложенная загрузка» в Hibernate реализуется с помощью виртуального объекта-прокси. При демонстрации отложенной загрузки мы используем прокси, но он не относится к паттерну «Заместитель».
Паттерн «Шаблонный метод» для поддержки Hibernate в Spring
Фреймворк Spring предоставляет вспомогательный класс для доступа к данным на уровне DAO, основанный на паттерне проектирования «Шаблонный метод» GoF. Класс HibernateTemplate фреймворка Spring поддерживает такие операции баз данных, как save, create, delete и update. Этот класс гарантирует, что для каждой транзакции используется только один сеанс Hibernate.
Интеграция Hibernate со Spring
Hibernate — ORM-фреймворк сохранения с открытым исходным кодом, который не только обеспечивает отображение простых объектных взаимосвязей между Java-объектами и таблицами базы данных, но и предлагает множество продвинутых возможностей для повышения производительности приложения, а также помогает улучшить использование ресурсов, например с помощью кэширования, отложенной загрузки, немедленного извлечения данных и распределенного кэширования.
Spring обеспечивает полную поддержку интеграции с фреймворком Hibernate, у него имеется несколько встроенных библиотек, позволяющих задействовать Hibernate на все 100 %. Для задания настроек Hibernate в приложении можно воспользоваться паттерном внедрения зависимостей и контейнером IoC фреймворка Spring.
В следующем разделе мы выясним, как правильно настроить Hibernate в контейнере IoC фреймворка Spring.
Задание настроек объекта SessionFactory фреймворка Hibernate в контейнере Spring
Оптимальный подход к настройке Hibernate и других технологий сохранения в любом корпоративном приложении состоит в разделении бизнес-объектов с жестко «зашитыми» справочниками ресурсов, такими как DataSource в JDBC или SessionFactory в Hibernate. Эти ресурсы можно описать в виде компонентов в контейнере Spring. Но для доступа к ним бизнес-объектам необходимы ссылки на них. Рассмотрим следующий класс DAO, использующий объект SessionFactory для получения данных для приложения:
public class AccountDaoImpl implements AccountDao < private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) < this.sessionFactory = sessionFactory; >// . >
Как можно видеть, класс DAO, AccountDaoImpl, следует паттерну внедрения зависимостей. Для доступа к данным в него внедряется объект SessionFactory фреймворка Hibernate, и он прекрасно чувствует себя в контейнере IoC Spring. Объект SessionFactory фреймворка Hibernate представляет собой объект-одиночку, он генерирует основной объект интерфейса Hibernate org.hibernate.Session. Объект SessionFactory управляет объектом Session, а также отвечает за его открытие и закрытие. Интерфейс Session содержит реальную функциональность доступа к данным — сохранения (save), обновления (update), удаления (delete) и загрузки (load) объектов из базы данных. В приложении объект класса AccountDaoImpl или любой другой репозиторий выполняет с помощью этого объекта Session все необходимые операции хранения данных.
Фреймворк Spring предоставляет встроенные модули Hibernate, так что вы можете использовать в своих приложениях компоненты SessionFactory Hibernate.
Компонент org.springframework.orm.hibernate5.LocalSessionFactoryBean представляет собой реализацию интерфейса FactoryBean фреймворка Spring. LocalSessionFactoryBean основан на паттерне «Абстрактная фабрика», он генерирует в приложении объект SessionFactory. Этот объект можно сконфигурировать в виде компонента в контексте Spring приложения следующим образом:
@Bean public LocalSessionFactoryBean sessionFactory(DataSource dataSource) < LocalSessionFactoryBean sfb = new LocalSessionFactoryBean(); sfb.setDataSource(dataSource); sfb.setPackagesToScan(new String[] < "com.packt.patterninspring.chapter8.bankapp.model" >); Properties props = new Properties(); props.setProperty("dialect", "org.hibernate.dialect.H2Dialect"); sfb.setHibernateProperties(props); return sfb; >
В этом коде мы сконфигурировали объект SessionFactory в виде компонента с помощью класса LocalSessionFactoryBean фреймворка Spring. Метод этого компонента принимает на входе объект типа DataSource в качестве аргумента, который определяет место и способ соединения с базой данных. Мы также указали, какой пакет просматривать, задав значение «com.packt.patterninspring.chapter8.bankapp.model» для свойства setPackagesToScan компонента LocalSessionFactoryBean, и задали свойство dialect компонента SessionFactory с помощью метода setHibernateProperties для указания того, с каким типом базы данных мы имеем дело в приложении.
Теперь, после настройки компонента SessionFactory Hibernate, в контексте приложения Spring посмотрим, как можно реализовать объекты доступа к данным для уровня сохранения нашего приложения.
Об авторе
Динеш Раджпут — главный редактор сайта Dineshonjava, технического блога, посвященного технологиям Java и Spring. На сайте размещены статьи на тему Java-технологий. Динеш — блогер, автор книг, c 2008 года энтузиаст Spring, сертифицированный специалист компании Pivotal (Pivotal Certified Spring Professional). Обладает более чем десятилетним опытом проектирования и разработки с использованием Java и Spring. Специализируется на работе с последней версией Spring Framework, Spring Boot, Spring Security, на создании REST API, архитектуре микросервисов, реактивном программировании, аспектно-ориентированном программировании с применением Spring, паттернах проектирования, Struts, Hibernate, веб-сервисах, Spring Batch, Cassandra, MongoDB, архитектуре веб-приложений.
В настоящее время Динеш работает менеджером по технологиям в одной из компаний, лидирующих в области создания программного обеспечения (ПО). Был разработчиком и руководителем команды в Bennett, Coleman & Co. Ltd, а до этого — ведущим разработчиком в Paytm. Динеш с восторгом относится к новейшим технологиям Java и любит писать о них в технических блогах. Является активным участником Java- и Spring-сообществ на различных форумах. Динеш — один из лучших специалистов по Java и Spring.
О рецензенте
Раджив Кумар Мохан обладает большим опытом разработки ПО и корпоративного обучения. На протяжении 18 лет он работал в таких крупнейших IT-компаниях, как IBM, Pentasoft, Sapient и Deft Infosystems. Начал карьеру как программист, руководил многими проектами.
Является экспертом в предметной области Java, J2EE и родственных фреймворках, Android, UI-технологиях. Сертифицирован компанией Sun в качестве Java-программиста (SCJP, Sun Certified Java Programmer) и веб-разработчика на Java (Sun Certified Web Component Developer, SCWCD). Раджив имеет четыре высших образования: в области информатики (Computer Science), прикладной информатики (Computer Applications), органической химии и делового администрирования (MBA). Является консультантом по подбору персонала и экспертом по обучению в HCL, Amdocs, Steria, TCS, Wipro, Oracle University, IBM, CSC, Genpact, Sapient Infosys и Capgemini.
Раджив — основатель фирмы SNS Infotech, расположенной в городе Большая Нойда. Кроме того, он работал в Национальном институте технологий моды (National Institute Of Fashion Technology, NIFT).
Для Хаброжителей скидка 20% по купону — Spring
Spring. Все паттерны проектирования
Цель книги провести обзор фреймворка Spring 5 и всех паттернов проектирования, используемых фреймворком Spring, а также их реализации в Spring. Автор представляет практические примеры, которые желательно применять при проектировании и разработке приложений. Объясняя принцип внедрения зависимостей (dependency injection), играющий ключевую роль при создании слабосвязанного кода во фреймворке Spring. Далее рассматриваются классические паттерны «Банды четырех» используемые при проектировании приложений на Spring. Паттерны аспектно-ориентированного программирования (AOP). А также шаблоны JDBC, позволяющие абстрагировать доступ к базе данных.
В заключительных главах книги автор исследует работу с MVC, реактивные шаблоны проектирования и паттерны проектирования, применяемые при конкурентном и параллельном программировании в Spring. Книга предназначена для всех Java-разработчиков, изучающих Spring. Что позволит улучшить понимание паттернов проектирования, используемых в этом фреймворке. Предполагается, что читатель обладает базовыми знаниями Core Java, JSP, Servlet и XML.
Оглавление книги
Содержание
Глава 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
Порождающие паттерны проектирования 48
Паттерн проектирования «Фабрика» 49
Паттерн проектирования «Абстрактная фабрика» 52
Паттерн проектирования «Одиночка» 58
Паттерн проектирования «Прототип» 60
Паттерн проектирования «Строитель» 63
Резюме 66
Глава 3. Соображения по поводу структурных и поведенческих паттернов 68
Базовые паттерны проектирования 68
Структурные паттерны проектирования 69
Поведенческие паттерны проектирования 94
Паттерны проектирования J2EE 103
Резюме 104
Alt-txt
Глава 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
Рекомендуемые практики 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. Реализация паттерна 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
Разработка веб — приложения с использованием Spring Framework и jQuery Текст научной статьи по специальности «Компьютерные и информационные науки»
WEB APPLICATION / AUDIO CONTENT / METHODOLOGY OF OBJECT-ORIENTED ANALYSIS AND DESIGN / UML CHART / JAVA PROGRAMMING LANGUAGE / ВЕБ-ПРИЛОЖЕНИЕ / АУДИО КОНТЕНТ / МЕТОДОЛОГИЯ ОБЪЕКТНООРИЕНТИРОВАННОГО АНАЛИЗА И ПРОЕКТИРОВАНИЯ / UML ДИАГРАММА / ЯЗЫК ПРОГРАММИРОВАНИЯ JAVA
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Глод О.Д., Чекулаев А.А.
В работе рассмотрен процесс разработки веб-приложения , содержащего аудиоконтент. При проектировании системы использовалась методология ООАП (Объектно-ориентированный анализ и проектирование) и MVC (Model View Controller) паттерн проектирования. С помощью umbrello построены канонические UML (Unified Modeling Language) диаграммы, описывающие различные аспекты моделируемой системы. На основании созданных диаграмм была выполнена реализация приложения средствами языка программирования java. Также выполнен интерфейс пользователя, позволяющий продемонстрировать возможности приложения.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Глод О.Д., Чекулаев А.А.
Проектирование мобильного приложения для поиска междугородних рейсов автобусного транспорта с помощью API Яндекс. Расписания
Критерии профессиональности программистов при разработке экспертной системы управления программными проектами
Веб — сервис для интеграции в урбанистическую среду
Выбор оптимального способа реализации инструментального средства управления обучением с помощью метода анализа иерархий
Реализация портала для управления «Юго-Западным благочинием» г. Ростова-на-Дону
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Developing a web application using Spring Framework and jQuery
The paper describes the process of developing a web application that contains audio content. When designing the system, the methodology of OOAP (Object-Oriented Analysis and Design) and the MVC (Model View Controller) design pattern were used. With umbrello, canonical UML diagrams are constructed, describing various aspects of the system being modeled. Based on the diagrams created, the application was implemented using the java programming language . Also, the user interface is made, allowing to demonstrate the capabilities of the application. The developed application should be a multi-page client-server application with the ability to listen to music and create playlists based on their preferences.
Текст научной работы на тему «Разработка веб — приложения с использованием Spring Framework и jQuery»
Разработка веб — приложения с использованием Spring Framework и
О. Д. Глод, А. А. Чекулаев Южный федеральный университет, Ростов-на-Дону
Аннотация: В работе рассмотрен процесс разработки веб-приложения, содержащего аудиоконтент. При проектировании системы использовалась методология ООАП (Объектно-ориентированный анализ и проектирование) и MVC (Model View Controller) паттерн проектирования. С помощью umbrello построены канонические UML (Unified Modeling Language) диаграммы, описывающие различные аспекты моделируемой системы. На основании созданных диаграмм была выполнена реализация приложения средствами языка программирования java. Также выполнен интерфейс пользователя, позволяющий продемонстрировать возможности приложения.
Ключевые слова: веб-приложение; аудио контент; методология объектно-ориентированного анализа и проектирования; UML — диаграмма; язык программирования java.
Актуальность данной задачи обусловлена программными средствами, которые используются для её реализации. Язык программирования Java был создан в 1995 году, но обновляется и в настоящее время, что позволяет ему сохранить актуальность для решения текущих задач. Последняя версия Java -9 [1]. Аналогична ситуация и с Spring. Spring — сравнительно новая технология, первая стабильная версия была выпущена в 2004 году, но он постоянно дорабатывается, не теряя актуальности.
Новизна текущего веб-приложения заключается в предоставлении пользователю возможности собственноручно добавлять свой, интересующий его контент, расширяя базу аудиоконтента. Также важной особенностью приложения является язык программирования, на котором он написан. Большинство веб-ресурсов создаются с помощью языка программирования PHP [2]. Он прост в освоении и позволяет писать код прямо в html-странице, что импонирует многим разработчикам. Но такой подход многократно осложняет поддержку и модернизацию программного продукта. Чтобы избежать этих недостатков, для создания настоящего клиент-серверного веб-
приложения используется язык программирования Java с использованием MVC (Model-View-Controller) паттерна [3]. Он позволяет разбить код на слои, такие как контроллер, сервис и слой доступа к данным. За счет этого многократно повышатся читаемость кода. Также, с Java используется шаблон Spring Framework, имеющий модуль Spring MVC, который упрощает создание MVC структуры, а также модуль Spring Security, предоставляющий API (Application Programming Interface) для обеспечения безопасности приложения [4, 5, 6].
Для обеспечения взаимодействия пользователя с html-страницей используется JavaScript с jQuery фреймворком [7]. Этот фреймворк обеспечивает полное взаимодействие со структурой DOM (Document Object Model), позволяя взаимодействовать со структурой html-документа.
Особенностью предметной области является то, что браузеры могут проигрывать не любой аудиофайл, а только тот, на который у них есть лицензия. Например, браузер Mozilla Firefox проигрывает файлы формата *.ogg и не проигрывает формат *.mp3 [8]. Противоположная ситуация у браузера Google Chrome. Для проигрывания аудиофайлов для всех браузеров необходимо либо сохранять один аудиофайл во всех возможных типах, либо использовать свой проигрыватель для аудиофайлов и добавлять только в одном типе, например, *.mp3.
Помимо аудиофайла, в аудиоконтенте хранится метаинформация, такая как: название файла, информацию об авторе, дата добавления.
В данной задаче рассматривается определённое число объектов:
Пользователи — информация о пользователях;
Роли — уровни доступа пользователя;
Ресурсы — музыкальный контент или контент любого другого образца;
Плейлисты — сборник ресурсов пользователя.
Каждый из данных объектов имеет проекцию в базе данных и создается пользовательский интерфейс, который позволит организовать CRUD (create, read, update, delete) операции с описанными выше сущностями.
Декомпозиция задачи. Все вышеизложенные задачи разрабатываются по следующему примерному плану:
1) Разработка сущностей;
2) Определение и создание основных классов;
3) Разработка алгоритмов обработки информации;
4) Разработка бизнес-логики;
5) Обеспечение взаимодействия между сервером и клиентом;
6) Разработка HTML шаблона;
7) Создание графического интерфейса:
a) Создание главной страницы веб-приложения, включающей в себя аудиоконтент и информацию о нём;
b) Создание страницы веб-приложения, включающей в себя плейлисты и информацию о них;
c) Создание страницы веб-приложения, включающей в себя аудиоконтент, использующийся в выбранном плейлисте;
d) Создание страницы веб-приложения, включающей в себя информацию о пользователях веб-приложения.
8) Создание возможности пользователю взаимодействовать с веб-приложением:
9) Запуск бета-версии;
Создание возможности регистрации пользователя; Создание возможности авторизации пользователя; Создание возможности создать плейлист; Создание возможности добавить аудиоконтент в
10) Добавление возможности поиска в базе данных:
a) Добавление возможности поиска аудиоконтента;
b) Добавление возможности поиска плейлиста.
11) Запуск конечной версии продукта.
Приложение имеет следующие функциональные возможности:
1. Предоставление аудиоконтента;
2. Регистрация и авторизация пользователя;
3. Добавление нового контента пользователем;
4. Добавления плейлиста пользователем.
Проанализировав возможности программных продуктов Java+Spring, PHP, Python [9] , JavaScript, TypeScript, CoffeeScript [10, 11] и приняв во внимание данные, приведенные в [12, 13, 14], выбраны следующие инструментальные средства для разработки программного продукта: серверная часть выполняется с помощью языка программирования Java 8 и Spring Framework; клиентская часть выполняется с помощью JavaScript и jQuery; в качестве реляционной СУБД выберем H2 [15]. H2 — открытый исходный код базы данных облегченного Java. Он может быть встроен в Java-приложение или работать в режиме клиент-сервер. В качестве сервлет-контейнера используется Apache Tomcat [16, 17].
На рис.1 приведена созданная диаграмма использования. Детализация вариантов использования представлена в табл.1.
Рис. 1. — Диаграмма вариантов использования
Далее построена диаграмма классов (Static Structure diagram) -диаграмма, которая демонстрирует классы системы, их атрибуты, методы и взаимосвязи между ними. Для обеспечения взаимодействия программы с базой данных использовалось объектно-реляционное отображение.
ORM (Object Role Model) — это технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных» [2, 3].
Детализация вариантов использования
Вариант использования Описание
Просмотр контента Вывод музыки или видео на экран
Работа с контентом Просмотр контента и добавление нового контента (добавление соответствующей строки в базу данных, загрузка на сервер контента)
Администрирование Предоставляется полный доступ к контенту, СЯиО операции с ним и с пользователями
Эта задача легко выполняется с помощью такого инструмента, как Hibernate. Для того, чтобы его использовать, в систему автоматической сборки проекта (Gradle) устанавливается драйвер, позволяющий взаимодействовать выбранной базой данных. После необходимо создать конфигурационный файл и указать в нем параметры подключения к базе данных. Hibernate осуществляет маппинг Java-классов с таблицами базы данных с помощью Java-аннотаций:
• @Table(name=»name») — указывает имя таблицы в базе данных;
• @Id — указывается id поле;
• @GeneratedValue(strategy = GenerationType.AUTO) — указывает, что поле id будет автоматически заполнено;
• @Column(name=»name») — указывает, какое имя столбца в базе данных. Также существуют аннотации @OneToMany, @ManyToOne,
@ManyToMany, @OneToOne, которые указывают на связь один-ко-многим, многие-ко-многим в базе данных.
В результате работы Hibernate, создается схема баз данных, которая показана на рис. 2:
Рис. 2. — Схема базы данных На рис. 3 показан приветственный шаблон, появляющийся, когда пользователь заходит на сайт.
Best music e-ver
О НАШЕМ САЙТЕ АВТОР НАС МОЖНО НАЙТИ
Равным образом консультация с широким Разработчиком сайта является
активом в значительной степени чекулаев антон f (Сг|
обуславливает создание форм развития.
Разнообразный и богатый опыт постоянное
информа ционно-п ропагандис тс кое
обеспечение нашей деятельности требуют
определения и уточнения модели развития.
Рис. 3 — Интерфейс главной страницы
Возможно дальнейшее усовершенствования продукта, для этого необходимо расширить возможности добавления, помимо аудиофайлов, другого контента, например видеоконтента или изображения.
1. Нововведения в Java 9: разбираем на примерах // Tproger URL: tproger.ru/translations/java-9-features-examples/.
2. Мамаев Э.А., Порицкий И.А. Принципы и положения единого информационного пространства рынка транспортных услуг // Инженерный вестник Дона, 2013, №1. URL: ivdon.ru/ru/magazine/archive/n1y2013/1497.
3. Досмухамедов Б.Р., Белов С.В. Особенности использования мандатной политики управления доступом в системах микрофинансирования населения // Инженерный вестник Дона, 2013, № 4. URL: ivdon.ru/ru/magazine/archive/n4y2013/2199.
4. Spring MVC — основные понятия, архитектура // Javastudy URL: javastudy.ru/spring-mvc/spring-mvc-basic/.
5. Spring Framework Documentation URL: docs.spring.io/spring/docs/current/spring-framework-reference/.
6. Янишевская А.Г., Чурсин М.А. Использование сторонних интерфейсов программирования приложений на примере интерфейсов прикладного программирования социальных сетей Facebook и Twitter // Инженерный вестник Дона, 2015, № 2 (часть 2) URL: ivdon.ru/ru/magazine/archive/n2p2y2015/2978.
7. Введение в jQuery // JQuery.Page2Page URL: jquery.page2page.ru/index.php5/Введение_в _jQuery.
8. Video and audio content // MDN web docs URL: developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Video_and_audio_.
9. Красильников А.Я., Кравченко К.Ю. Устойчивость линейных дифференциальных уравнений с постоянным запаздыванием, описывающих
процесс фрезерования // Инженерный вестник Дона, 2014, №1. URL: ivdon.ru/ru/magazine/archive/n1y2014/2250.
10. Введение в TypeScript // METANIT.COM URL: metanit.com/web/typescript/1.1.php.
11. CoffeeScript URL: https://coffeescript.org/.
12. Производительность C++ vs. Java vs. PHP vs. Python // habr URL: habr.com/post/66562/.
13. Жданова И.В., Быков Д.В. Варианты построения системы защиты электронных документов от копирования // Инженерный вестник Дона, 2012, № 2. URL: ivdon.ru/ru/magazine/archive/n2y2012/825.
14. Мохов В.А., Сильнягин Н.Н. Интегрированный алгоритм когнитивной оценки и выбора оптимального варианта онтологической модели // Инженерный вестник Дона, 2011, № 4. URL: ivdon.ru/ru/magazine/archive/n4y2011/600.
15. H2 Database Engine // Национальная библиотека им. Н. Э. Баумана Bauman National Library URL: ru.bmstu.wiki/H2_Database_Engine.
16. Apache Tomcat // Национальная библиотека им. Н. Э. Баумана Bauman National Library URL: ru.bmstu.wiki/Apache_Tomcat.
1. Tproger URL: tproger.ru/translations/java-9-features-examples/.
2. Mamaev EH.A., Porickij I.A. Inzenernyj vestnik Dona (Rus), 2013, №1. URL: ivdon.ru/ru/magazine/archive/n1y2013/1497.
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
3. Dosmuhamedov B.R., Belov S.V. Inzenernyj vestnik Dona (Rus), 2013, № 4. URL: ivdon.ru/ru/magazine/archive/n4y2013/2199.
4. Javastudy URL: javastudy.ru/spring-mvc/spring-mvc-basic/.
5. Spring Framework Documentation URL: docs.spring.io/spring/docs/current/spring-framework-reference/.
6. YAnishevskaya A.G., CHursin M.A. Inzenernyj vestnik Dona (Rus), 2015, № 2 (chast’ 2). URL: ivdon.ru/ru/magazine/archive/n2p2y2015/2978.
7. JQuery .Page2Page URL: jquery.page2page.ru/index.php5/Vvedenie_v_jQuery.
8. MDN web docs URL: developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Video_and_audio_.
9. Krasil’nikov A.YA, Kravchenko K.YU. Inzenernyj vestnik Dona (Rus), 2014, №1. URL: ivdon.ru/ru/magazine/archive/n1y2014/2250.
10. METANIT.COM URL: metanit.com/web/typescript/1.1.php.
11. CoffeeScript URL: https://coffeescript.org/.
12. habr URL: habr.com/post/66562/.
13. ZHdanova I.V., Bykov D.V. Inzenernyj vestnik Dona (Rus), 2012, № 2 URL: ivdon.ru/ru/magazine/archive/n2y2012/825.
14. Mohov V.A., Sil’nyagin N.N. Inzenernyj vestnik Dona (Rus), 2011, № 4 URL: ivdon.ru/ru/magazine/archive/n4y2011/600.
15. Nacional’naya biblioteka im. N. EH. Baumana Bauman National Library URL: ru.bmstu.wiki/H2_Database_Engine.
16. Nacional’naya biblioteka im. N. EH. Baumana Bauman National Library URL: ru.bmstu.wiki/Apache_Tomcat.
17. Tymchuk D.A., Svechkarev V.P. Inzenernyj vestnik Dona (Rus), 2013, № 4. URL: ivdon.ru/ru/magazine/archive/n4y2013/1982.