Как правильно писать слой бизнес-логики в spring приложении (целесообразно ли использовать статик методы?)?

Рейтинг: 1Ответов: 1Опубликовано: 20.04.2023

Возьмем простой пример. Есть spring-boot приложение, в нём должен быть web-слой, слой бизнес-логики, слой DAO. Слой DAO - запрос к бд, вполне написан, он возвращает табличные сущности по их id-шникам. То есть, в приложении есть пакет dao. Есть пакет web - там лежат контроллеры, которые отвечают на некоторые запросы. К примеру

@GetMapping("/index")
    public String index() {
         //Здесь некоторый код содержащий бизнес логику
        return "Hello from application"; //Здесь какой-то ответ
    }

Предположим, мне нужно в вышеперечисленный контроллер добавить некоторую логику обработки. Я её выношу в отдельный пакет, условно logic, где делаю запросы к базам данных, через API dao слоя. В этом слое у меня, к примеру, должно быть извлечение двух полей из БД, проверка их на null, проброс исключения если что-то пойдет не так.

Вопрос: нормальным ли будет стиль сделать static методы в слое бизнес-логики в spring приложении? К примеру, добавить класс

   class BusinessLogic{
      public static int getData(){
         //Запросы к DAO
        //Логика обработки
        return 100500; //Возврат оответа,  на основании логики
       }
    }

Подразумевается, что из web-слоя дальше будет вызов:

@GetMapping("/index")
        public String index() {
            BusinessLogic.getData(100500); //Какой-то запрос в слой бизнес-логики
            return "Hello from application"; //Здесь какой-то ответ
        }

Или стандартный стиль для слоя бизнес-логики какой-то другой?

Ответы

▲ 1Принят

В нормальному пути - ваш сервис будет один единственный на все приложение обьект, автоматически созданный синглтон, который помечен аннотацией @Autowired при обьявлении в других классах. И вы методы будете вызывать не разных обьектов - а одного единственного, что практически выглядит так же как Static, учитывая что между запросами состояния не сохраняются - не преесекаются, смысла именно в static нет, не хотите - не пользуйтесь аттрибутами класса.

То есть в контроллере будет так:

@Autowired
BusinessLogic businessLogic // Этот обьект вам не надо инициализировать, просто это обьявление и все. 
//Инициализация происходит автоматически одного обьекта на все приложение

@GetMapping("/index")
        public String index() {
            businessLogic.getData(100500); //Какой-то запрос в слой бизнес-логики
            return "Hello from application"; //Здесь какой-то ответ
        }

А в сервисе так:

@Service
class BusinessLogic{
      public static int getData(){
         //Запросы к DAO
        //Логика обработки
        return 100500; //Возврат ответа,  на основании логики
       }
    }