Как правильно писать слой бизнес-логики в spring приложении (целесообразно ли использовать статик методы?)?
Возьмем простой пример. Есть 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; //Возврат ответа, на основании логики
}
}