Сервисный уровень проекта с высокой степенью параллелизма, объединяющего платформу IDEA+Maven+SSM.

Spring MyBatis IntelliJ IDEA maven
Сервисный уровень проекта с высокой степенью параллелизма, объединяющего платформу IDEA+Maven+SSM.

Исходный код проекта:GitHub.com/milk curdling/ng use…


сначала напишиServiceПрежде чем кодировать слой, мы должны сначала узнать, что этот слой делает.

ServiceУровень в основном отвечает за разработку логического приложения бизнес-модуля. То же самое — сначала спроектировать интерфейс, затем спроектировать класс, который его реализует, а затемSpringНастройте его ассоциации реализации в файле конфигурации. Так что мы можем позвонить в приложенииServiceинтерфейс для бизнес-процессов.ServiceБизнес-реализация уровня, который необходимо вызвать в определенномdaoИнтерфейс уровня, инкапсуляцияServiceБизнес-логика уровня способствует независимости и повторному использованию общей бизнес-логики, а программа очень лаконична.

Если вы хотите уменьшить связанность в проекте, хорошей концепцией является многослойность, то есть каждый слой выполняет свои обязанности, и старайтесь не делать ненужных вещей, поэтомуServiceКак следует из названия, слой представляет собой бизнес-логику, некоторую бизнес-логику в обработчике и вызовы.daoкод слоя, здесь нашdaoУровень — это уровень, который подключается к базе данных.Отношение вызова можно выразить следующим образом:

Вид (страница) > Контроллер (уровень управления) > Служба (бизнес-логика) > Дао (доступ к данным) > База данных (база данных)

Прежде всего, это дизайн интерфейса, а интерфейс продукта seckill разработан.com.nnngu.service.interfacesпостроить под пакетSeckillService.javaФайл интерфейса, как показано ниже:

SeckillService.javaПожалуйста, обратитесь к исходному коду проекта для ознакомления с содержимым файла.

После установки интерфейса мы должны написать класс реализации.При написании класса реализации мы обязательно столкнемся с такой проблемой.Если вы хотите вернуть данные json на фронтенд, какие данные вы возвращаете? Вернуть числовой код состояния или текст напрямую? Этот дизайн определенно не очень хорош, поэтому мы должны вернуть во внешний интерфейс информацию об объекте в формате json, содержащую ряд информации, независимо от того, в каком состоянии он находится, он должен быть в состоянии с этим справиться. ничего общего с полями базы данных, это не PO., поэтому мы создаем класс передачи данных DTO. Мое объяснение нескольких общих объектов выглядит следующим образом:

  • ПО: То есть мы пишем класс сущности для каждой таблицы базы данных
  • VO: инкапсулировать данные, требуемые страницей или уровнем представления, в класс сущностей.
  • БО: бизнес-объект
  • DTO: это немного сбивает с толку концепцию VO, а также эквивалентно тому, что данные, требуемые страницей, помещаются в один класс сущностей.
  • POJO: простой случайный объект Java

Создайте пакет dto под com.nnngu, а затем создайте класс Exposer, который является объектом результата, обрабатываемого базой данных во время всплеска.

Exposer.javaПожалуйста, обратитесь к исходному коду проекта для ознакомления с содержимым файла.

Определите исключения, которые могут возникнуть в пике

Определите базовое исключение, все дочерние исключения наследуют это исключениеSeckillException

package com.nnngu.exception;

/**
 *  秒杀基础的异常
 * Created by nnngu
 */
public class SeckillException extends RuntimeException {
    // 代码省略,请参照项目的源代码
    ... ...
}

Могут быть ситуации, когда seckill закрывается после закрытия seckill, поэтому создание исключения seckill closeSeckillCloseException, нужно наследовать базовое исключение, которое мы написали ранее

package com.nnngu.exception;

/**
 * 秒杀已经关闭异常,当秒杀结束就会出现这个异常
 * Created by nnngu
 */
public class SeckillCloseException extends SeckillException{
    // 代码省略,请参照项目的源代码
    ... ...
}

Определить повторяющиеся исключения всплесковRepeatKillException

package com.nnngu.exception;

/**
 * 重复秒杀异常,不需要我们手动去try catch
 * Created by nnngu
 */
public class RepeatKillException extends SeckillException{
    // 代码省略,请参照项目的源代码
    ... ...
}

Реализовать сервисный интерфейс

com.nnngu.serviceСоздать под пакетомSeckillServiceImpl.javaКласс, пожалуйста, обратитесь к исходному коду проекта для конкретного кода.

Здесь мы фиксируем исключения во время выполнения. Причина этого в том, что транзакция Spring будет откатываться, когда по умолчанию возникает RuntimeException. Обнаруженное исключение не приведет к откату транзакции. Цель этого состоит в том, что вы знаете, что будет Произошло исключение, поэтому вы должны его обработать. Если просто дать пройти компиляции, ловить исключение бессмысленно, поэтому обратите внимание на откат транзакции здесь.

Затем мы также обнаружили, что здесь присутствует хардкодное явление, то есть, возвращая различные символьные константы, такие как seckill success, seckill failure и т. д., эти строки можно использовать повторно, и их неудобно поддерживать, надо идти к классу везде Ищем такую ​​строку, мы используем класс перечисления для управления таким состоянием, создаем пакет enums под пакетом con.nnngu, специально размещаем класс перечисления, а затем создаем класс перечисления SeckillStatEnum.

перечисляемый классSeckillStatEnum.javaДля кода, пожалуйста, обратитесь к исходному коду проекта.

Внедрить сервис

существуетresources/springпостроить подapplicationContext-service.xmlфайл для настройкиServiceПол

applicationContext-service.xmlДля кода, пожалуйста, обратитесь к исходному коду проекта.

Здесь включены транзакции на основе аннотаций. Общие операции транзакций включают следующие методы:

  • В более ранних версиях Spring ProxyFactoryBean+XML использовался для настройки транзакций.
  • Преимущество использования пространства имен tx:advice+aop в конфигурационном файле Spring состоит в том, что конфигурация вступает в силу постоянно, и вам не нужно заботиться о проблемах в середине, но трудно выяснить, где проблема. когда есть ошибка.
  • Способ аннотировать @Transactionalаннотации можно использовать в определениях методов, интерфейсов и классов. Он может быть в общедоступных методах, но не может быть аннотирован в частных, конечных, статических и других методах, потому что управление транзакциями Spring по умолчанию использует динамический прокси-сервер cglib:
  • Частные методы не могут быть переопределены подклассами из-за ограничений доступа.
  • окончательные методы не могут быть переопределены подклассами
  • Методы уровня класса, когда статические не могут быть переопределены подклассами
  • защищенные методы могут быть переопределены подклассами и, таким образом, могут быть улучшены с помощью динамического байт-кода.

Методы, которые нельзя улучшить с помощью транзакций Spring AOP

серийный номер

Стратегия динамического прокси

Методы, которые не могут быть улучшены транзакциями

1

Динамический прокси на основе JDK

Все методы, кроме общедоступных, и общедоступные статические методы не могут быть улучшены.

2

Динамический прокси на основе cglib

частные, статические, окончательные методы

Тест сервисного уровня

добавить тестовый классSeckillServiceImplTest.java,Как показано ниже:

SeckillServiceImplTest.javaДля кода, пожалуйста, обратитесь к исходному коду проекта.

Результаты теста:

Метод испытания:public void getSeckillList()

Результаты теста следующие:

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

Далее: 03 Веб-уровень проекта Java с высокой степенью параллелизма