Статьи

Передовые практики Enterprise Spring, часть 2. Архитектура приложений

В этом посте представлены общие компоненты приложения и архитектура среды Spring.

Домены приложений



Наши компоненты приложения делятся на две основные категории: система и проблемные домены.

  • System Domain — инфраструктурные компоненты, сантехника, это сладкое место весны!
  • Проблемная область — бизнес-компоненты, как правило, управляемые прецедентами, это то, за что платит большинство разработчиков

Уровни приложений



Компоненты приложения (компоненты) должны быть разделены на отдельные слои и категории.




Бобовые слои
  1. Контроллеры (для MVC, системный домен)
  2. Услуги (проблемный домен)
  3. Репозиторий (Системный домен)

Другие бобовые категории
  • Объекты передачи данных (проблемный домен)
  • Системные функции (системный домен)

Контроллер Бобов



Подробнее о контроллерах в следующем блоге в блоге MVC Enterprise Spring Best Practices — TBD

Служебные бобы



Служебные компоненты являются компонентами проблемного домена. Это наиболее значимые в приложении. Служебные компоненты являются фундаментальным компонентом SOA.

  • Это POJO
  • Всегда определяется из интерфейсов
  • НИКОГДА не включайте компоненты инфраструктуры
  • НЕТ импорта Spring или служебных библиотек
  • НЕТ инфраструктурных аннотаций
  • Всегда объявляйте границы транзакций публичными функциями
  • Создать реализацию / конкретные классы в подпакете с именем internal

Spring-аннотации могут быть очень полезны для сервисов, полезными аннотациями являются @Service и @Transactional. Чтобы отделить инфраструктуру от бизнес-сервисов, создайте мета-аннотацию для конкретного проекта.


Пользовательские мета-аннотации
package com.gordondickens.service.annotation;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Service
@Transactional
public @interface AppService {
    String value() default "";
}

Использование метааннотаций
...
@AppService
public class MyClass() {
  ...
}

Хранилище бобов



Бины репозитория находятся в системном домене. Подробнее об этом в блоге ORM Enterprise Spring Best Practices — TBD

  • НЕ содержат бизнес-логику
  • Используйте аннотации Spring и JPA
  • Следует считать одноразовым

Бины передачи данных



Объекты передачи данных (DTO) являются фундаментальными объектами в нашей системе и за ее пределами. DTO — это простые публичные POJO, которые получают и отправляют данные в виде логического набора.

  • Всегда Общественные Бобы
  • Аннотировать с помощью JAXB2 Аннотации

Конверсионные Бобы



Spring предоставляет богатый реестр конверсий по своей сути. Служба преобразования в Spring основана на оригинальной спецификации компонента EJB.

PropertyEditors сосредоточены на данных String в и из нашего приложения.

Класс Spring org.springframework.beans.PropertyEditorRegistrySupport показывает встроенные классы объектов String <->. Которые мы используем, обычно без ведома, в наших приложениях. Когда мы конфигурируем наши приложения с XML и отправляем значения свойств, Spring использует отражение для определения типа аргумента. Если этот тип не является String, Spring ищет PropertyEditor, который может преобразовать String в целевой тип. Мы также можем создавать собственные PropertyEditor и регистрировать их для таких типов, как номер социального страхования США или номер телефона. См. «Весна в действии» Крейга Уолла, 3-е издание, примеры

  • Примитивные типы обёрток: Long, Integer и т. Д.
  • Типы коллекций: Список, Свойство, Набор, Карта и т. Д.
  • Массивы
  • Типы утилит: URL, TimeZone, Locale и т. Д.

Spring 3.0 introduced the Conversion service providing us the ability to register a conversion service for object <–> other conversion. To use the conversion registry, we can register a conversion class that will automatically convert to/from MyObject <–> MyOtherObject. See Using Spring Customer Type Converter Blog.

Further Reading